java中字符串的可重用性?

String h = "hi"; 

这里我们将字符串h引用到字符串文字hi。 JVM有一个字符串文字池来存储字符串文字,所以我们可以重用字符串,因为它们是不可变的…

当我们说reusable,这是什么意思? 我们在谈论address吗? 从相同的地址evey时间选择它?

是的,为了简单起见,您可以将其视为从相同地址中选取,但更精确的变量是保持相同的引用 – JVM可用于映射到对象的正确内存地址的标识符(因为对象可以在内存中移动) 。

您可以通过以下代码进行测试:

 String w1 = "word"; String w2 = "word"; String b = new String("word"); // explicitly creating String by calling `new` operator // won't put it in string pool System.out.println(w1 == w2); // true -> variables hold same reference System.out.println(w1 == b); // false -> variable hold different references b = b.intern(); // check if pool contains this string, if not put this string in pool, // then return reference of such string from pool and store it in b variable System.out.println(w1 == b); // true -> now w1 and b hold same reference 

如果是

 String h = "hi"; String i = "hi"; String j = new String("hi"); 

根据JDK的版本,编译器可以执行所谓的实习,并创建表示"hi"的字节数据的单个实例,并在到变量引用之间重用它。 在最新的规范中,所有String 文字都被插入到Permanent Generation中的String池中。

在最后一个语句中使用new关键字将创建与单独对象完全相同的字节的新实例

除非在它们上调用.intern()否则在运行时创建的字符串对象不在 String池中。 这通常是不需要的并且可能导致问题,很少有任何显着的好处。

 h == i; // true h == j; // false j.intern(); h == j; // true 

意味着如果20个对象使用相同的文字字符串:

 private String h = "hi"; 

所有这些对象实际上都会在内存中引用相同的String实例。 并不重要,因为它不可能改变String的内容,因为它是不可变的。 因此可以在对象之间没有问题地共享相同的实例。

JVM中有一个String文字池,其中包含在程序生命周期内创建的所有String 。 通过可重用,意味着当您想要使用具有完全相同字符和编码的另一个String ,不会创建新的String对象。 相反,引用将指向字符串池中已存在的String 。 这称为实习。

这可以完成,因为String在Java中是不可变的。

这样做的原因是为了避免创建新String对象的成本。

在这里查看有关String文字池的内容及其工作原理的更多详细信息: http : //www.xyzws.com/Javafaq/what-is-string-literal-pool/3

另外,看看这个问题: 我不应该做`String s = new String(“一个新的字符串”);`在Java中,即使是自动字符串实习?