我知道当我在下面做的时候: String s =" abc&#34 ;;
JVM检查" abc"字符串常量池上的对象,如果不存在,它将创建对象,其引用将返回到s变量。
但是在这里我想清楚一点,Do String有任何内部机制来检查这种对象的存在。
答案 0 :(得分:1)
JVM检查" abc"字符串常量池上的对象,如果不存在,它将创建对象,其引用将返回到s变量。
错误。常量池中的任何字符串文字都是,由编译器和类加载器放在那里。
但是在这里我想清楚一点,Do String有任何内部机制来检查这种对象的存在。
它有外部机制:String.intern().
但这与您发布的代码无关。
答案 1 :(得分:0)
您可以使用Javadoc所说的String.intern()
(部分)返回字符串对象的规范表示。
String s = new String("abc").intern();
或者,
String s = "abc".intern();
答案 2 :(得分:0)
Do String有任何内部机制来检查这种对象是否存在。
内部......显然是的,因为否则intern()
将无效。
但是此功能在intern
等的JVM本机实现中,并且不在任何公共Java API中公开。
我认为String.intern()
不是有效的测试。当然,如果你在一个字符串上调用intern
并且该字符串对象已经在池中,那么你将获得相同的字符串对象。但是,在您的字符串对象不在池中的情况下,这并没有给出答案。在这种情况下,您无法在通话之前判断结果字符串是否在池中...或者不是。在后一种情况下,您已将一个字符串添加到池作为intern()
调用的副作用。
答案 3 :(得分:0)
测试上述功能的简单测试
String one="abc";
String two="abc";
System.out.println(one==two);
输出
true
这意味着变量1和2都引用相同的对象地址。