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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 那日苏 黑马帝   /  2011-7-25 01:32  /  2192 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

[code=java]public class demo1 {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Integer a = 1024;
                Integer b = 1024;
                Integer c = 1;
                Integer d = 1;
                System.out.println("a==b : " + (a == b));
                System.out.println("c==d : " + (c == d));

        }

}public class demo1 {

        public static void main(String[] args) {
                // TODO Auto-generated method stub
                Integer a = 1024;
                Integer b = 1024;
                Integer c = 1;
                Integer d = 1;
                System.out.println("a==b : " + (a == b));
                System.out.println("c==d : " + (c == d));

        }

}[/code]运行结果为[code=java]a==b : false
c==d : true[/code]我的问题是why?

评分

参与人数 1技术分 +1 收起 理由
admin + 1 有意思

查看全部评分

6 个回复

倒序浏览
:) 去查下源码或者是java的自动装箱和拆箱
1、对于你这种写法,int型的的值为1会被自动装箱成为Integer对象,而且对于[-128, 127]的int值会进行缓存,所以这里认为是同一对象。这个也就是在张老师的Java高薪视频里面介绍的一个模式--享元模式
2、而对于[-128, 127]之外的值会重新创建对象,所以不是同一个对象 ,比较会得出false;

也就是说、上诉1所用的的其实就是通过缓存得到,并非重新创建对象如下代码一样[code=java]public class TestIntegerCache
{
        public static void main(String[] args)
        {
                //生成新的Integer对象
                Integer in1 = new Integer(6);
                //生成新的Integer对象,并缓存该对象
                Integer in2 = Integer.valueOf(6);
                //直接从缓存中取出Ineger对象
                Integer in3 = Integer.valueOf(6);
                //输出false
                System.out.println(in1 == in2);
                //输出true
                System.out.println(in2 == in3);
        }
}[/code]
[ 本帖最后由 詹季春 于 2011-07-25  01:56 编辑 ]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 精确

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-25 05:59:47
藤椅
对于基本数据类型的包装: Integer integer=new Integer(1)  等同于 Integer integer=1(这就是jdk1.5提供的自动装箱功能);
正如楼上同学所说的那样应特别注意-128--127之间的数据JDK将它封装成对象存放在Cache数组中。

评分

参与人数 1技术分 +1 收起 理由
admin + 1

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-25 06:36:45
板凳
这是JDK1.5的新特性装箱和拆箱,-128--127之间相同的数会被自动装成同一个对象,超出这个范围的数装成的就不是同一个对象了。这就是所谓的享元模式。
享元模式(flyweight)的定义为:采用一个共享来避免大量拥有相同内容对象的开销。这种开销中最常见、直观的就是内存的损耗。享元模式以共享的方式高效的支持大量的细粒度对象。[code]package cn.itcast.day1;
public class AutoBox {
        public static void main(String[] args) {
                Integer iObj=3;//自动装箱
                System.out.println(iObj+12);//自动拆箱
                Integer i1=13;
                Integer i2=13;
                Integer i3=130;
                Integer i4=130;
                System.out.println(i1==i2);//结果为true
                System.out.println(i3==i4);//结果为false
                //调用Integer的静态方法valueOf()将int类型转换为Integer类型
                Integer i5=Integer.valueOf(213);
                Integer i6=Integer.valueOf(213);
                Integer i7=Integer.valueOf(13);
                Integer i8=Integer.valueOf(13);
                System.out.println(i5==i6);//结果为false
                System.out.println(i7==i8);//结果为true
        }
}[/code]

评分

参与人数 1技术分 +2 收起 理由
admin + 2 给分了

查看全部评分

回复 使用道具 举报
黑马网友  发表于 2011-7-25 07:38:56
报纸
楼上正解,高新视频早就讲过,自己不认真看
回复 使用道具 举报
黑马网友  发表于 2011-7-25 09:22:16
地板
这个是内存溢出问题!
一个Integer  存储的是一个字节的东西,一个字节只能在 -128--127之间的整数!

如果超出这个的话,就会溢出,例如
128-------1
129-------2
回复 使用道具 举报
黑马网友  发表于 2011-7-25 11:32:01
7#
我查了下。是Integer.indexOf()的 缓存机制问题
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马