繁体   English   中英

Java中的字符串初始化

[英]String initialising in Java

考虑以下代码:

  1. 不使用new String()怎么创建str1对象?
  2. 为什么str1str2对象引用相同的内存位置?

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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM