这个问题是对如何使用“”初始化字符串?
我想提请您注意,即使Integer
, Double
, Character
, Float
,Boolean
包装类也可以以与声明相同的方式String
声明:
String s = "Test string"
Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid
这些班级是否也像String
班级一样给予特殊待遇。
这个问题是对如何使用“”初始化字符串?
我想提请您注意,即使Integer
, Double
, Character
, Float
,Boolean
包装类也可以以与声明相同的方式String
声明:
String s = "Test string"
Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid
这些班级是否也像String
班级一样给予特殊待遇。
正如我在之前的回答中指出的那样(如何使用“”初始化字符串?)
是的,为了在 OOP 中保留primitive
类型,设计师在它们之间架起了一座桥梁,primitives
并且Object's
对Wrappers
它们进行了特殊处理。
然而,使用对象代替原语是有原因的,Java 平台为每种原语数据类型提供了包装类。这些类将原语“包装”在一个对象中。通常,包装是由编译器完成的——如果您在需要对象的地方使用原语,编译器会为您将原语包装在其包装类中。同样,如果您在需要原语时使用数字对象,编译器会为您拆箱该对象。有关详细信息,请参阅自动装箱和拆箱
我们primitives
在程序中广泛使用,因此允许类似的语法可能是一个设计决定
Integer i = 10; //primitive style
然后在时间本身为imemory
分配,因为它是一种类型,当他们发现类型声明带有compile
primitive
Wrapper
Assignment operator
=
语法明智,更方便和快乐(至少对我来说:))。
比起写作,
Integer i = new Integer(10); //Object creation style
以下所有这些陈述:
Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid
由于自动装箱而有效
自动装箱是 Java 编译器在原始类型与其对应的对象包装类之间进行的自动转换
是的,原始 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
String str = "Test String";
特殊待遇是无关的,特殊待遇是Integer i = 10;
什么 String s = "Test String";
?这些被称为字符串文字在 jvm 的字符串常量池中获取内存。就垃圾回收而言,一个特殊的意义是,池中的常量永远不会受到垃圾回收的影响。将“str”设为 null 不会使“测试字符串”符合垃圾收集条件。WHY?:: JVM 将来会尝试重用这个“测试字符串”。垃圾收集算法排除池内存中的对象。所以正常的 GC 规则在这里不适用。看看这个:为什么字符串文字没有被垃圾收集
现在,这种处理方式与 wrapper 的自动装箱有何不同。自动装箱是从JDK1.5开始引入的。自动装箱和自动拆箱
当Integer i = 10;
编译器仅用 JVM 的内部缓存包装器对象替换此语句时,Integer i = Integer.valueOf(10);
其行为就像剩余的字符串文字一样。现在什么是内部缓存包装对象?
Integer i = 100;
Integer j = 100;
引用 i 和 j 使用单个预先存在的对象的地址给出。这就是为什么if( i==j) //true
Integer k = 130;
if( i==k) // false
因为 k 的值超出了-128 to 127
Integer 的缓存范围。检查这一点:当值范围为 -128 到 127 时的整数包装器行为
在上面,如果我们使引用 k 无效,那么它的对象将经历 GC,这与字符串文字的处理不同。如果我们使 i 或 j 无效,则相应的缓存对象永远不会受到 GC 的影响,这与字符串文字的处理方式相同。
所有原始类型的包装类都以这种方式运行。它被称为自动装箱,并在 java 1.5 中引入:
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html