黑马程序员技术交流社区

标题: 等于还是不等于 [打印本页]

作者: 刘丁    时间: 2012-2-15 04:55
标题: 等于还是不等于
本帖最后由 刘丁 于 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);     
}   

上面两段代码为什么输出的结果不同
作者: 黄秋    时间: 2012-2-15 05:59
  这是由于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的值不会保存在常量池。
作者: 侯丽星    时间: 2012-2-15 08:06
本帖最后由 侯丽星 于 2012-2-15 08:25 编辑

若一数字只占一个字节(-128~127),那么将其分别装到两个Integer对象中时,则这两个Integer对象是相同的。这体现了享元设计模式(flyweight)--对于使用频率高、占用空间小的数据。
所以第一个a==b 的结果是false;第二个a==b的结果是true。
作者: 黄锦成    时间: 2012-2-15 09:08
[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对象。
作者: 彭坤    时间: 2012-2-15 09:23
基础加强讲到自动拆装箱和享元模式那一节视频里讲到过,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.         }
复制代码

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

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




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