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可以通过参数改变范围外,其它的都不行。