A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 心弦上的景致 中级黑马   /  2013-4-12 15:37  /  1414 人查看  /  7 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. class IntegerDemo{

  2.         public static

  3. void main(String args

  4. []){
  5.         Integer a = 127;
  6.         Integer b = 127;
  7. System.put.println

  8. (a==b);

  9.         Integer c = 128;
  10.         Integer d = 128;
  11. System.put.println

  12. (c==d);

  13. }
  14.        
  15. }
复制代码
比老师的视频说 因为java新特性对byte数据范围内外数据执行有区别


有木有人用底层的角度帮我分析一下  我知道是为什么运行结果不一样
但是我想了解一下底层执行的区别

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

7 个回复

倒序浏览
首先需要纠正一下你的代码System.put.println是不对的,应该是System.out.println,其次int类型的范围是-128~127,JVM会自动维护八种基本类型的常量池,所以当为Integer a=127时,在自动装箱过程中是取自常量池中的数值,这时候是值类型,同样的值指向同样的引用,而当Integer i=128时,128不在常量池范围内,所以在自动装箱过程中需new 128,这时候就是引用类型了,地址是不一样的,所以地址不一样。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
这就要说到常量池了,JAVA的基本类型有六种(除了Double和Float之外)都实现了常量池, 不过它们只在大于等于-128并且小于等于127时才会使用常量池。
我们通过分析Integer的Integer.valueOf()方法便能清楚的看出来原因了。
  1. public static Integer valueOf(int i) {  
  2.     if(i >= -128 && i <= IntegerCache.high)  
  3.         return IntegerCache.cache[i + 128];  
  4.     else  
  5.         return new Integer(i);  
  6. }  

  7. private static class IntegerCache {  
  8.     static final int high;  
  9.     static final Integer cache[];  
  10.   
  11.     static {  
  12.         final int low = -128;  
  13.   
  14.         // high value may be configured by property   
  15.         int h = 127;  
  16.         if (integerCacheHighPropValue != null) {  
  17.             // Use Long.decode here to avoid invoking methods that   
  18.             // require Integer's autoboxing cache to be initialized   
  19.             int i = Long.decode(integerCacheHighPropValue).intValue();  
  20.             i = Math.max(i, 127);  
  21.             // Maximum array size is Integer.MAX_VALUE   
  22.             h = Math.min(i, Integer.MAX_VALUE - -low);  
  23.         }  
  24.         high = h;  
  25.   
  26.         cache = new Integer[(high - low) + 1];  
  27.         int j = low;  
  28.         for(int k = 0; k < cache.length; k++)  
  29.             cache[k] = new Integer(j++);  
  30.     }  
  31.   
  32.     private IntegerCache() {}  
  33. }  

复制代码
如果你想了解更底层的工作原理只能去分析JVM是如何操作内存空间的了吧。。

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
虚拟机的存储Integer的常量池范围是-128~127,
你的128超过了这个范围,
相当于new Integer(128),
在内存中有两个不同的对象c 、d,虽然引用的值是一样的
堆中的地址就不一样了
回复 使用道具 举报
王怀亮 发表于 2013-4-12 15:50
首先需要纠正一下你的代码System.put.println是不对的,应该是System.out.println,其次int类型的范围是-12 ...

丢人了,输出语句大意了。
int类型取值范围不是-128到127  是我记错了 还是哥们打错了
常量池我一会好好了解一下
回复 使用道具 举报
心弦上的景致 发表于 2013-4-12 17:13
丢人了,输出语句大意了。
int类型取值范围不是-128到127  是我记错了 还是哥们打错了
常量池我一会好好 ...

打错了,我也丢人了,呵呵,是Integer为了提高效率,提前初始化了-128--127之间的整数对象,我给你找了一个详细的介绍,你看看吧http://hi.baidu.com/next2_me/item/128f29c36b2fc6320931c6f7
回复 使用道具 举报
王怀亮 发表于 2013-4-12 17:20
打错了,我也丢人了,呵呵,是Integer为了提高效率,提前初始化了-128--127之间的整数对象,我给你找了一 ...

非常感谢
回复 使用道具 举报

如果问题未解决,请继续追问,如果没有问题了,请将帖子分类 改为“已解决”,谢谢
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马