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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© kongdun1991 中级黑马   /  2016-6-2 22:42  /  1035 人查看  /  13 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

  1. public class Dmeo {
  2.         public static void main(String[] args) {
  3.                 Integer a1 = 128;
  4.                 Integer a2 = 128;
  5.                 System.out.println(a1 == a2);
  6.                 System.out.println(a1.equals(a2));
  7.                
  8.                 Integer a3 = 127;
  9.                 Integer a4 = 127;
  10.                 System.out.println(a3 == a4);
  11.                 System.out.println(a3.equals(a4));
  12.                
  13.         }
复制代码

尽量解释一下运行结果为何是这样的

13 个回复

倒序浏览
int 是基本数据类型 Integer是其包装类,注意是一个类。

false             //  a1和a2 在内存中是不同的内存地址,对比的是内存地址.所以不能比.
true              //重写了equals方法,对比的是数值
true              //对比的是数值
true             //对比的是数值

好像是这样的.参考参考别人的答案.
回复 使用道具 举报
大神啊,求解这题怎么做......
回复 使用道具 举报
18611643318 发表于 2016-6-2 22:49
int 是基本数据类型 Integer是其包装类,注意是一个类。

false             //  a1和a2 在内存中是不同的内 ...

同样的语句,为何第三个输出语句和第一个不一样,能详细说一下嘛
回复 使用道具 举报
本帖最后由 18611643318 于 2016-6-2 23:26 编辑
kongdun1991 发表于 2016-6-2 23:09
同样的语句,为何第三个输出语句和第一个不一样,能详细说一下嘛

不好意思,我第一次回复有点问题.
int 是基本数据类型.
Integer  是引用数据类型.


equals() 比较的是两个对象的值(内容)是否相同。


"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。


int 的自动装箱,是系统执行了 Integer.valueOf(int i).


java Integer  类里面的valueOf()的这个方法,有一个坑.


  1. public static Integer valueOf(int i) {
  2.     if(i >= -128 && i <= IntegerCache.high)  // 没有设置的话,IngegerCache.high 默认是127
  3.         return IntegerCache.cache[i + 128];
  4.     else
  5.         return new Integer(i);
  6. }
复制代码
-127到127,默认
返回的是缓存的Integer对象(并不是新建对象)


所以a3和a4 实际指的是同一个对象.但是a1和a2就不一样了.


你可以具体看看java基础里面有一个day有详细讲解.


另外从网上找到一篇文章供你参考.


http://www.cnblogs.com/danne823/archive/2011/04/22/2025332.html


这个题,其实是考的java的自动装箱和拆箱.1.5以后的新特性吧.你用1.4版本的jdk就不这样.


请记住这个坑啊...


回复 使用道具 举报 1 0
蓝色风信子 发表于 2016-6-2 22:54
大神啊,求解这题怎么做......

看我下面的回复.
回复 使用道具 举报
false
true
true
true
包装类的值是在存在常量池中的如果超过了bate的取值范围就会在堆类存在创建一个性的对象
回复 使用道具 举报
18611643318 发表于 2016-6-2 23:12
不好意思,我第一次回复有点问题.
int 是基本数据类型.
Integer  是引用数据类型.

非常感谢,你分析的很透彻.
回复 使用道具 举报
kongdun1991 发表于 2016-6-2 23:57
非常感谢,你分析的很透彻.

互相学习,我也重新复习了一遍.
回复 使用道具 举报
integer类型的常量直接赋值: 看是否在byte范围内,如果是,则从常量池直接拿数据,此时地址值相等;如果不在byte范围内,相当于new了一个值,在堆中开辟新空间。Integer覆写了toString方法,因此false,true,true,true
回复 使用道具 举报
一起来学习下
回复 使用道具 举报
integer类型的常量直接赋值: 看是否在byte范围内,如果是,则从常量池直接拿数据,此时地址值相等;如果不在byte范围内,相当于new了一个值,在堆中开辟新空间。Integer覆写了toString方法,因此false,true,true,true
回复 使用道具 举报
-128 到   127  这之间的值都会自动装箱,  自动装箱就不会创建新的对象, 而是从常量池中直接取
回复 使用道具 举报
equals方法肯定为ture不用说,-128到127的时候从常量池中取,不用创建对象。所以false ture ture ture
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马