这个问题继续问题How can a string be initialized using " "?
我想提醒您注意,即使Integer
,Double
,Character
,Float
,Boolean
包装类也可以在同一个声明中声明方式String
被声明为:
String s = "Test string"
Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid
这些课程是否也像String
课程一样受到特殊待遇。
答案 0 :(得分:3)
正如我在上一篇回答中指出的那样(How can a string be initialized using " "?)
是的,要将primitive
类型保留在OOP中,设计师会在primitives
和Object'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
答案 1 :(得分:2)
以下所有陈述:
Integer i = 10; //valid
Double d = 10.00; //valid
Boolean b = true; //valid
由于autoboxing ,有效
Autoboxing是Java编译器自动转换 原始类型与其对应的对象包装器之间 类
答案 2 :(得分:1)
是原始的包装类也表现得像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
答案 3 :(得分:0)
所有原始类型的包装类都以这种方式运行。它被称为 autoboxing ,并在java 1.5中引入:
http://docs.oracle.com/javase/tutorial/java/data/autoboxing.html
答案 4 :(得分:0)
String str = "Test String";
有特殊待遇与Integer i = 10;
无关
什么是特殊待遇String s = "Test String";
?
这些被称为字符串文字获取jvm的String常量池中的内存。
一个特殊的意义是垃圾收集,汇集的常数是
永远不会受到垃圾收集的影响。
将'str'设为null不会使“Test String”符合垃圾回收的条件。
为什么?:: JVM将来会尝试重用这个“测试字符串”。垃圾收集算法排除池内存中的对象。所以正常的GC规则不适用于此处。看看这个:why String literals are not garbage collected
现在这种处理方式与包装纸的自动装箱完全不同。自动装箱是从JDK1.5引入的。 auto boxing & auto unboxing
当Integer 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影响,这与字符串文字相同。