简介: Integer 是 Java 常用类, 关于它的面试题层出不穷, 在这里总结一下.
1.Integer 和 int 的区别和联系?
1.int 是基本数据类型, 缺省值为 0, 占内存 4 个字节.
2.Integer 是引用类型, 缺省值为 null.
3.Integer 和 int 之间相互转换存在自动拆装箱的过程.
2. 代码如下
- public static void main(String[] args) {
- Integer a = 200;
- Integer b = 200;
- System.out.println(a == b);
- System.out.println(a.equals(b));
- }
上述程序执行的结果:
false
true
解析: Integer 默认的数字缓存区间为 - 128~127[a], 当数字在这个区间的时候, Integer a = 200; 直接从 IntegerCache 中读取数据, 不会创建新的对象 (类似于字符串常量池), 如果超出这个区间[a] 就会构造新的 Integer 对象."==" 是引用比较,"equals" 是对象的值比较(Integer 重写了 equals 方法),a,b 是不同的对象,== 比较为 false, 他们的值相同都为 200,equals 为 true.
重点
特例: 上述执行程序可能会有相反的结果, System.out.println(a == b)也可能为 true.
解析:
可以通过修改 JVM 启动参数修改 IntegerCache 上限(-XX:AutoBoxCacheMax=250),Java 进程启动时, 会加载 rt.jar 这个核心包, rt.jat 里面的 Integer 自然也被加载到 JVM 中, Integer 中有个 IntegerCache 缓存, 描述如下:
IntegerCache 有一个静态代码块, JVM 在加载这个类的时候会优先加载静态代码块. 当 JVM 进程启动完毕后 - 128~127 之间的数字就会被缓存起来, 调用 valueOf 方法的时候, 如果是在这个区间的数字直接从缓存中取, 超过这个范围就只能构造新的 Integer 对象.
注意
使用 Oracle/Sun JDK 6, 在 server 模式下, 使用 - XX:AutoBoxCacheMax=NNN 参数即可将 Integer 的自动缓存区间设置为[-128,NNN], 下边界固定为 - 128, 不可配置.
在设置了 - XX:+AggressiveOpts 启动参数后, AutoBoxCacheMax 的默认值会被修改为 20000 并且生效.
这篇文章主要是记录第二个面试, 顺便回忆一下 Integer 和 int 的区别.
来源: https://juejin.im/post/5c6698b6f265da2da23d17a8