Integer 类缓存== 和 equals

Integer 类缓存== 和 equals
对于 Integer var = ? 在-128 至 127 范围内的赋值, Integer 对象是在IntegerCache.cache 产生,会复用已有对象,这个区间内的 Integer 值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象。
由于在Integer的源码实现中,Integer 把-128-127 之间的每个值都建立了一个对应的Integer 对象放入了一个数组中,这里的数组类似于缓存(“Integer常量池”),提前给你准备好这个范围内的对象。由于Integer 是不可变类,因此这些缓存的Integer 对象可以安全的重复使用。

本质上来说,==和equals比较的都是地址,但是,和String相似,对于equals方法,Integer里面的equals方法重写了Object的equals方法,查看Integer源码可以看出equals方法进行的是数值比较。当然,equals()是一个方法,基本数据类型是无法调用的,只有包装类型能进行调用

常量池

在java中用于保存编译期已经确定的,它包括了关于类,方法,接口中的常量,也包括字符串常量。例如

String s = “Java” 这种声明的方式。产生的这种"常量"就会被放到常量池,常量池是JVM的一块特殊的内存空间。
使用Java常量池技术,是为了方便快捷地创建某些对象,当你需要一个对象时候,就去这个池子里面找,找不到就在池子里面创建一个。
java中基本类型的包装类的大部分都实现了常量池技术,这些类是Byte、Short、Integer、Long、Character、Boolean,另外两种浮点数类型的包装类则没有实现。另外Byte、Short、Integer、Long、Character这5种整型的包装类也只是在对应值小于等于127时才可使用对象池,超过了就要申请空间创建对象了。
注意:如果对象是用new 创建的,那么不管是什么对像,它是不会放到池子里的,而是向堆申请新的空间存储。

相关文章: