__如果您确实有问题,那么 实习 是正确的解决方案。Java将String文字和许多其他String存储在内部池中,并且每当 要
创建新的String时,JVM都会首先检查该String是否已在池中。如果是,它将不会创建新实例,而是将引用传递给 被嵌入的 String对象。
有两种方法可以控制此行为:
String interned = String.intern(aString); // returns a reference to an interned StringString notInterned = new String(aString); // creates a new String instance (guaranteed)
因此, 也许 这些库确实为所有xml属性值创建了新实例。这是可能的,您将无法更改。
实习生 具有全球影响力。可以立即对“任何对象”使用一个Interned String(此视图实际上没有任何意义,但可能有助于理解它)。
因此,假设我们在class
Foo,method中有一行
foolish:
String s = "ABCD";
字符串文字立即被插入。JVM检查池中是否已经有“ ABCD”,如果没有,则将“ ABCD”存储在池中。JVM将对内部字符串的引用分配给
s。
现在,也许在另一个类
Bar的方法中
barbar:
String t = "AB"+"CD";
然后,JVM将像上面那样实习“ AB”和“ CD”,创建串联的String,看一下(如果已经被嵌入),嘿,是的,并将对嵌入的字符串“
ABCD”的引用分配给
t。
呼叫
"PROD".intern()可能成功或失败。是的,它 会
实习生字符串
"PROD"。但是,jibx确实有可能使用以下命令为属性值创建新的字符串:
String value = new String(getAttributevalue(attribute));
在这种情况下, value 不会引用内部String(即使
"PROD"在池中),而是引用堆上的新String实例。
而且,对于命令中的另一个问题:这仅在运行时发生。编译仅创建类文件,字符串池是对象堆上的数据结构,并且由JVM使用,执行应用程序。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)