黑马程序员技术交流社区

标题: 基本数据类型对象包类的问题? [打印本页]

作者: 梁志冰    时间: 2012-9-5 21:44
标题: 基本数据类型对象包类的问题?
本帖最后由 梁志冰 于 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 ??为什么?



作者: 舒远    时间: 2012-9-5 21:51
本帖最后由 舒远 于 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:55
舒远 发表于 2012-9-5 21:51
public class MyTest {
public static void main(String[] args) {
Integer a=new Integer(5);

什么是享元模式呀?
作者: 武庆东    时间: 2012-9-5 22:01
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 22:03
梁志冰 发表于 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:07
舒远 发表于 2012-9-5 22:03
装箱与拆箱 Java的 享元模式

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

谢谢师兄,讲解很到位!我懂了




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