如果你真的有问题,实习将是正确的解决方案. Java在内部池中存储字符串文字和许多其他字符串,每当要创建新的字符串时,JVM首先检查字符串是否已在池中.如果是,则不会创建新实例,而是将引用传递给实体化String对象.
有两种方法可以控制此行为:
String interned = String.intern(aString); // returns a reference to an interned String
String notInterned = new String(aString); // creates a new String instance (guaranteed)
也许,库真的为所有xml属性值创建了新实例.这是可能的,您将无法更改它.
实习生具有全球影响力.一个实习的字符串立即“可用于任何对象”(这个视图实际上没有意义,但它可能有助于理解它).
所以,假设我们在Foo类中有一行,方法愚蠢:
String s = "ABCD";
字符串文字立即被实习. JVM检查,如果“ABCD”已经在池中,如果没有,“ABCD”存储在池中. JVM将对interned String的引用分配给s.
现在,也许在另一个类Bar中,在方法栏中:
String t = "AB"+"CD";
然后JVM将像上面一样实习“AB”和“CD”,创建连接的String,看看,如果它已经是intered,嘿,是的,并且将对interned String“ABCD”的引用分配给t.
调用“PROD”.intern()可能会起作用或失败.是的,它将实习字符串“PROD”.但是有一个机会,jibx真的为属性值创建了新的字符串
String value = new String(getAttributeValue(attribute));
在这种情况下,value将不会引用一个interned String(即使“PROD”在池中),而是对堆上的新String实例的引用.
而且,对于命令中的另一个问题:这只发生在运行时.编译只是创建类文件,String池是对象堆上的数据结构,由执行应用程序的JVM使用.