java中的字符串创建

java中的字符串创建,java,string,Java,String,在java中,可以使用new运算符或+和+=,创建字符串。那么,所有这些字符串创建技术是否都会检查字符串池中是否已经存在该字符串。如果他们没有力,那么哪种字符串创建技术将检查池。不,他们没有 简单的例子: String s = new String("hell"); String hello = "hello"; s += 'o'; System.out.println(hello == hello.intern()); //True System.out

在java中,可以使用new运算符或+和+=,创建字符串。那么,所有这些字符串创建技术是否都会检查字符串池中是否已经存在该字符串。如果他们没有力,那么哪种字符串创建技术将检查池。

不,他们没有

简单的例子:

    String s = new String("hell");
    String hello = "hello";
    s += 'o';
    System.out.println(hello == hello.intern()); //True
    System.out.println(s == s.intern());         //False
    System.out.println(s == hello);              //False
    System.out.println(s.intern() == hello);     //True
    //To sum up : s != s.intern() == hello.intern() == hello

这里新版本的“s”不是“hello”的内部版本

如果您想获得特定字符串的池版本,可以使用
intern()
方法(就像我上面所做的那样)。这样你肯定有相同的参考


资源:

  • (您可能认为链接指向
    valueOf(double)
    ,但
    intern()
    方法就在后面;)

只有字符串常量和文字会自动插入。如果要连接或创建字符串,则需要实际调用intern()方法。请参见()。

您的意思是什么?如果两个字符串具有相同的值?如果它检查,那么为什么该语句返回false。字符串hello=“hello”,lo=“lo”;System.out.print((hello==(“Hel”+lo))+“”);您的意思是说只有intern()将检查该字符串是否存在于池中;System.out.print((hello==(“Hel”+“lo”))//我不使用intern,但它返回true。@sadananda salam,在这里,编译器看到它可以直接简化为“Hello”,所以在编译时“Hel”+“lo”==“Hello”。你说的是连接和创建字符串。它是字符串对象连接还是字符串常量/文字连接或两者兼而有之。可以通过新的、+、+=运算符创建字符串。我是否需要为所有3个操作员使用intern。@sadananda,我的目的实际上只是举个例子。intern()是隐式的唯一一种情况是在我提到的“字符串常量”和“字符串文本”这两种情况中(实际上只有一种,因为它们是相同的)。获取字符串的所有其他形式(+、+=、StringBuilder.toString()等)都将是新实例,而不是内部实例。