黑马程序员技术交流社区

标题: 关于享元模式的小问题 [打印本页]

作者: 魏亮    时间: 2012-11-8 08:30
标题: 关于享元模式的小问题
class Test
{
        public static void main(String[] args)
        {
                Double d1 = 11.0;
                Double d2 = 11.0;
                System.out.println("double="+(d1==d2));
               
                Float f1 = 11.0f;
                Float f2 = 11.0f;
                System.out.println("float+"+(f1==f2));
                //结果是false
                //难道double 和float 没有享元??

        }




}


作者: 陈云展    时间: 2012-11-8 08:50
虽然不清楚什么是享元。但是肯定告诉你。基本数据类型分配在栈内。一个变量一个地。呵呵。
作者: 徐军涛    时间: 2012-11-8 09:25
  原因:你用Double和Float是在用基本数据类型包装类创建对象,会在堆内存中开辟不同的空间。
     对象内容的比较用equals方法,而不是==方法。
  解决:定义成基本数据类型
     float f1 = 11.0f;
作者: 黑马-zhangping    时间: 2012-11-8 09:28
享元设计模式:是指有很多个小的对象,他们有很多属性相同,把他们变成一个对象,那些相同的属性叫做内部状态,不相同的属性作为方法的参数,成为外部状态。
范围:-128到127之间
目的:为了共享技术实现相同或相似对象的重用
何时用:当对象数量太多时,将导致运行代价过高,带来性能下降的时候用
缺点:1.需要分离出内部状态和外部状态,使得程序的逻辑复杂化。
      2.需要将享元对象的状态外部化,而读取外部状态舍得运行时间变长

使用享元设计模式的类有:String,
作者: 黑马-zhangping    时间: 2012-11-8 09:31
使用享元设计模式的类有:String,Integer,别的就不是太清楚,像Double,Float好像不可以实现
作者: 梁桐老师    时间: 2012-11-8 11:17
JDK5.0新特性--自动装箱:基本类型与包装类型的转换
JDK5.0之后的书写:Double d = 10.5d;
JDK1.4的书写:Double d = new Double(10.5);
两个新对==结果肯定是false
作者: 魏亮    时间: 2012-11-10 16:07
梁桐老师 发表于 2012-11-8 11:17
JDK5.0新特性--自动装箱:基本类型与包装类型的转换
JDK5.0之后的书写:Double d = 10.5d;
JDK1.4的书写:D ...

那这个类运行的结果是true
class  Test
{
        public static void main(String[] args)
        {
                Integer i1 = 12;
                Integer i2 =12;
                System.out.println(i1==i2);
        }
}
i1和i2 也是两个新对象
总结一下,是不是double 和float 不支持享元呢?
作者: 魏亮    时间: 2012-11-10 16:07
梁桐老师 发表于 2012-11-8 11:17
JDK5.0新特性--自动装箱:基本类型与包装类型的转换
JDK5.0之后的书写:Double d = 10.5d;
JDK1.4的书写:D ...

那这个类运行的结果是true
class  Test
{
        public static void main(String[] args)
        {
                Integer i1 = 12;
                Integer i2 =12;
                System.out.println(i1==i2);
        }
}
i1和i2 也是两个新对象
总结一下,是不是double 和float 不支持享元呢?
作者: 梁桐老师    时间: 2012-11-14 12:02
魏亮 发表于 2012-11-10 16:07
那这个类运行的结果是true
class  Test
{

Integer类型缓存了-128~~127这个范围的数字
  1. //实例
  2.                 Integer i1 = -129;
  3.                 Integer j1 = -129;
  4.                 System.out.println("Integer1 " + (i1 == j1));
  5.                
  6.                 Integer i2 = -128;
  7.                 Integer j2 = -128;
  8.                 System.out.println("Integer2 " + (i2 == j2));
  9.                
  10.                 Integer i3 = 127;
  11.                 Integer j3 = 127;
  12.                 System.out.println("Integer3 " + (i3 == j3));
  13.                
  14.                 Integer i4 = 128;
  15.                 Integer j4 = 128;
  16.                 System.out.println("Integer4 " + (i4 == j4));
  17. //结果
  18. Integer1 false
  19. Integer2 true
  20. Integer3 true
  21. Integer4 false
复制代码





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