码迷,mamicode.com
首页 > 其他好文 > 详细

代码片段-小题大趣“==”符的使用

时间:2016-07-20 09:11:53      阅读:173      评论:0      收藏:0      [点我收藏+]

标签:

  今天下大雨,没有车的我决定晚点去上班。先看一段代码:

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

  想想你的JAVA知识,输出结果是?

  公布下答案, 运行代码,我们会得到 false true。我们知道==比较的是两个对象的引用,这里的abcd都是新建出来的对象,按理说都应该输出false才对。这就是这段代码的有趣之处。原理其实很简单,我们去看下Integer.java这个类就了然了。

  

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。

代码片段-小题大趣“==”符的使用

标签:

原文地址:http://www.cnblogs.com/saga5998/p/5686984.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!