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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 黑马-张洋 中级黑马   /  2013-2-24 20:38  /  1732 人查看  /  10 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

今天研究integer和int的区别的时候,想不通为什么会出现下面的情况
  1. package com.exam;

  2. public class test {

  3.         /**
  4.          * @param args
  5.          */
  6.         public static void main(String[] args) {
  7.                 // TODO Auto-generated method stub
  8.                
  9.                Integer a=1;  
  10.                Integer b=1;  
  11.                System.out.println(a==b);  
  12.                
  13.                
  14.                int c=1;  
  15.                int d=1;  
  16.                System.out.println(c==d);  
  17.         }

  18. }
复制代码
打印的第一个false,第二个是true。第二个比较好理解,但是第一个是为什么?

虽然integer是int的封装类,这些理论上的知道。但是实际运用中出现这样是为什么?这样有什么好处?

10 个回复

倒序浏览
亲 ,第一个是true,
因为Integer 使用了享元设计模式,-128~127之间都会去内存找有没有这个对象,而不去建新的
回复 使用道具 举报
学习String类的时候,大家都明白==是比较地址的.
换了一个int型的...
Integer和String类是一样的,这里的a/b是对象,而1是成员属性,不是int型的数值了.==比较的是对象的地址.自然不一样.应该来说用这样比较好理解
String str1="abc";
String str2=new String("abc");
str1==str2//false;
回复 使用道具 举报
”==“是比较运算符,是约等于的意思,你能说a约等于b吗,不能,所以肯定不相等
对象如果要比较其值得话就调用equlas方法,这才是判断的其值
而c和d比较的就是值,所以相等
记住,对象调用方法,值的比较用==,如果值要调用equlas方法就必须封装成对象才能调用
回复 使用道具 举报
李挺 发表于 2013-2-24 20:41
亲 ,第一个是true,
因为Integer 使用了享元设计模式,-128~127之间都会去内存找有没有这个对象,而不去 ...

不好意思。我第一次弄的时候写的是a=1111,b=1111.所以a==b打印的false。
后来我怕看着太臃肿了,所以改成了1,想不到这样一改还能出其他结果
回复 使用道具 举报
胥文 发表于 2013-2-24 20:48
”==“是比较运算符,是约等于的意思,你能说a约等于b吗,不能,所以肯定不相等
对象如果要比较其值得话就 ...

谢谢。我记住你的最后一句话了
回复 使用道具 举报
李挺 中级黑马 2013-2-24 21:00:19
7#
黑马-张洋 发表于 2013-2-24 20:58
不好意思。我第一次弄的时候写的是a=1111,b=1111.所以a==b打印的false。
后来我怕看着太臃肿了,所以改 ...

1111超出了享元模式的范围,所以a和b指向了2个对象,所以位false
回复 使用道具 举报
陈圳 发表于 2013-2-24 20:44
学习String类的时候,大家都明白==是比较地址的.
换了一个int型的...
Integer和String类是一样的,这里的a/b ...

谢谢。你的举例让我容易理解
回复 使用道具 举报
Integer m=128;  
  Integer n=128;  
sop("m==n:"+(m==n));  

Integer a=127;  
Integer b=127;  
sop("a==b:"+(a==b));/*结果为true。因为a和b指向了同一个Integer对象。
当数值在byte范围内时,对于新特性,如果数值已经存在
则不会再开辟新的空间。
其实int就是基本数据类型,而integer是个对象类型,算引用数据类型,里面有个class类
回复 使用道具 举报
因为Integer是int的包装类。所以两个对象用"=="进行比较永远为false.因为比较的是在内存中的地址。
回复 使用道具 举报
兄弟再看下啊,两个都为true
原因是Integer类有一个缓存,它会缓存介于-128~127之间的整数
所以你用两个1,其实它返回的是Integer缓冲区里面的同一个对象,==判断为true。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马