如果String就像其他任何类一样,如何使用双引号初始化它?
答案 0 :(得分:292)
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
注意: 字符串文字存储在公共池中。这有助于共享具有相同内容的字符串的存储空间以节省存储空间。通过new运算符分配的String
个对象存储在heap
中,并且没有共享相同内容的存储空间。
答案 1 :(得分:50)
Java将String视为特殊类, 你可以用两种方式初始化
直接指定文字
String a = "adsasdf";
使用新关键字
作为其他对象String a = new String("adsasdf");
如果您想与==
符号进行比较,则需要特别小心:
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引用不同的对象,就像我们初始化任何其他对象时一样。因此,与==
运算符相比,它们是不相等的,而它们的值相等。
答案 2 :(得分:18)
字符串在JLS中得到特殊处理:它是文本存在的两种非原始类型之一(另一种是Class
) * 。
来自the JLS:
字符串文字是对类String [...]。
的实例的引用
*嗯,还有the "null type",其中包含“null literal”null
,但大多数人并不认为“null type”是合适的类型。
答案 3 :(得分:15)
这是Java语言的一个特性。源代码中的字符串文字给予特殊处理。
语言规范here只是说字符串文字是String
类型
答案 4 :(得分:5)
双引号内的文本会创建一个文字String
对象。
String myString = "Some text";
上面的代码使用双引号创建String
对象。
答案 5 :(得分:4)
字符串经常用于编程语言。由于java是面向对象的,因此字符串是一个对象。避免繁琐的新String(“someString”);每次需要字符串对象时,java都允许您使用字符串文字创建字符串对象。
但你应该记住字符串相等。 这是一个简短的JUnit测试来证明我的意思。
@Test
public void stringTest() {
// a string literal and a string object created
// with the same literal are equal
assertEquals("string", new String("string"));
// two string literals are the same string object
assertSame("string", "string");
// a string literal is not the same object instance
// as a string object created with the same string literal
assertFalse("string" == new String("string"));
// java's String.intern() method gives you the same
// string object reference for all strings that are equal.
assertSame("string", new String("string").intern());
}
答案 6 :(得分:2)
- 字符串是Java中的一个类。您是对的,因此我们始终可以使用new
关键字进行初始化。
- 但是,当我们做类似的事情时:
String s = "";
上面的语句被编译器标记为特殊的String对象,然后加载期间的JVM (加载完成)在初始化之前),看到这就是所谓的字符串文字,它存储在字符串文字池中。
- 因此可以使用new()
和""
方法创建String,但后者提供了一个字符串文字,即使在没有对该字符串对象的引用,因为它具有来自字符串文字池的引用。
答案 7 :(得分:2)
提一下。字符串文字是对类String实例的引用,您可以编写如下代码:
"abc".getBytes(); "a:b:c".split(":"); "愛".codePointAt(0);
答案 8 :(得分:2)
Java为我们做了两个步骤。
String str = "hello";
相当于
char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);
像[.NET] [1]有类似的东西。
String(Char[]) constructor
确实
String(char[] value)
添加参考: -
答案 9 :(得分:1)
Java.lang.String
不仅仅是一个班级。它是核心语言不可或缺的一部分。编译器有它的语法糖。例如,""
就像new String("")
的缩写。编写""
时,编译器会将相同的字符串优化到同一个实例以节省空间。 "a" + 5 == "a5" ==> true
编译器有许多东西的语法糖,包括不必在对象版本和它们的本机类型之间进行box / unbox,没有父对象,默认构造函数,...