黑马程序员技术交流社区

标题: 出场率很高的一道java基础题 [打印本页]

作者: c8984771    时间: 2016-1-1 00:40
标题: 出场率很高的一道java基础题
首先看一段比较有意思的代码
[java] view plaincopy
Integer a = 1000,b=1000;  
Integer c = 100,d=100;    public void mRun(final String name){  
        new Runnable() {  
              
            public void run() {  
                System.out.println(name);  
            }  
        };  
    }  
      
  
System.out.println(a==b);  
System.out.println(c==d);  
如果这道题你能得出正确答案,并能了解其中的原理的话。说明你基础还可以。如果你的答案 是 true 和true的话,你的基础就有所欠缺了。
首先公布下答案, 运行代码,我们会得到 false true。我们知道==比较的是两个对象的引用,这里的abcd都是新建出来的对象,按理说都应该输入false才对。这就是这道题的有趣之处,无论是面试题还是论坛讨论区,这道题的出场率都很高。原理其实很简单,我们去看下Integer.java这个类就了然了。
[java] view plaincopy
public static Integer valueOf(int i) {  
      return  i >= 128 || i < -128 ? new Integer(i) : SMALL_VALUES[i + 128];  
  }  
  
  /**
   * A cache of instances used by {@link Integer#valueOf(int)} and auto-boxing
   */  
  private static final Integer[] SMALL_VALUES = new Integer[256];  
  
  static {  
      for (int i = -128; i < 128; i++) {  
          SMALL_VALUES[i + 128] = new Integer(i);  
      }  
  }  

当我们声明一个Integer c = 100;的时候。此时会进行自动装箱操作,简单点说,也就是把基本数据类型转换成Integer对象,而转换成Integer对象正是调用的valueOf方法,可以看到,Integer中把-128-127 缓存了下来。官方解释是小的数字使用的频率比较高,所以为了优化性能,把这之间的数缓存了下来。这就是为什么这道题的答案回事false和ture了。当声明的Integer对象的值在-128-127之间的时候,引用的是同一个对象,所以结果是true。

作者: 马赛    时间: 2016-1-1 01:33
学习了
作者: 15000183754    时间: 2016-1-1 20:53
谢谢分享!
作者: teng13114    时间: 2016-1-1 21:54
get一个新技能,谢谢分享
作者: Accoss-x    时间: 2016-1-1 22:05
写了一堆没用代码,这其实是byte常量池的作用,因为计算机都是存的字节,所以-128到127会直接取
作者: chengz    时间: 2016-1-1 22:40
学到了。。。
作者: 程程程程程92    时间: 2016-1-1 23:22
感谢 分享
作者: c8984771    时间: 2016-1-2 01:52
Accoss-x 发表于 2016-1-1 22:05
写了一堆没用代码,这其实是byte常量池的作用,因为计算机都是存的字节,所以-128到127会直接取 ...

代码详细点可以帮助我这样的初学者更好的理解,请大神不要见怪
作者: 魏志林    时间: 2016-1-2 09:39
也就是c和d指向同一个地址哟
作者: 凤凰城nash    时间: 2016-1-2 10:37
不错不错
作者: m1415817060    时间: 2016-1-6 00:06
攒攒赞 赞6666666




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2