问题

如果String是一个类,就像任何其他类一样,如何使用双引号初始化它?


#1 热门回答(286 赞)

Java String is Special> Java的设计者决定在面向对象的语言中保留原始类型,而不是将所有东西都作为对象,以便提高语言的性能。基元存储在调用堆栈中,这需要较少的存储空间并且操作起来更便宜。另一方面,对象存储在程序堆中,这需要复杂的内存管理和更多的存储空间。出于性能原因,Java的String设计在原语和类之间。

例如

String s1 = "Hello";              // String literal
String s2 = "Hello";              // String literal
String s3 = s1;                   // same reference
String s4 = new String("Hello");  // String object
String s5 = new String("Hello");  // String object

enter image description here

**注意:**String literals存储在公共池中。这便于共享具有相同内容的字符串的存储以节省存储。通过新运算符分配的对象存储在heap中,并且没有共享相同内容的存储。


#2 热门回答(47 赞)

Java将String视为特殊类,你可以通过两种方式进行初始化

  • 直接分配文字字符串a ="adsasdf";
  • 使用新关键字的其他对象String a = new String("adsasdf");

如果你想与==sign比较,你需要特别小心:

String a = "asdf";
String b = "asdf";
System.out.println(a == b);  // True
System.out.println(a.equals(b)); // True

String a = new String("asdf");
String b = new String("asdf");
System.out.println(a == b);  // False
System.out.println(a.equals(b)); // True

这是因为在第一种情况下,对象a和b保存在名为literal pool的内容中,并且它们都引用相同的对象,因此它们在两个方面都是相同的。

但在第二种情况下,a和b引用不同的对象,就像我们初始化任何其他对象时一样。因此,与==操作员相比,它们是不相等的,而它们的值相等。


#3 热门回答(17 赞)

字符串在JLS中得到特殊处理:它是文本存在的两种非原始类型之一(另一种是Class)*。

Fromthe JLS

字符串文字是对类String [...]的实例的引用。
*好吧,还有the "null type",它的"null literal"null,但大多数人并不认为"null type"是一个合适的类型。


原文链接