蹲厕所刷某音的时候看见一个视频,里面说的是他定义了一个Integer a1=100和一个Integer a2=100,让a1=a2输出为true,将数值设为200的时候竟然不相等了。又碰巧之前看见过这个问题,于是就来让自己复习一下。
上面的问题其实就是针对自动装箱和自动拆箱这方面问的,在Java5开始引入了自动装箱/拆箱机制,使得基本数据类型 int 和其对应的包装类 Integer 可以相互转换。
自动装箱指的是将基本类型(int-类似)自动转换成对应的包装类(Integer-类似),例如 Integer i = 100; 其实就是执行了 Integer i = Integer.valueOf(100); 会调用valueOf方法。
自动拆箱指的就是将包装类自动转换成对应的基本类型,例如 int t = i; 实际上执行了int t = i.intValue(); 会调用包装类对象的xxxValue方法(xxx表示对应的基本数据类型)。
OK重点!(敲黑板)!而对于自动装箱,Integer 类内部会对 -128 到 127 之间的整数进行缓存。当创建新的 Integer 对象时,如果值在这个范围内,并且这个范围已存在对象,那么返回这个对象(地址),不需要再创建新的对象(把旧的拿过来用)。不在范围内就去创建新的Integer对象。
需要注意,若是使用 == 比较两个Integer对象时,比较的是他们的引用(内存地址)。如果要比较两个值是否相等,应该使用的时 equals 方法。而比较基本数据类型的变量值是否相等时,可以使用 ==。此外,Integer 和 int 类型比较时,Integer 会自动拆箱为 int 类型,然后比较 int 的数值。欸额~