Java中1000==1000为false而100==100为true?

总结:

在Integer.java类中,会发现有一个内部私有类IntegerCache,它缓存了从-128到127之间的所有的整数对象。
如数值的范围在-128-127之间都是从高速缓存返回实例的。int类型的数据比较值一样,肯定是true,Integer比较肯定是false。
使用缓存可以提高效率,减少内存的占用,因为小整数会比大整数使用频率高。

详情说明:

public class Test {
public static void main(String[] args) {
Integer a = 1000,b=1000;
System.out.println(a == b); //false
Integer c = 100,d=100;
System.out.println(c == d); //true
}
}

如果把==换成equals,那么结果都是true

基本知识:如果两个引用对象指向同一个对象,用==表示他们是相等的。如果两个引用指向不同的对象,用==表示他们是不相等,即使他们的内容相同。

原因分析:在Integer类中有一个内部私有类IntegerCache,它的缓存是从-128-127之间的所有整数对象。---->就说明所有的小整数在内部缓存。

所以:Integer c = 100 等价于Integer c =Integer.valueOf(100)

public static Integer valueOf(int i) {

if (i >= IntegerCache.low && i

return IntegerCache.cache[i + (-IntegerCache.low)];

return new Integer(i);

}

如数值的范围在-128-127之间都是从高速缓存返回实例的。---所以指向同一个对象。

那么为什么需要缓存呢?

因为此范围内的整数的使用率比较高。使用相同的底层对象是有代价的,可以减少潜在的内存占用。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,802评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,080评论 19 139
  • 1.ios高性能编程 (1).内层 最小的内层平均值和峰值(2).耗电量 高效的算法和数据结构(3).初始化时...
    欧辰_OSR阅读 29,671评论 8 265
  • 你是否拿着手机却不知该找谁聊天,也没有人给你发信息。知道你聊天软件为什么那么安静吗? 因为你曾经为了一个人淡了所有...
    小生很想你阅读 150评论 0 2
  • 1.将数据传递到要跳转到的页面 (1)push()要将新页面推送到堆栈,可使用push方法。同时也可以通过将数据传...
    ceido阅读 3,922评论 0 5