Java:有关字符串的初学者问题

时间:2019-04-11 06:09:03

标签: java string object

在Java中创建字符串时,这两者之间有什么区别?

String test = new String();
test = "foo";

String test = "foo";

何时需要使用关键字new?还是这两个基本相同,并且它们都创建了一个新的String对象?

3 个答案:

答案 0 :(得分:4)

在第一个代码段中,创建一个新的空字符串,然后立即用字符串文字覆盖它。您创建的新字符串将丢失,最终将被垃圾回收。
创建它是没有意义的,您应该只使用第二个片段。

答案 1 :(得分:0)

new String()将使用自己的身份哈希码创建对象字符串的新实例。当创建类似String string = "myString";的字符串时,Java会尝试通过搜索已经创建的字符串来重用该字符串,以查找确切的字符串。如果找到,它将返回与此字符串相同的身份哈希码。这将导致,如果您创建例如字符串的身份哈希码,您将获得相同的值。

示例:

public class Stringtest {
   public static void main(String[] args) {
      final String s = "myString";
      final String s2 = "myString";
      final String otherS = new String("myString");

      //S and s2 have the same values
      System.out.println("s: " + System.identityHashCode(s));
      System.out.println("s2: " + System.identityHashCode(s2));

      //The varaible otherS gets a new identity hash code
      System.out.println("otherS: " + System.identityHashCode(otherS));
   }
}

在大多数情况下,您不需要创建字符串的新对象,这会导致在使用例如HashMap或类似的东西。

因此,仅在真正需要时使用new String创建新字符串。通常使用String yourString = "...";

答案 2 :(得分:0)

这是一个示例程序,可帮助您了解字符串在Java中的工作方式。

import java.util.Objects;

public class TestStrings {

    public static void main(String[] args) {
        String test = new String();
        System.out.println("For var test value is '"+ test+ "' and object identity is "+ System.identityHashCode(test));
        test = "foo";
        System.out.println("For var test after reassignment value is '"+ test+ "' and object identity is "+ System.identityHashCode(test));
        String test2 = "foo";
        System.out.println("For var test2 value is '"+ test2+ "' and object identity is "+ System.identityHashCode(test2));
        String test3 = new String("foo");

        System.out.println("For var test3 value is '"+ test3+ "' and object identity is "+ System.identityHashCode(test3));
    }
}

运行此命令,以查看为变量testtest2test3打印的身份哈希代码会发生什么情况。

基本上,Java尝试优化将字符串创建为文字时如何创建字符串。 Java尝试维护一个字符串池,如果再次使用相同的文字,它将使用该字符串池中的相同对象。可以这样做是因为java中的字符串是不可变的。

您可以在这个问题What is Java String interning?

上进一步阅读