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

时间:2013-07-05 12:45:25

标签: java string

如果String就像其他任何类一样,如何使用双引号初始化它?

10 个答案:

答案 0 :(得分:292)

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

enter image description here

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

答案 1 :(得分:50)

Java将String视为特殊类, 你可以用两种方式初始化

  1. 直接指定文字

    String a = "adsasdf";
    
  2. 使用新关键字

    作为其他对象
    String a = new String("adsasdf");
    
  3. 如果您想与==符号进行比较,则需要特别小心:

    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,没有父对象,默认构造函数,...