158

如果 String 和其他类一样,如何使用双引号对其进行初始化?

4

10 回答 10

298

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

在此处输入图像描述

注意: 字符串文字存储在一个公共池中。这有助于为具有相同内容的字符串共享存储以节省存储空间。String通过运算符分配的对象new存储在 中heap,并且对于相同的内容没有共享存储。

于 2013-07-05T12:53:46.647 回答
50

Java把String当作一个特殊的类,可以两种方式初始化

  1. 直接赋值文字

    String a = "adsasdf";
    
  2. 与使用 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 引用不同的对象,就像我们初始化任何其他对象时一样。所以它们与==运算符相比是不相等的,而它们的值是相等的。

于 2013-07-05T12:55:42.257 回答
18

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

JLS

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

* 好吧,还有“null type”和“null literal” null,但大多数人不认为“null type”是正确的类型。

于 2013-07-05T12:51:43.913 回答
15

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

这里的语言规范只是说字符串文字是String类型

于 2013-07-05T12:52:45.623 回答
5

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

String myString = "Some text";

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

于 2013-07-05T12:49:35.863 回答
4

字符串在编程语言中经常使用。由于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());
    }
于 2013-07-05T13:05:50.723 回答
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)

添加参考:-

于 2013-07-05T19:49:34.640 回答
2

- String 是Java中的一个类。你是对的,所以我们总是可以用new关键字初始化。

-但是当我们做类似的事情时:

String s = "";

上面的语句被编译器标记为一个特殊的 String 对象,然后JVM 在加载类期间(加载在初始化之前完成),看到这就是所谓的字符串文字,它存储在字符串文字池中

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

于 2013-07-05T12:56:13.157 回答
2

顺便提一下。字符串文字是对 String 类实例的引用,您可以编写如下代码:

"abc".getBytes();

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

 "爱".codePointAt(0);
于 2013-07-05T13:47:01.730 回答
1

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

编译器有很多东西的语法糖,包括不必在对象版本及其本机类型之间装箱/拆箱,没有父级意味着对象,默认构造函数,......

于 2013-07-05T12:54:59.707 回答