Java中具有相同价值的字符串?

Dan*_*iel 11 java string object

一个快速而混乱的问题.如果A类和B类内有这个: -

String name="SomeName"; 
Run Code Online (Sandbox Code Playgroud)

并且这两个类都是实例化的,两个实例引用变量"name"的相同内存位置是否正确,当我们执行此objA.name或objB.name?它具有值"SomeName",并且由于String是不可变的,因此同一JVM的两个类的多个实例重复使用相同的变量?我在网上看过,除非有

String example=new String("something"); 
Run Code Online (Sandbox Code Playgroud)

如果使用,前一个声明总是创建一个副本,并且它将被使用,直到它的所有应用程序都被终止以回收内存.注意:我看到了几个答案,我依靠哪一个答案,有人可以得出结论.谢谢大家的努力,欣赏它.

Rev*_*nzo 26

是的,如果您创建两个字符串,如:

String a = "Hello";
String b = "Hello";
Run Code Online (Sandbox Code Playgroud)

它们将是完全相同的对象.你可以自己测试一下

System.out.println(a == b);

如果它们是同一个对象,那么它们对字符数组的内部引用将完全相同.

现在,如果你这样做String c = "Hell" + "o";,它将没有相同的引用,因为它将使用StringBuilder(内部)构建.

有很多很好的信息在这里.

相关部分有(注意:以下内容是从该网站复制的):


如上所述,构造字符串有两种方法:通过赋值字符串文字或通过new运算符和构造函数显式创建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
Run Code Online (Sandbox Code Playgroud)

字符串

Java设计了一种特殊的机制来保持String文字 - 在一个所谓的字符串公共池中.如果两个String文字具有相同的内容,则它们将共享公共池内的相同存储位置.采用这种方法来节省常用字符串的存储空间.另一方面,通过new运算符创建的String对象保留在堆中.堆中的每个String对象都有自己的存储空间,就像任何其他对象一样.即使两个String对象具有相同的内容,堆中也不存在共享存储.您可以使用String类的equals()方法来比较两个字符串的内容.您可以使用关系相等运算符'=='来比较两个对象的引用(或指针).研究以下代码:

s1 == s1;         // true, same pointer
s1 == s2;         // true, s1 and s1 share storage in common pool
s1 == s3;         // true, s3 is assigned same pointer as s1
s1.equals(s3);    // true, same contents
s1 == s4;         // false, different pointers
s1.equals(s4);    // true, same contents
s4 == s5;         // false, different pointers in heap
s4.equals(s5);    // true, same contents
Run Code Online (Sandbox Code Playgroud)

编辑添加:运行此SSCE以测试两个常量字符串到不同类的引用相等性:

class T {
  String string = "Hello";

  public static void main(String args[]) {
    T t = new T();
    T2 t2 = new T2();
    System.out.println(t.string == t2.string);
  }
}


class T2 {
  String string = "Hello";
}
Run Code Online (Sandbox Code Playgroud)

打印出来true.

  • 在`("地狱"+"o")!="你好"的一部分.它并不总是如此; 编译器可能会在内部优化"地狱"+"o"`到"你好" (6认同)