java cron工具类_Java工具类之:包装类

我们都知道,JDK 其实给我们提供了很多很多 Java 开发者已经写好的现成的类,他们其实都可以理解成工具类,比如我们常见的集合类,日期相关的类,数学相关的类等等,有了这些工具类,你会发现它能很大程度的帮你节省时间,能很方便的实现你的需求。当然,没有这些包,你也能实现你的需求,但是你需要时间,今天我们主要是来学习一下包装类。

27b1435de3052affdba6477c573f7f8d.png

一、包装类介绍

1、为什么需要包装类?

我们知道 Java 语言是一个面向对象的编程语言,但是 Java 中的基本数据类型却不是面向对象的,但是我们在实际使用中经常需要将基本数据类型转换成对象,便于操作,比如,集合的操作中,这时,我们就需要将基本类型数据转化成对象,所以就出现了包装类。

2、包装类是什么呢?

包装类,顾名思义就是将什么经过包装的类,那么是将什么包装起来的呢,显然这里是将基本类型包装起来的类。包装类的作用就是将基本类型转成对象,将基本类型作为对象来处理。

Java 中我们知道,基本数据类型有8个,所以对应的包装类也是8个,包装类就是基本类型名称首字母大写。但Integer 和 Character 例外,它们显示全称,如下面表格所示:

基本数据类型对应包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean

27b1435de3052affdba6477c573f7f8d.png

二、包装类的继承关系

通过阅读 Java8 的 API 官方文档或者看源代码我们可以得知8个包装类的继承关系如下:

1c5b8d4634d99be6b25d0cd09058590b.png

通过以上的继承关系图,我们其实可以这样记忆,包装类里面有6个与数字相关的都是继承自 Number 类,而其余两个不是与数字相关的都是默认继承 Object 类。通过看 API 官方文档,我们还可以得知这8个包装类都实现了Serializable , Comparable 接口。比如下图的 Integer 类

public final class Integer extends Number implements Comparable<Integer> {}

27b1435de3052affdba6477c573f7f8d.png

三、包装类的使用方法(基本操作)

接下来关于包装类的讲解我就讲Integer包装类,其他的都依此类推,用法和操作都是差不多的,只是名字不一样而已。

1、包装类的构造方法

8个包装类都有带自己对应类型参数的构造方法,其中8个包装类中除了Character还有构造方法重载,参数是String类型的。

Integer one = new Integer(666);Integer two = new Integer("666");

2、包装类的自动拆装箱

在了解自动拆装箱之前,我们得先知道什么是拆箱和装箱。其实拆装箱主要应对基本类型与包装类型的相互转换问题。

  • **装箱:**将基本类型转换成包装类型的过程叫做装箱。
  • **拆箱:**将包装类型转换成基本类型的过程叫做拆箱。

其实,在 JDK1.5 版本之前,是没有自动拆装箱的,开发人员要手动进行装拆箱:

//手动装箱,也就是将基本类型10转换为引用类型
Integer integer = new Integer(10);
//或者
Integer integer1 = Integer.valueOf(10);
//手动拆箱,也就是将引用类型转换为基本类型
int num = integer.intValue();

而在在 JDK1.5 版本之后,为了减少开发人员的工作,提供了自动装箱与自动拆箱的功能。实现了自动拆箱和自动装箱,如下方代码所示:

//自动装箱
Integer one = 1;
//自动拆箱
int two = one + 10;

其实以上两种方式本质上是一样得,只不过一个是自动实现了,一个是手动实现了。至于自动拆装箱具体怎么实现的我这里不做深入研究。

27b1435de3052affdba6477c573f7f8d.png

四、包装类的缓存机制

我们首先来看看以下代码,例1:

public static void main(String[] args) {Integer i1 = 100; Integer i2 = 100; Integer i3 = new Integer(100);Integer i4 = new Integer(100);System.out.println(i1 == i2);
//true  System.out.println(i1 == i3);
//false  System.out.println(i3 == i4);
//false  System.out.println(i1.equals(i2));
//true  System.out.println(i1.equals(i3));
//true  System.out.println(i3.equals(i4));
//true
}

当我们修改了值为200的时候,例2:

public static void main(String[] args) {  
Integer i1 = 200; Integer i2 = 200; Integer i3 = new Integer(200); Integer i4 = new Integer(200);  
System.out.println(i1 == i2);
//false  System.out.println(i1 == i3);
//false  System.out.println(i3 == i4);
//false  System.out.println(i1.equals(i2));
//true  System.out.println(i1.equals(i3));
//true  System.out.println(i3.equals(i4));
//true
}

通过上面两端代码,我们发现修改了值,第5行代码的执行结果竟然发生了改变,为什么呢?首先,我们需要明确第1行和第2行代码实际上是实现了自动装箱的过程,也就是自动实现了 Integer.valueOf 方法,其次,==比较的是地址,而 equals 比较的是值(这里的 eauals 重写了,所以比较的是具体的值),所以显然最后五行代码的执行结果没有什么疑惑的。既然==比较的是地址,例1的第5行代码为什么会是true呢,这就需要我们去了解包装类的缓存机制。

其实看Integer类的源码我们可以发现在第780行有一个私有的静态内部类,如下:

private static class IntegerCache {  static final int low = -128;   static final int high;  static final Integer cache[];static {  // high value may be configured by property    int h = 127;    String integerCacheHighPropValue =   sun.misc.VM.getSavedProperty("java.lang.Integer.IntegerCache.high");  if (integerCacheHighPropValue != null) {  try {             int i = parseInt(integerCacheHighPropValue);   i = Math.max(i, 127);         // Maximum array size is Integer.MAX_VALUE    h = Math.min(i, Integer.MAX_VALUE - (-low) -1);         } 
catch( NumberFormatException nfe) {  // If the property cannot be parsed into an int, ignore it.      }     }      high = h;cache = new Integer[(high - low) + 1];     int j = low;     for(int k = 0; k < cache.length; k++)       cache[k] = new Integer(j++);// range [-128, 127] must be interned (JLS7 5.1.7)      assert IntegerCache.high >= 127;   }private IntegerCache() {
}
}

我们知道,静态的内部类是在整个 Integer 加载的时候就已经加载完成了,以上代码初始化了一个 Integer 类型的叫 cache 的数组,取值范围是[-128, 127]。缓存机制的作用就是提前实例化相应范围数值的包装类对象,只要创建处于缓存范围的对象,就使用已实例好的对象。从而避免重复创建多个相同的包装类对象,提高了使用效率。如果我们用的对象范围在[-128, 127]之内,就直接去静态区找对应的对象,如果用的对象的范围超过了这个范围,会帮我们创建一个新的 Integer 对象,其实下面的源代码就是这个意思:

public static Integer valueOf(int i) { if (i >= IntegerCache.low && i <= IntegerCache.high)   return IntegerCache.cache[i + (-IntegerCache.low)];  return new Integer(i);
}

所以 例1 代码里,i1 和i2 是100,值的范围在[-128, 127],所以直接区静态区找,所以i1和i2指向的地址是同一个,所以 i1==i2;而在例2的代码里,i1 和i2 是200,值的范围不在在[-128, 127],所以分别创建了一个新的对象,放在了堆内存里,各自指向了不同的地址,所以地址都不同了,自然 i1 不等于 i2。

通过分析源码我们可以发现,只有 double 和 float 的自动装箱代码没有使用缓存,每次都是 new 新的对象,其它的6种基本类型都使用了缓存策略。使用缓存策略是因为,缓存的这些对象都是经常使用到的(如字符、-128至127之间的数字),防止每次自动装箱都创建一次对象的实例。

27b1435de3052affdba6477c573f7f8d.png

五、包装类和基本数据类型的区别

  • 默认值不同

包装类的默认值是null,而基本数据类型是对应的默认值(比如整型默认值是0,浮点型默认值是0.0)

  • 存储区域不同

基本数据类型是把值保存在栈内存里,包装类是把对象放在堆中,然后通过对象的引用来调用他们

  • 传递方式不同

基本数据类型变量空间里面存储的是值,传递的也是值,一个改变,另外一个不变,而包装类属于引用数据类型,变量空间存储的是地址(引用),传递的也是引用,一个变,另外一个跟着变。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/385950.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

mysql数据库安装,真香!

Spring Security观后感——手绘思维脑(供参考) 手绘的思维导图&#xff0c;是我自己根据自身的情况读完这套阿里出品的Spring Security王者晋级文档之后所绘的&#xff0c;相当于是一个知识的总结与梳理&#xff0c;我将其分为“核心组件”与“工作原理/认证流程”。 Spring Se…

mysql数据库实用教程答案

前言 数据库相关的面试题早已成为了一线互联网大厂面试的家常菜&#xff0c;如果你对数据库不太熟悉&#xff0c;我劝你不要轻易面试大厂。那么&#xff0c;为什么数据库成了大厂面试的家常菜呢&#xff1f;主要原因当然还是海量数据。 无论对于刚入行的小白还是有几年Java开…

在idea中新建的text文件_开发属于自己的第一款 IDEA 插件!

往期热门文章&#xff1a;1、《往期精选优秀博文都在这里了&#xff01;》2、又一个程序员跑路删库跑路被抓了&#xff0c;导致服务器瘫痪 36 个小时!3、恕我直言&#xff0c;有了这款 IDEA 插件&#xff0c;你可能只需要写 30% 的代码。。。4、Java8 的 Stream API 的确牛X&am…

mysql数据库开发的36条军规

前言 一般的小项目&#xff0c;比如几百人左右访问的项目&#xff0c;访问量几万的项目&#xff0c;如果想用缓存&#xff0c;单机实例完全够用。小黄图就是用的阿里云256MB配置的Redis缓存&#xff0c;日几千的访问量是妥妥够用的了。Redis号称可以支撑10wqps&#xff0c;当然…

mysql数据库引擎怎么看,值得收藏!

什么是Service Mesh 作为Service Mesh技术探索和实践的先行者&#xff0c;全球第一个真正的Service Mesh项目Linkerd负责人、Buoyant公司创始人兼CEO William Morgan第一次完整地阐述了Service Mesh。按照William Morgan的定义&#xff0c;Service Mesh是一个致力于解决服务间…

mysql数据库文件位置

01 前言 辛苦奋斗两个月&#xff0c;秋招终于圆满收官&#xff0c;拿到了头条、字节、菜鸟、腾讯、网易的offer&#xff0c;这要多亏了意外得到的这份资料文档&#xff0c;这么多面试全都靠它了&#xff0c;哈哈~~有好东西还是要分享出来给大家&#xff0c;一起学习呀 Java核心…

mysql数据库连接失败,挑战大厂重燃激情!

一、阿里 &#xff08;会员中台&#xff09; 1. Java 重写hashcode()是否需要重写equals()&#xff0c;不重写会有什么后果 2. 并发 自旋锁和阻塞锁的区别公平锁和非公平锁的区别jdk中哪种数据结构或工具可以实现当多个线程到达某个状态时执行一段代码栅栏和闭锁的区别如何…

mysql 链式查询_MySQL的链接查询

内连接 inner join ....on...../join ....on... &#xff1a;将两个表中同时符合on条件的记录查询出来 inner可以省略select *from person inner join card on person.cardidcard.cardid;外连接 分为左连接、右连接&#xff0c;完全连接左连接&#xff1a;left join ....on…

大厂必备!不断提升自己创造溢价的能力

前言: 金九银十过了金三银四还会远嘛&#xff0c;本文后面分享面试题给正准备跳槽&#xff0c;准备找工作的你&#xff0c;这次面试字节跳动也是做了很多的准备&#xff0c;还好顺利拿到了offer&#xff0c;特分享一下这次的4面技术面真题&#xff0c;可能有些记不全了&#x…

MySQL安装板多少钱_MySQL安装板怎么安装

展开全部1首先&#xff0c;你需要个安装包&#xff0c;自个去下0如何在官网下载MySQL 数据库2第一步中&#xff0c;选择32313133353236313431303231363533e58685e5aeb931333365666165I accept license term,然后Next3默认选第一项Developer Default ,然后Next4这一步中&#xf…

大厂必备!阿里、字节跳动、京东、腾讯、小米等名企高频面试

一、前言 k8s全称kubernetes&#xff0c;是目前大热的一个可移植容器的编排管理工具&#xff0c;像AWS、Azure、Google、阿里云、腾讯云等主流的公有云提供的都是基于k8s的容器服务&#xff0c;很多其他厂商也在努力跟进中&#xff0c;所以说“kubernetes”是目前容器行业中最…

大厂架构师经验分享!成功跳槽字节跳动

前言 毫不夸张地说&#xff0c;JVM是现代软件工程最成功的案例之一。因为它自带GC&#xff0c;又有无数可以微调的参数&#xff0c;且运行极其稳定可靠&#xff0c;所以&#xff0c;许多厂商的核心业务系统&#xff0c;才敢放心地用Java编写&#xff0c;运行在JVM之上。 近几…

java停车场管理系统程序设计代码_社区养老服务管理系统,java程序设计

登录界面菜单功能界面1菜单功能界面2菜单功能界面3社区养老服务管理系统设计与实现springspringMVCmybatis框架对象(javaBean,pojo)设计&#xff1a;服务工单javaBean创建语句如下&#xff1a;package project.model;import org.springframework.format.annotation.DateTimeFor…

大厂面试必问!50w字+的Java技术类校招面试题汇总

前言 刚刚过去的双十一&#xff0c;让“高性能”“高可用”“亿级”这3个词变成了技术热点词汇&#xff0c;也让很多人再次萌发成为「架构师」的想法。先问大家一个问题&#xff1a;你觉得把代码熟练、完成需求加上点勤奋&#xff0c;就能成为架构师么&#xff1f;如果你这么认…

c++客户端发送加锁_MySQL语句加锁分析详解

前言建立一个存储三国英雄的hero表&#xff1a;CREATE TABLE hero ( number INT, name VARCHAR(100), country varchar(100), PRIMARY KEY (number), KEY idx_name (name)) EngineInnoDB CHARSETutf8;然后向这个表里插入几条记录&#xff1a;INSERT INTO hero V…

大厂面试必问!如何写出高效率的SQL

前言 Spring框架自2002年诞生以来一直备受开发者青睐&#xff0c;它包括SpringMVC、SpringBoot、Spring Cloud、Spring Cloud Dataflow等解决方案。有人亲切的称之为&#xff1a;Spring 全家桶。 很多研发人员把spring看作心目中最好的java项目&#xff0c;没有之一。所以这是…

accsess转成mysql语句_轻松教你SQL转ACCESS

SQL数据库转access数据库步骤&#xff1a; 1. 建立access数据库&#xff1a;在access中建立access数据库和表&#xff0c;access字段类型与sql中字段类型的对应关系。 2. 在Access中建表是应注意它的保留关键字&#xff1a;比如Password 如果表中的某个字段使用了关键字&#x…

大厂首发:2021年Java工作或更难找

前言 提起MySQL&#xff0c;其实网上已经有一大把教程了&#xff0c;为什么我还要写这篇文章呢&#xff0c;大概是因为网上很多网站都是比较零散&#xff0c;而且描述不够直观&#xff0c;不能系统对MySQL相关知识有一个系统的学习&#xff0c;导致不能形成知识体系。为此我撰…

大厂首发:338页网易Java面试真题解析火爆全网

前言 为什么互联网资讯这么发达&#xff0c;但是没有出现技术人才井喷&#xff1f; 为什么会出现应届生薪资倒挂多年老员工的现象&#xff1f; 这个世界有太多的现象都可以用**“二八定律”**来解释。 20%拿着高工资&#xff0c;80%每天挣扎在增删改查边缘。 职场一分钱一…

mysql 导入dbm文件_DBM数据导入到mysql数据库方法

本文章分享一篇关于DBM数据导入到mysql数据库方法&#xff0c;有需要的同学可以参考一下本实例。首先说明一下&#xff0c;我以前使用PERL&#xff0c;保存文件 用DBM&#xff0c;有5万多条记录&#xff0c;每条记录有15个字段。现在想用MYSQL&#xff0c;要吧记录导过来。第一…