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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 梁志冰 中级黑马   /  2012-9-5 21:44  /  1930 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 梁志冰 于 2012-10-26 14:36 编辑

public class MyTest {
public static void main(String[] args) {
Integer a=new Integer(5);
Integer b=new Integer("5");
System.out.println(a==b);  //false
System.out.println(a.equals(b)); //true  
Integer i=5;
Integer j=5;
System.out.println(i==j);  //ture
System.out.println(i.equals(j)); //true
}
}
问题1:
System.out.println(a==b);  结果为false,而(a.equals(b)为true
System.out.println(i==j);结果为true
这是为什么?这两个有什么不同吗?
问题2:
当i=128 ,j=128时,System.out.println(i==j); 结果为false ??为什么?


6 个回复

倒序浏览
本帖最后由 舒远 于 2012-9-5 21:56 编辑

public class MyTest {
public static void main(String[] args) {
Integer a=new Integer(5);
Integer b=new Integer("5");
System.out.println(a==b);  //false   这里是比较两个Integer对象的内存地址是否相等。因为是两个对象虽然值相等但是地址不等
System.out.println(a.equals(b)); //true   这里是比较两个对象实际的值是否相等。
Integer i=5;
Integer j=5;
System.out.println(i==j);  //ture  这里相等是因为java采用的享元模式,java会对-128 ~127这些数据采用享元模式处理。
}
}

我们敬爱的张孝祥老师在高新技术视频中有讲过享元模式。
回复 使用道具 举报
舒远 发表于 2012-9-5 21:51
public class MyTest {
public static void main(String[] args) {
Integer a=new Integer(5);

什么是享元模式呀?
回复 使用道具 举报
public class MyTest {
public static void main(String[] args) {
Integer a=new Integer(5);
Integer b=new Integer("5");
System.out.println(a==b);  //false
System.out.println(a.equals(b)); //true  
Integer i=5;
Integer j=5;
System.out.println(i==j);  //ture
System.out.println(i.equals(j)); //true
}
}
问题1:
System.out.println(a==b);  结果为false,而(a.equals(b)为true
System.out.println(i==j);结果为true
这是为什么?这两个有什么不同吗?

解释:==只有在基本数据类型时并且是数据类型是可以进行值的比较!在这里==比较的是引用类型的地址,equals才是比较引用地址指向的数据!
System.out.println(i==j)  因为之前的
Integer a=new Integer(5);
Integer b=new Integer("5");
已经在在常量池中写入5,所i和j指向常量池中的同一为位置,所以地址相同!这就是为什么后面的
当i=128 ,j=128时,System.out.println(i==j); 结果为false的原因



问题2:
当i=128 ,j=128时,System.out.println(i==j); 结果为false ??为什么?

见前文解释!

回复 使用道具 举报
梁志冰 发表于 2012-9-5 21:55
什么是享元模式呀?

装箱与拆箱 Java的 享元模式

在java中有一种 模式叫做 装箱 和拆箱       flyweight 享元模式

例如  

Integer  i= 55    ;      //那么自动把55 装箱成 Integer  对象  
System.out.println(i) ;  //自动拆箱 将Integer对象拆箱成 int型变量 输出   



Integer  i1= 55    ;
Integer  i2= 55    ;
Integer  j1= 355    ;
Integer  j2= 355    ;   

i1==i2    ;//结果为 true  
j1==j2 ;//结果为false      

原因是Java的享元模式 ,-128-127之间的数值 会存在 一个 缓存池中,下次使用的时候 先从缓存池中 取出 这个数据 ,而不会去分配它的内存  。
只有  一个字节以内的  数据才会存在缓存池中 。  
比如word中 我们输入 多个   aaaaa那么 如果为每个a分配一个 内存空间 那么 内存的浪费 很严重 ,这种享元模式
就是在使用的地方引用 同一个 数据 ,就是属性相同的 一字节以内的小对象  引用同一个对象  


不仅在自动拆箱和装箱中会有上述结果 就算我们自己手工创建的对象也有 享元模式  

Integer i1=Integer.valueOf(333);
Integer i2=Integer.valueOf(333) ;
i1==i2 ;//false  只有-128-127之间的数据才可以利用享元模式
回复 使用道具 举报
舒远 发表于 2012-9-5 22:03
装箱与拆箱 Java的 享元模式

在java中有一种 模式叫做 装箱 和拆箱       flyweight 享元模式

谢谢师兄,讲解很到位!我懂了
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马