Integer自动装箱拆箱bug,创建对象在-128到127

1

public class Demo3 {
	public static void main(String[] args) {
		Integer a = 1;
		Integer b = 2;
		Integer c = 128;
		Integer d = 128;
		Integer e = 321;
		Integer f = 321;
		Long g = 3L;
		System.out.println(System.identityHashCode(c));	//366712642
		System.out.println(System.identityHashCode(d));	//1829164700

		// 实际上在我们用Integer a = 数字;来赋值的时候Integer这个类是调用的public static Integer
		// valueOf(int i)这个方法。
		// public static Integer valueOf(int i) {
		// if(i >= -128 && i <= IntegerCache.high)
		// return IntegerCache.cache[i + 128];
		// else
		// return new Integer(i);
		// }
		// 我们来看看ValueOf(int
		// i)的代码,可以发现他对传入参数i做了一个if判断。在-128<=i<=127的时候是直接用的int原始数据类型,而超出了这个范围则是new了一个对象。我们//知道"=="符号在比较对象的时候是比较的内存地址,而对于原始数据类型是直接比对的数据值。那么这个问题就解决了。
		// 至于为什么用int型的时候值会在-128<=i<=127范围呢呢?我们知道八位二进制的表示的范围正好就是-128到127。大概就是因为这吧。

		System.out.println(c == d);// false
		System.out.println(e == f);// false
		System.out.println(c == (a + b));// false
		System.out.println(c.equals(a + b));// false
		System.out.println(g == (a + b));// true
		System.out.println(g.equals(a + b));// false 类型不一样

	}
}

  

时间: 2024-11-03 01:37:56

Integer自动装箱拆箱bug,创建对象在-128到127的相关文章

[Java5新特性]自动装箱/拆箱

自动装箱/拆箱概述 Java中具有基本类型(int,double,float,long,boolean,char,byte,short)和基本类型包装类(Integer,Double,Float,Long,Boolean,Char,Byte,Short),我们实现基本类型与包装类之间的转换基本有两种方式: 一种为JDK5之前的方式,比如Integer i = Integer.valueof(5);(这里5为基本类型int,Integer包装类利用valueof()方法将其转换为Integer类型

java自动装箱拆箱总结

对于java1.5引入的自动装箱拆箱,之前只是知道一点点,最近在看一篇博客时发现自己对自动装箱拆箱这个特性了解的太少了,所以今天研究了下这个特性.以下是结合测试代码进行的总结. 测试代码: int a = 1; Integer b = 1; Integer c = 1; Integer d = 2; Integer e = 3; Integer f = 128; Integer g = 128; Long h = 3L; Double m = 4.0; Double n = 4.0; Float

基本类型包装类、自动装箱拆箱

基本类型包装类 public class Demo03 { public static void main(String[] args) { //字符串转基本数据类型 String str="12"; int strint=Integer.parseInt(str); System.out.println(strint+1);  //13 String s2="2.3"; double dou=Double.parseDouble(s2); System.out.p

Integer自动装拆箱

public static void main(String[] args) { Integer a1 = 1; Integer a2 = 1; Integer b1 = 127; Integer b2 = 127; Integer c1 = 128; Integer c2 = 128; Integer d1 = 321; Integer d2 = 321; System.out.println(a1 == a2); System.out.println(b1 == b2); System.ou

自动装箱拆箱(Autoboxing,Unboxing)

自动装箱和拆箱 https://docs.oracle.com/javase/tutorial/java/data/autoboxing.html 1.5才有(Autoboxing,Unboxing) 自动装箱(Autoboxing)是java编译器在java基本类型和对应的对象包装类型上做的自动转换 自动装箱如int转成Integer,double转成Double 拆箱(Unboxing)Double转double 例子: ` List list=new ArrayList(); list.a

黑马程序员——【Java高新技术】——JDK1.5新特性:静态导入、可变参数、增强型for循环、自动装箱拆箱、枚举

一.静态导入 1.import和import static区别: (1)import 是导入一个类或某个包中所有的类. (2)import static是导入一个类中的某个静态方法或所有的静态方法. 注:在调用静态导入的类的静态方法时,可以不用再写类名.如Arrays.sort(int[])可以直接写sort(int[]); 2.静态导入的写法: (1)import static java.util.Arrays.*;   表示导入Arrays类中的所有静态成员. (2)import stati

自动装箱拆箱

在需要的情况下,基本类型与包装类型可以通用.有些时候我们必须使用引用数据类型时,可以传入基本数据类型.基本类型可以使用运算符直接进行计算,但是引用类型不可以.而基本类型包装类作为引用类型的一种却可以计算,原因在于,Java”偷偷地”自动地进行了对象向基本数据类型的转换. 相对应的,引用数据类型变量的值必须是new出来的内存空间地址值,而我们可以将一个基本类型的值赋值给一个基本类型包装类的引用.原因同样在于Java又”偷偷地”自动地进行了基本数据类型向对象的转换. 自动拆箱:对象转成基本数值 自动

Java自动装箱拆箱

一.装箱.拆箱定义 如果一个int型量被传递到需要一个Integer对象的地方,那么,编译器将在幕后插入一个对Integer构造方法的调用,这就叫做自动装箱.而如果一个Integer对象被放到需要int型量的地方,则编译器将幕后插入一个队intValue方法的调用,这就叫做自动拆箱. public static void main(String[] args) { // 装箱 Integer i1 = Integer.valueOf(1); // 自动装箱 Integer i2 = 1;// 默

JDK5.0新特性-自动装箱/拆箱

lJDK5.0的语法允许开发人员把一个基本数据类型直接赋给对应的包装类变量, 或者赋给 Object 类型的变量,这个过程称之为自动装箱. l自动拆箱与自动装箱与之相反,即把包装类对象直接赋给一个对应的基本类型变量. l典型应用: List list = new ArrayList(); list.add(1); int j = (Integer)list.get(0); package cn.itcast.autobox; import java.util.ArrayList; import