黑马程序员技术交流社区

标题: 看程序写结果 [打印本页]

作者: kongdun1991    时间: 2016-6-2 22:42
标题: 看程序写结果
  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.         }
复制代码

尽量解释一下运行结果为何是这样的
作者: 18611643318    时间: 2016-6-2 22:49
int 是基本数据类型 Integer是其包装类,注意是一个类。

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

好像是这样的.参考参考别人的答案.
作者: 蓝色风信子    时间: 2016-6-2 22:54
大神啊,求解这题怎么做......
作者: kongdun1991    时间: 2016-6-2 23:09
18611643318 发表于 2016-6-2 22:49
int 是基本数据类型 Integer是其包装类,注意是一个类。

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

同样的语句,为何第三个输出语句和第一个不一样,能详细说一下嘛
作者: 18611643318    时间: 2016-6-2 23:12
本帖最后由 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就不这样.


请记住这个坑啊...



作者: 18611643318    时间: 2016-6-2 23:28
蓝色风信子 发表于 2016-6-2 22:54
大神啊,求解这题怎么做......

看我下面的回复.
作者: 归宿123    时间: 2016-6-2 23:28
false
true
true
true
包装类的值是在存在常量池中的如果超过了bate的取值范围就会在堆类存在创建一个性的对象

作者: kongdun1991    时间: 2016-6-2 23:57
18611643318 发表于 2016-6-2 23:12
不好意思,我第一次回复有点问题.
int 是基本数据类型.
Integer  是引用数据类型.

非常感谢,你分析的很透彻.
作者: 18611643318    时间: 2016-6-2 23:59
kongdun1991 发表于 2016-6-2 23:57
非常感谢,你分析的很透彻.

互相学习,我也重新复习了一遍.
作者: dubei1993    时间: 2016-6-3 07:20
integer类型的常量直接赋值: 看是否在byte范围内,如果是,则从常量池直接拿数据,此时地址值相等;如果不在byte范围内,相当于new了一个值,在堆中开辟新空间。Integer覆写了toString方法,因此false,true,true,true
作者: zhangquan    时间: 2016-6-3 07:39
一起来学习下
作者: 15232636900    时间: 2016-6-3 07:49
integer类型的常量直接赋值: 看是否在byte范围内,如果是,则从常量池直接拿数据,此时地址值相等;如果不在byte范围内,相当于new了一个值,在堆中开辟新空间。Integer覆写了toString方法,因此false,true,true,true
作者: haojingwei310    时间: 2016-6-3 09:46
-128 到   127  这之间的值都会自动装箱,  自动装箱就不会创建新的对象, 而是从常量池中直接取
作者: 网小二    时间: 2016-6-3 17:52
equals方法肯定为ture不用说,-128到127的时候从常量池中取,不用创建对象。所以false ture ture ture




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