• 奇怪的Java题:为什么1000 == 1000返回为False,而100 == 100会返回为True?


    如果你运行如下代码:

    1
    2
    3
    4
    Integer a = 1000, b = 1000
    System.out.println(a == b);//1
    Integer c = 100, d = 100
    System.out.println(c == d);//2

    你会得到以下运行结果:

    1
    2
    false
    true

    我们知道,如果两个引用指向同一个对象,那么==就成立;反之,如果两个引用指向的不是同一个对象,那么==就不成立,即便两个引用的内容是一样的。因此,结果就会出现false。

    这是非常有趣的地方。如果你查看Integer.java类,你会找到IntegerCache.java这个内部私有类,它为-128到127之间的所有整数对象提供缓存。

    这个东西为那些数值比较小的整数提供内部缓存,当进行如此声明时:

    1
    Integer c = 100;

    它的内部就是这样的:

    1
    Integer i = Integer.valueOf(100);

    如果我们观察valueOf()类函数,我们可以看到

    1
    2
    3
    4
    5
    public static Integer valueOf(int i) {
          if (i >= IntegerCache.low && i
              return IntegerCache.cache[i + (-IntegerCache.low)];
          return new Integer(i);
        }

    如果值在-128到127之间,它就会返回该缓存的实例。

    因此。。。

    1
    Integer c = 100, d = 100;

    两者指向同样的对象。

    这就是为什么这段代码的结果为true了:

    1
    System.out.println(c == d);

    现在你可能会问,为什么会为-128到127之间的所有整数设置缓存?

    这是因为在这个范围内的小数值整数在日常生活中的使用频率要比其它的大得多,多次使用相同的底层对象这一特性可以通过该设置进行有效的内存优化。你可以使用reflection API任意使用这个功能。

    运行下面的这段代码,你就会明白它的神奇所在了。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    public static void main(String[] args) throws NoSuchFieldException, IllegalAccessException {
      
          Class cache = Integer.class.getDeclaredClasses()[0]; //1
          Field myCache = cache.getDeclaredField("cache"); //2
          myCache.setAccessible(true);//3
      
          Integer[] newCache = (Integer[]) myCache.get(cache); //4
          newCache[132] = newCache[133]; //5
      
          int a = 2;
          int b = a + a;
          System.out.printf("%d + %d = %d", a, a, b); //
        }
  • 相关阅读:
    HTML 5 音频
    HTML 5 视频
    HTMl链接- target/ name
    HTML 链接
    OGNL_一点
    struts_表单得到数据
    MySql_十六进制值
    HTML 事件属性(下)
    作业3-2 输入一个正整数 n,再输入 n 个学生的成绩,计算平均成绩,并统计所有及格学生的人数
    作业3-1 .输入一个整数 x,计算并输出下列分段函数 sign(x) 的值
  • 原文地址:https://www.cnblogs.com/tuojunjie/p/6369367.html
Copyright © 2020-2023  润新知