营销型企业网站的策划方案,一个企业该如何进行网络营销,酒类网站该怎么做,网页设计 网站文章目录 1.前言2. 源码解析3.总结 1.前言 相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题#xff0c;下面这道题目大家应该不陌生#xff1a; Integer i 127;
Integer j 127;Integer m 128;
Integer n 128;System.out.println(i j); // 输出为 true
System.o… 文章目录 1.前言2. 源码解析3.总结 1.前言 相信大家职业生涯中或多或少的碰到过Java比较变态的笔试题下面这道题目大家应该不陌生 Integer i 127;
Integer j 127;Integer m 128;
Integer n 128;System.out.println(i j); // 输出为 true
System.out.println(m n); // 输出为 false那么为什么i j为truem n为false下面我们来分析一下
2. 源码解析 从上述代码中可以看出Integer类中定义了一个私有的int value字段用于存储整数的值。另外还有一个静态的valueOf方法用于获取一个Integer对象该方法内部通过判断传入的值是否在-128到127范围内如果在这个范围内会直接使用缓存中的对象。
接下来我们来分析题目中的情况
Integer i 127;
Integer j 127;
Integer m 128;
Integer n 128;System.out.println(i j); // 输出为 true
System.out.println(m n); // 输出为 false首先我们知道Java对于-128到127之间的整数会进行缓存即Integer.valueOf()方法返回的是缓存中的对象而不是新创建的对象。这就解释了为什么i j为true因为它们都是缓存中的同一个对象。
但是对于m和n它们的值是128超出了缓存范围所以Integer.valueOf()方法会创建新的Integer对象因此m n为false它们是不同的对象。
3.总结
这个现象是由于Java对小整数进行了缓存优化避免了频繁创建新的Integer对象提高了性能。但是要注意这种缓存机制只对-128到127之间的整数有效超出这个范围的整数仍然会创建新的对象。在比较Integer对象时最好使用equals方法而不是以确保比较的是值而不是引用。