我是靠谱客的博主 迷路麦片,最近开发中收集的这篇文章主要介绍JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题

因为java的8种基本数据类型中有6种是数字型的,所以他们的包装类都是继承于Object类下的Number类,所以调用以下的方法可以将任意数字型包装类转换成任意数字型基本数据。
数字型包装类的继承树
源码中Integer类中常量的定义以及它的范围

在这里插入图片描述

自动装箱及拆箱问题

比如:
Integer i = 10;
在这里 i 是 Integer类的一个引用,是不能被赋值整型的,在JDK1.5之前编译是会被编译器报错的,在JDK1.5之后编译器会自动帮我们装箱和拆箱所以不会报错,其实质是编译器帮我们把 Integer i = 10; 转换成了 Integer i = Integer.valueOf(10); 最后在JVM中看到的就是后面的这种形式,所以能正常运行。
拆箱和装箱一样,比如 :

Integer int1 = Integer.valueOf(10);
int int2 = int1;
这样现在也不会报错,编译时编译器自动帮我们把 int int2 = int1; 改成了 int int2 = int1.intValue();了。

包装类的缓存问题

看一下如下代码:

Integer d1 = 1000;
Integer d2 = 1000;

Integer d3 = 100;
Integer d4 = 100;

System.out.println(d1==d2);

在这里大家都知道应该是false,因为d1和d2是两个对象的引用,这里比较的是他们的引用,也就是对象的地址是不是相同,他们是不同的,所以这里是false。
System.out.println(d1.equals(d2));
这个是比值的所以返回的自然是true。

那么再看一下下面这个,答案输出的竟然是true?!!!
System.out.println(d3==d4);

那么为什么会是这样的呢?
我们知道 Integer d3=100;实际上是 Integer d3 = valueOf(100);
我们可以看一下valueOf()的源码
valueof()源码
可以看到如果传入的整数在[IntegerCache.low, InterCache.high]区间时,会直接返回IntegerCache.cache数组中的元素。那么IntegerCache.low和InterCache.high分别是多少呢?IntegerCache.cache数组中的元素又是多少呢?

low and high and cache
high

cache

可以看到cache数组已经初始化[-128,127],所以如果传入的数是个整数且这个数[-128,127],那么valueOf() 就会直接返回cache数组对于的元素,他们在cache数组中是唯一且不变的,可以看到cache数组是用final修饰的,所以当传入的整数在[-128,127]时,返回的总是cache数组中的同一个地址,所以d3==d4。

下面时整合在一起的代码和运行结果,可以看一下

用法见如下代码:

	public static
void main(String [] args) {
//基本数据类型转为对象
Integer i = new Integer(100); //jdk9以后废弃,还能用
Integer i2 = Integer.valueOf(150); //现在一般用这个
// 包装类对象转为基本数据类型
double d = i2.doubleValue();
// 将字符串庶长子转为包装类对象
Integer i3 = Integer.valueOf("123");
Integer i4 = Integer.parseInt("123");
//将包装类对象转成字符串
String str = i3.toString();
//一些常用的常量
System.out.println(Integer.MAX_VALUE);
//2147483647
System.out.println(Integer.MIN_VALUE);
//-2147483648
//自动装箱
Integer a = 300; // 编译器帮你改成:Integer a = Integer.valueOf(300);
//自动拆箱
int b = a;
// 编译器帮你改成:a.intValue();
//包装类的缓存问题
Integer d1 = 4000;
Integer d2 = 4000;
//当数字在[-128,127]之间的时候,返回缓存数组中的某个元素。
Integer d3 = 123;
Integer d4 = 123;
System.out.println(d1 == d2);
System.out.println(d3 == d4);
System.out.println(d1.equals(d2));
}

代码运行结果如下:
在这里插入图片描述

码字不易,转载请注明出处,谢谢!

最后

以上就是迷路麦片为你收集整理的JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题的全部内容,希望文章能够帮你解决JAVA包装类和基本数据类型的相互转换和自动装箱和拆箱问题以及包装类的缓存问题所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(34)

评论列表共有 0 条评论

立即
投稿
返回
顶部