Aug 03, 2018
关于java一些零零散散的点(一)
==与equals()
- 对于
==
- 比较
基本数据类型
时,比较的是值
- 比较
对象
时,比较的是两个对象的地址
- 比较
- 对于
equals()
equals()
方法存在于Object
类中Object
类是所有类的直接或间接父类
Object
类中equals()
方法底层依赖的是==
号没有重写
equals()方法的类中,equals()
与==
号的效果一样,即比较对象地址重写
后的equals()方法以实际为准,但一般都是比较两个对象的值
整型缓存问题
先来看一下代码
1 | public static void main(String... strings) { |
我们知道对于对象
==比较的是对象的引用地址
,由此可能会认为以上代码输出的都是false
然鹅,结果是
1 | true |
原因在于由 Java 5 开始,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。
- 上面的规则适用于整数区间
-128
到+127
,当然这两个值是默认值,可以修改。 - 这种 Integer 缓存策略
仅
在自动装箱
的时候有用,使用构造器
创建的 Integer 对象不能
被缓存。
自动装箱:Java 编译器把原始类型
自动
转换为封装类
的过程
称为自动装箱,这相当于调用 valueOf
方法
我们可以看一下Integer
类中的valueOf
方法
1 | public static Integer valueOf(int i) { |
可以看到在返回Integer对象前会在缓存中查找,已有的直接返回,找不到再实例化一个对象。
扩展
- 整型数据的缓存范围可以通过
JVM
参数-XX:AutoBoxCacheMax=size
调整 - 这种缓存行为不仅适用于Integer对象。我们针对所有整数类型的类都有类似的缓存机制。
ByteCache
用于缓存Byte
对象ShortCache
用于缓存Short
对象LongCache
用于缓存Long
对象CharacterCache
用于缓存Character
对象
-Byte
,Short
,Long
有固定范围:-128
到127
。
Character
, 范围是0
到127
。- 除了
Integer
可以通过参数改变范围外,其它的都不行。