原始类型:boolean,char,byte,short,int,long,float,double;
包装类型:Boolean,Character,Byte,Short,Integer,Long,Float,Double;
上面是比较常见的数据类型;下面说一下int 和Integer的区别吧
Ingeter是int的包装类,Integer变量必须实例化后才能使用,实际是对象的引用,当new一个Integer时,实际上是生成一个指针指向此对象,常自动装箱拆箱;
简单一点说,装箱就是自动将基本数据类型转换为包装器类型;拆箱就是自动将包装器类型转换为基本数据类型
而int则是直接存储数据值 ,int的初值为0,Ingeter的初值为null
Integer s =10; //自动装箱 Integer a1= Integer.valueOf(10)//存在于堆里的对象 s=11;//相当于将s的值指到了11的地址. //自动装箱
integer a=10; int b=a.intValue;//拆箱 Integer c=a+4;//自动装箱和自动拆箱 system.out.println(c);
由上述的代码的到的不同结果,得到了 自动装箱规范要求 : boolean , byte , char <= 127 , 介于 -128 ~ 127 之间的 short 和 int 被包装到固定的对象中 .
所以当 Integer a = 127 , Integer b = 127 时 , a 和 b 被包装到同一个对象中 , 所以 用 == 号判断时, 认为是相等的. 而当等于
128 时,则是分装在两个对象中的 , 自然地址也不会相等 , 所以 == 号 判断结果为 false . 超过128 结果也是一样的 .
所以在比较两个包装类的对象时, 尽量使用 equals 方法 ,这样可以得到你想要的结果 , 使用 == 号容易导致 128陷阱 .
简单来讲就是:在小于127大于-128的时候,自动装箱的是同一个地址存在的数值.大于127时,自动装箱的不是同一个。
这就是所谓的 “128陷阱” .
注:
包装器的存在使得构造的值不能改变.
equals:判断的是两个对象的内容
==判断的是地址是否相同
————————————————
版权声明:本文为CSDN博主「牧 码人」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/qq_38697767/article/details/102383659