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中,即使是自动字符串实习?