问题
如果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
**注意:**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"是一个合适的类型。