【问题标题】:Declaration of wrapper classes包装类的声明
【发布时间】:2013-10-22 06:35:42
【问题描述】:

这个问题是How can a string be initialized using " "?问题的延续

我想提请您注意,即使 IntegerDoubleCharacterFloatBoolean 包装类也可以以与 String 类似的方式声明:

String s = "Test string"

Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid

这些类是否也像String 类一样得到特殊处理。

【问题讨论】:

标签: java string wrapper


【解决方案1】:

正如我在之前的回答中指出的(How can a string be initialized using " "?

是的,为了在 OOP 中保留 primitive 类型,设计师在 primitivesObject's 之间架起了一座桥梁,Wrappers 进行了特殊处理。

原因很明显是explained in docs

然而,使用对象代替原语是有原因的,Java 平台为每种原语数据类型提供了包装类。这些类将原语“包装”在一个对象中。通常,包装是由编译器完成的——如果您在预期对象的地方使用原语,编译器会为您将原语包装在其包装类中。同样,如果您在需要原语时使用数字对象,编译器会为您拆箱该对象。欲了解更多信息,请参阅Autoboxing and Unboxing

我们在我们的程序中广泛使用primitives,因此允许像

这样的语法可能是一个设计决定
   Integer i = 10; //primitive style

然后memory 分配compile 时间本身为 i 因为它是一个primitive 类型,当他们发现Wrapper 类型声明与Assignment operator =

语法明智,更方便和快乐(至少对我来说:))。

比写作,

   Integer i = new Integer(10); //Object creation style

【讨论】:

    【解决方案2】:

    以下所有这些陈述:

    Integer i = 10; //valid
    Double d = 10.00; //valid
    Boolean b = true; //valid
    

    因为autoboxing而有效

    自动装箱是 Java 编译器进行的自动转换 在原始类型及其对应的对象包装器之间 类

    【讨论】:

    • 嗨@Juned 感谢您的快速回复,还有一个问题,Integer、Double、Boolean 和其他包装类的对象是如何通过“=”号声明数据类型来创建的。
    • @user2704032 编译器会为您完成这项工作。添加了自动装箱/拆箱,以帮助程序员在使用原语和相应的包装类时以更简单的方式编写东西。
    【解决方案3】:

    是的,原始 Wrapper 类的行为也类似于 String 类。

    你可以像下面这样说明

    Integer i1 = new Integer(10); //valid
    Integer i2 =10;
    System.out.println(i1==i2); // this one is false
    i1=10;  
    System.out.println(i1==i2); //// this one is true
    

    【讨论】:

      【解决方案4】:

      所有原始类型的包装类都以这种方式运行。它被称为 autoboxing,并在 java 1.5 中引入:

      http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html

      【讨论】:

        【解决方案5】:

        String str = "Test String"; 有特殊待遇不管和Integer i = 10; String s = "Test String";有什么特殊待遇? 这些被称为字符串文字在 jvm 的字符串常量池中获取内存。 就垃圾收集而言,一个特殊的意义是,池化常量是 永远不会受到垃圾收集的影响。 将 'str' 设为 null 不会使“测试字符串”符合垃圾回收条件。 WHY?:: JVM 将来会尝试重用这个“测试字符串”。垃圾收集算法排除池内存中的对象。所以正常的 GC 规则在这里不适用。看看这个:why String literals are not garbage collected

        现在,这种处理方式与 wrapper 的自动装箱有何不同。自动装箱是从JDK1.5开始引入的。 auto boxing & auto unboxingInteger i = 10; 编译器用Integer i = Integer.valueOf(10); 替换这个语句 只有 JVM 的内部缓存包装器对象的行为类似于剩余的字符串文字。现在什么是内部缓存包装对象?

        Integer i = 100;
        Integer j = 100;
        

        引用 i 和 j 是用一个预先存在的对象的地址给出的。 这就是为什么if( i==j) //true

        Integer k = 130; 
        if( i==k) // false
        

        因为 k 的值超出了缓存范围,即整数的 -128 to 127。 检查这个:Integer wrapper behaviour when value range is -128 to 127 在上面,如果我们使引用 k 无效,那么它的对象将经历 GC,这与字符串文字的处理不同。 如果我们使 i 或 j 无效,则相应的缓存对象永远不会 受 GC 的影响,这与字符串文字的处理方式相同。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2012-10-24
          • 2016-11-28
          • 2012-11-29
          • 2016-11-26
          • 2023-01-28
          • 2022-01-23
          相关资源
          最近更新 更多