String对象创建
-
String Literals(字面值形式): String a = “dog”
- 定义: 字符串文字由包含在双引号中的零个或多个字符组成.
inern
方法- 定义: 字面值字符串总是引用String类的相同实例…使用方法
String.intern
共享唯一实例
- api说明: 当字符串调用此方法会先找常量池是否有equal该对象的字符串,有则返回引用,否则,添加该对象到常量池,并返回引用
- 推论: 该方法既然已经被调用那么这个对象已经被创建,而且是在堆中,如果常量池没有,才会被添加到常量池(这里我理解是复制一份).
- 定义: 字面值字符串总是引用String类的相同实例…使用方法
- 创建过程: 加载包含一个字面值字符串的类或接口时会创建一个String对象表示这个字面值,但是如果之前对相同的字符串进行了interned,则不会创建(隐含意思编译器内部应该是调用了intern方法)
- 定义: 字符串文字由包含在双引号中的零个或多个字符组成.
-
操作符
+
创建- 说明: 字符串连接操作符+隐式地创建一个新的字符串对象当结果不是一个常数表达式.
- 结论:
+
实质new了一个String对象.
- 说明: 字符串连接操作符+隐式地创建一个新的字符串对象当结果不是一个常数表达式.
-
new创建
- 说明: 不仅是String,所有的对象new都跟其他行为无关,不会关心常量池是否有该对象
- 特例:
new String("dog")
,因为类,接口被加载时会扫描字面值,若有就会调用该字面值的intern方法,所以这里的过 程实质是"dog".intern()->copy a String eqyal “dog”
-
归纳总结
以上结论基本基于文档直译,下面用白话总结
- String有3中创建方式:
new String("dog")
,"dog"
,"do"+"g"
(分别称为new创建
,字面值创建
,操作符+创建
). new创建
和操作符+
创建实质均是new创建,属于显示创建,没有其他隐式调用过程(不会判断常量池是否有该字符串).字面值创建
会先在堆中创建一个对象,然后调用该对象intern
方法,判断常量池是否有该对象,若有则返回常量池对象引用,若没有则添加(复制)该对象到常量池,然后返回添加后的对象的引用,属于隐式创建.
- String有3中创建方式:
参考文献
The Java® LanguageSpecificationJava SE 8 Edition
Java SE 8 Edition Api