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

一个快速而混乱的问题。 如果A级和B级内有这个: –

String name="SomeName"; 

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

 String example=new String("something"); 

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

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

 String a = "Hello"; String b = "Hello"; 

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

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 

字符串

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 

编辑添加:运行此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"; } 

打印出true

如果“某些东西”字面上硬编码到您的源代码中,那么这两个变量将指向相同的内存中String对象。

前一个声明总是创建一个副本,并且在其所有应用程序终止以回收内存之前一直使用它。

当执行GC并且没有强烈的参考时,字符串就像其他对象一样被回收。 即使是intern’ed Strings也可以在不再使用时进行清理。

根据Java规范,字符串文字(在字节代码中定义为文字的字符串)是“实习”,因此对该文字的任何引用都将获得完全相同的指针,即使引用是相同的文字也是如此。完全独立的课程。

在运行时构造的字符串(例如, “abc”+“xyz”新的字符串(“abc”) )将不会被实现,因此指针通常是唯一的。 (但请注意,优化编译器可能会将“abc”+“xyz”组合到单个文字“abcxyz”中 ,从而产生一个实习值。)

我会在上面的所有解决方案中添加一个细节。 String interning只是Java / C#编译器的优化。 依靠它是不好的,因为它可以在两种情况下都被关闭。

它在不同的编译器/ VM的实现中也可能表现不同