[英]String initialising in Java
考虑以下代码:
new String()
怎么创建str1
对象? str1
和str2
对象引用相同的内存位置? String str1 = "hello";
String str2 = "hello";
所有这些都在Java语言规范中进行了描述。
请参阅3.10.5字符串文字 :
每个字符串文字都是对String类(第4.3.3节)的实例(第4.3.1节,第12.5节)的引用(第4.3节)。 字符串对象具有恒定值。 使用String.intern方法,对字符串常量(或更一般地说,是常量表达式的值(第15.28节)的字符串)进行“ interned”,以便共享唯一的实例。
在Java中,无需调用new运算符即可创建String对象。因此, String str1 = "hello"
等效于String str1 = new String("hello")
。 这样做是为了使字符串声明类似于原始数据类型。
关于为什么它们指向相同的内存位置:
在Java中,有一个String文字池的概念。为减少在JVM中创建的String对象的数量,String类保留了一个字符串池。 每次代码创建字符串文字时,JVM都会首先检查字符串文字池。 如果该字符串已存在于池中,则返回对该池实例的引用。 如果该字符串在池中不存在,则将实例化一个新的String对象,然后将其放置在池中。
String str1 = "Hello";
String str2 = "Hello";
System.out.print(str1 == str2);
打印True
。
如果您这样做:
String str1 = "Hello";
String str2 = new String("Hello");
System.out.print(str1 == str2);
打印False
。
因为,String对象是在String文字池之外创建的。
“ hello”是Java中的字符串文字。 Java创建一个字符串文字池,因为字符串是不可变且可重用的 。 通过new String("hello")
,即使池中已经存在等效的文字,您仍将创建一个额外的字符串对象。
如字符串javadoc所示
String str1 = "hello";
相当于
char data[] = {'h', 'e', 'l', 'l', 'o'};
String str = new String(data);
正如Java语言规范所建议的那样,常量字符串(在本例中为"hello"
)是String.intern,意味着它们共享相同的内存并引用相同的引用。 所有Interend字符串都存储在一个String常量池中(有关详细信息,请参阅此帖子标识包含本机方法实现的库文件/源 )
使用以下方法对作为常量表达式(第15.28节)的值的字符串进行“ interned”,以便共享唯一的实例
但是,如果您确实使用new String()
创建它,则会分配新的内存
String str = "hello";
String str1 = new String(str);
String str2 = new String(str);
assert: str1 != str2;
//Force strings into constant pool
String str3 = str1.intern();
String str4 = str2.intern();
assert: str == str3;
assert: str3 == str4;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.