黑马程序员技术交流社区

标题: 求解缓存问题? [打印本页]

作者: 李红飞    时间: 2012-5-23 09:58
标题: 求解缓存问题?
Integer i1=100;
Integer i2=100;
Integer i3=200;
Integer i4=200;
System.out.println(i1==i2);  //true
System.out.println(i1==i2);   //false\
求结果具体原因?
作者: 黑马张健    时间: 2012-5-23 10:10
基本数据类型的对象缓存:它对于基本数据类型的整数,要装箱成为Integer对象时,如果这个数字在一个字节之内,也就是-128到127之间的数字,一旦被包装成Integer对象之后,就会把它缓存起来,在一个池里面,当下次又要把一个整数包装成Integer对象的时候,就会先到缓存池里面找,如果有就冲缓存池里面取,这样就节省了内存空间。这是一种设计模式:享元模式(flyweight)
对于整数在-128到127之间的数,被包装成Integer对象后,System.out.println(i1==i2);都会返回真(true).不在此范围内的整数,都会返回假(false)
作者: 黑马—陈磊    时间: 2012-5-23 10:38
本帖最后由 黑马—陈磊 于 2012-5-23 10:40 编辑

"==" 比较的是两个对象的引用(内存地址)是否相同,也用来比较两个基本数据类型的变量值是否相等。
在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,
所以范例中,i1与 i2实际上参考至同一个对象。
如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,
即相当于每次装箱时都新建一个 Integer对象,所以范例中,i3与i4参考的是不同的对象。
另外,当不使用自动装箱功能的时候,情况与普通类对象一样.

作者: 袁錦泰    时间: 2012-5-23 10:59
你写错了吧? 结果怎么可能为false.....
作者: 张成龙    时间: 2012-5-23 11:02
jdk1.5新特性:基本数据类型的自动装箱和拆箱,基本数据类型和它所对应的包装类可以自动转换,
如果一个数值在一个字节之内(-128~127之间的数值),那么在自动装箱的时候系统会把这个包装类对象缓存起来,如果下一次同样的数值需要自动装箱,那么就直接引用之前缓存起来的那个数值相同的对象。
Integer i1=100;Integer i2=100;Integer i3=200;Integer i4=200;
System.out.println(i1==i2);  //true因为100是在一个字节之内,就只有一个对象
System.out.println(i1==i2);  这里运行结果也是true的
System.out.println(i3==i4); 这句因为200已经超出了一个字节,就创建了两个对象,运行结果就是false
以上就是java中的享元模式(flyweight): 有很多个小的对象,他们有很多属性相同,就把他们变成一个对象,
那些不同的属性就设为方法的参数传进来,叫外部属性或外部状态。享元模式会大幅度的降低内存中对象的数量。

作者: 付左军    时间: 2012-5-23 23:07
四个字,享元模式




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