如何使用“”初始化字符串?

如果 String 和其他类一样是一个类,那么如何使用双引号初始化它呢?

12318 次浏览

双引号中的文本创建一个文本 String对象。

String myString = "Some text";

上面的代码使用双引号创建 String对象。

String 在 JLS 中得到了特殊的处理: 它是存在文字的两种非原语类型之一(另一种是 Class) *

来自 JLS:

字符串文字是对类‘ String [ ... ]的实例的引用。

* 还有 “空类型”和它的“ null 值”null,但是大多数人不认为“ null 类型”是一个合适的类型。

这是 Java 语言的一个特性,源代码中的字符串文字被给予了特殊的处理。

语言规范 给你只是表示字符串文字的类型为 String

Java 字符串是特殊的

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

注意: 字符串存储在一个公共池中。这有助于共享具有相同内容的字符串的存储,从而节省存储空间。通过 new操作符分配的 String对象存储在 heap中,不共享相同内容的存储。

Java.lang.String不仅仅是一个类。它是核心语言不可或缺的一部分。编译器有它的语法糖。例如,""就像是 new String("")的缩写。编写 ""时,编译器优化同一实例的相同字符串以节省空间。"a" + 5 == "a5" ==> true

编译器有很多语法上的优势,包括不必在对象版本和它们的本机类型之间进行装箱/拆箱,没有父类意味着对象、缺省构造函数、 ... ..。

Java 将 String 视为一个特殊的类, 您可以用这两种方式进行初始化

  1. 直接赋值文字

    String a = "adsasdf";
    
  2. As other Objects using new keyword

    String a = new String("adsasdf");
    

You need to take special care when you wants to compare with == 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 引用不同的对象,就像我们初始化任何其他对象时一样。所以它们与 ==运算符相比是不相等的,而它们的值是相等的。

String 是 爪哇咖啡中的一个类。你是对的,所以我们总是可以用 new关键字进行初始化。

但是当我们这样做的时候:

String s = "";

上面的语句被 编译器标记为 特殊字符串对象,然后是类的 加载过程中的 JVM(在初始化之前加载) ,看到这个被称为 字符串的类,它存储在 字符串文字池字符串文字池中。

- 因此可以使用 new()""方法创建 String,但是 < strong > 后者提供了一个字符串文字,即使没有对该字符串对象的引用,该字符串文字也会保留在堆中,因为它有一个来自字符串文字池的引用。

字符串在编程语言中经常使用。因为 java 是面向对象的,所以字符串是一个对象。为了避免繁琐的新 String (“ somString”) ; 语句,每次您需要一个字符串对象时,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());
}

顺便说一句。字符串文字是对类 String 实例的引用,你可以这样编写代码:

"abc".getBytes();


"a:b:c".split(":");


"愛".codePointAt(0);

Java 为我们做了两个步骤。

String str = "hello";

相当于

char data[] = {'h', 'e', 'l' , 'l', 'o'};
String str = new String(data);

就像[ . NET ][1]得到了类似的东西。

String(Char[]) constructor

是的

String(char[] value)

添加引用:-