目录
前言
一、自动装箱与拆箱(以 Integer 包装类为例)
二、再来看看几个示例
编辑三、Double ,Float 类型亦是如此吗?
前言
小伙伴们大家好,日常使用业务层方面的代码居多,但也不可忘了基本的一些代码格式以及原理,比如最近看到的一种题型,这里就涉及到了自动装箱的基础知识了
Integer i = new Integer(10);
Integer j = 10;
Integer k = 10;
System.out.println(i == j); //false
System.out.println(k == j); //true
一、自动装箱与拆箱(以 Integer 包装类为例)
1、装箱就是自动将基本数据类型转换为包装器类型( int >> Integer),调用Integer.valueOf(int )方法
2、拆箱就是反过来,将包装器类型转换为基本数据类型,调用了Integer.intValue方法
3、java并不是一开始就支持自动拆装,查了下是在Java SE5之后才支持该功能
自动装箱之后写法对比
Java SE5之前:Integer i = new Integer(10);
Java SE5之后:Integer i = 10;
二、再来看看几个示例
1.比如前言中提到的 i 和 j 为什么不相等?
Integer i = new Integer(10)
创建了一个新的Integer对象,而Integer j = 10; 则会自动装箱,实际上会调用Integer Integer j = 10
实际上进行了装箱操作,相当于调用了Integer.valueOf(10)
而由于10在缓存范围内,因此会复用缓存中的对象。
i和j虽然表示的是相同的值,但是i和j指向的是不同的对象,所以表达式 i == j 的结果是false
2.通过new 关键字生成的Integer对象比较
Integer i = new Integer(127);
Integer j = new Integer(127);
System.out.println(i == j); //false
i
和j
分别是通过new Integer(127)
创建的两个不同的对象,会被强制创建为新的对象,而不是从缓存中获取。即使值相同,但它们在内存中的位置不同,因此比较i == j
会返回false
。
3.Integer.valueOf 方法缓存的对象大小区间
Integer k = 10;
Integer l = Integer.valueOf(10);
Integer l1 = Integer.valueOf(128);
System.out.println(k == l); //true
System.out.println(k == l1); //false
Integer k = 10;
Integer l = Integer.valueOf(10);
这两行代码执行时,都会将值为10的整数赋给Integer对象。在Java中,对于数值范围在-128到127之间的整数,会被缓存起来,所以当你比较
k == l
时,因为10在缓存范围内,它们实际上指向的是同一个对象,所以返回true。而当比较
k == l1
时,因为128不在缓存范围内,所以Integer.valueOf(128)
会创建一个新的Integer对象,与Integer k = 10;
创建的对象不同,因此返回false。
来看下 Integer.valueOf 方法内部 ,制定了数值范围如果是在[-128,127]之间,返回IntegerCache缓存中已经存在的对象的引用,否则创建一个新的 Integer对象,所以k 和 l 指向的是同一个对象,k 和 l1 分别指向不同的对象
三、Double ,Float 类型亦是如此吗?
Double i = 10.0;
Double j = 10.0;
Float i1 = 10.0f;
Float j1 = 10.0f;
Long i2 = 10l;
Long j2 = 10l;
System.out.println(i == j); //false
System.out.println(i1 == j1); //false
System.out.println(i2 == j2); //true
通过结果可以看出,Long 类型之外的都没有缓存的功能
因为为了性能和内存的考虑,只对整数类型的包装类(如Integer、Long等)进行了缓存优化,而没有对浮点数类型的包装类(如Float、Double等)进行缓存,具体分为以下几点。
- 整数类型的范围相对较小,而且常常被使用到,因此缓存能够显著提高性能。
- 整数类型的对象在程序中经常被频繁使用,缓存能够减少内存的占用和对象的创建次数。
- 对于浮点数类型,范围更广,而且通常不像整数类型那样被频繁使用。缓存这些类型可能会导致内存开销过大,而且由于浮点数的精度和计算方式的特殊性,可能会引入更多的问题而不是性能提升。
四、章末
好了,文章到这里就结束了~