如果 String 和其他类一样,如何使用双引号对其进行初始化?
10 回答
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
通过运算符分配的对象new
存储在 中heap
,并且对于相同的内容没有共享存储。
Java把String当作一个特殊的类,可以两种方式初始化
直接赋值文字
String a = "adsasdf";
与使用 new 关键字的其他对象一样
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 引用不同的对象,就像我们初始化任何其他对象时一样。所以它们与==
运算符相比是不相等的,而它们的值是相等的。
String 在 JLS 中得到特殊处理:它是存在文字的两种非原始类型之一(另一种是Class
) *。
从JLS:
字符串文字是对类 `String [...] 的实例的引用。
* 好吧,还有“null type”和“null literal” null
,但大多数人不认为“null type”是正确的类型。
这是Java语言的一个特性。源代码中的字符串文字被给予特殊处理。
这里的语言规范只是说字符串文字是String
类型
双引号内的文本创建一个文字String
对象。
String myString = "Some text";
上面的代码String
使用双引号创建了一个对象。
字符串在编程语言中经常使用。由于java是面向对象的,因此字符串是一个对象。避免繁琐的 new 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());
}
Java 为我们做了一个两步过程。
String str = "hello";
相当于
char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);
就像 [.NET][1] 得到了类似的东西。
String(Char[]) constructor
做
String(char[] value)
添加参考:-
- String 是Java中的一个类。你是对的,所以我们总是可以用new
关键字初始化。
-但是当我们做类似的事情时:
String s = "";
上面的语句被编译器标记为一个特殊的 String 对象,然后JVM 在加载类期间(加载在初始化之前完成),看到这就是所谓的字符串文字,它存储在字符串文字池中。
-因此可以使用new()
and""
方法创建一个字符串,但后者提供了一个字符串文字,即使没有对该字符串对象的引用,它也会保留在堆中,因为它具有来自字符串文字池的引用。
顺便提一下。字符串文字是对 String 类实例的引用,您可以编写如下代码:
"abc".getBytes(); "a:b:c".split(":"); "爱".codePointAt(0);
Java.lang.String
不只是一个类。它是核心语言的一个组成部分。编译器有它的语法糖。例如,""
就像 的缩写一样new String("")
。编写时""
,编译器会将相同的字符串优化到相同的实例以节省空间。"a" + 5 == "a5" ==> true
编译器有很多东西的语法糖,包括不必在对象版本及其本机类型之间装箱/拆箱,没有父级意味着对象,默认构造函数,......