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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 刘丁 黑马帝   /  2012-2-15 04:55  /  2370 人查看  /  8 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 刘丁 于 2012-2-15 18:21 编辑

public static void main(final String[] args) {   
    Integer a = 156;   
    Integer b = 156;   
    System.out.println(a == b);     
}   

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

上面两段代码为什么输出的结果不同

评分

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

查看全部评分

8 个回复

倒序浏览
  这是由于java常量池技术: 为了方便快捷地创建某些对象,当需要一个对象时,先从常量池中查找,如果池中没有则创建,有则从池中取,在需要重复创建变量时节省了很多时间。
  Byte,Short,Integer,Long,Character这5种整型的包装类,只是在对应值小于等于127时才使用常量池,大于127则不,“==”是比较对象的引用(地址),而不是值(基本数据类型的==比较,则是值)。上面代码 Integer a、b是100时,a、b都指向常量池的同一地方,就是说a、b保存的地址值一样,所以为true; a、b是156时,>127 java不使用常量池技术,a、b保存的地址值不一样,故为false。

PS:要比较对象的值(内容),应用equals。如 Integer a = new Integer(100) a的值不会保存在常量池。

评分

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

查看全部评分

回复 使用道具 举报
本帖最后由 侯丽星 于 2012-2-15 08:25 编辑

若一数字只占一个字节(-128~127),那么将其分别装到两个Integer对象中时,则这两个Integer对象是相同的。这体现了享元设计模式(flyweight)--对于使用频率高、占用空间小的数据。
所以第一个a==b 的结果是false;第二个a==b的结果是true。
回复 使用道具 举报
[code]public static void main(final String[] args)
        {   
                Integer a = 156;   
                Integer b = 156;   
                System.out.println(a == b);     
         
                Integer a1 = 100;   
                Integer b1 = 100;   
                System.out.println(a1 == b1);     
        }[/code
这是享元模式。当数字在-128~127之间,内存中有对象时,会共享对象。不在这个范围时,会在内存中创建新的对象。就像是156,a指向156这个Integer对象,但是156不在此范围,所以b就指向了一个新的int值为156的Integer对象。

评分

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

查看全部评分

回复 使用道具 举报
基础加强讲到自动拆装箱和享元模式那一节视频里讲到过,flyweight,享元模式:当一个int类型的整数介于-128~127之间时,那么将它分别复制给两个Integer对象中时,则这两个Integer对象是相同的,如果大于127或小于-128,那么两个对象不同
  1. public static void main(final String[] args)
  2.         {   
  3.                 Integer a = 156;   //a>127
  4.                 Integer b = 156;   //b>127
  5.                 System.out.println(a == b);     
  6.          
  7.                 Integer a1 = 100;   //a1<127
  8.                 Integer b1 = 100;   //a1<127
  9.                 System.out.println(a1 == b1);     
  10.         }
复制代码

评分

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

查看全部评分

回复 使用道具 举报
这是java高新技术自动拆箱,装箱,当数值大小在-128和127之间时是相同的引用
回复 使用道具 举报
秦碧 黑马帝 2012-2-15 10:46:52
7#
这是享元模式
它使用共享物件,用来尽可能减少内存使用量以及分享资讯给尽可能多的相似物件;它适合用于当大量物件只是重复因而导致无法令人接受的使用大量内存。通常物件中的部分状态是可以分享。常见做法是把它们放在外部数据结构,当需要使用时再将它们传递给享元。
由于一个字节内的数值经常性的被使用,(-128~127)
所以java会对这些对象采取享元模式
所以对于-128到127之间的数 new出的两个Integer对象是相等的

评分

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

查看全部评分

回复 使用道具 举报
Akm 黑马帝 2012-2-15 12:53:40
8#
{:soso_e179:}回帖的都很牛
这例子的确属于简单的享元模式

具体的模式介绍看看这里是怎么说的
http://blog.csdn.net/cheekis/article/details/4023563
回复 使用道具 举报
钟保罗 黑马帝 2012-2-15 13:37:52
9#
java中有个常量池,里面存放的数据是-128到127之间的数,如果new两个数出来,是常量池里面的数范围的,就到常量池里取,所以就是同一个了对象了! Integer a = 156;   
Integer b = 156;   a和b的值都不在常量池内,所以就new出了两个对象
Integer a = 100;   
Integer b = 100;  a和b都在常量池数内,所以他们用的都是常量池内同一个数,所以就是同一个对象了!
这是享元模式。。。

评分

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

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马