在弦乐中几乎没有疑问,
我可能是错误的某些陈述,因为我写这是基于我的理解,从不同的文章在互联网上,请容忍我。
发布于 2015-11-12 09:06:35
在java中,如果JVM标识了literal("xyz"),它将立即在字符串常量池中创建一个对象,同时如果它标识了新的,那么它将在heap.now中创建一个对象,然后转到查询:
1.String str1 =新字符串( "newStr1“);这里的JVM”newStr1“是字面的,因此它将遵循与文字相对应的规则,因此它在字符串常量池中创建了一个对象。新字符串(“newStr1”)--这里对于新操作符,它遵循与新运算符相对应的规则,因此它也将在堆中创建一个对象。
2.intern():here实习生不会在pool.interno中创建一个对象,用于将字符串对象更改为引用字符串池而不是堆。string s1 = new String("newStr1") --在这里,s1将指向堆区域而不是字符串常量池。 string s1 = new String("newStr1").intern()将使s1指向字符串常量池,因为newStr1是在堆中创建的,而字符串常量s1将不处理字符串对象的创建。
3.permgen :用于有效垃圾收集堆的被划分为不同的区域,比如permgen也是一个区域,仍然是堆中的一个区域,它是heap.please中的一个区域,引用了堆区域的http://www.cubrid.org/blog/dev-platform/understanding-java-garbage-collection/链接。
发布于 2015-11-12 03:22:58
只要认为字符串池是存储String的特殊位置就行了。您可以考虑字符串池也在堆中(据我所知,实际上它是在堆中),只需小心处理该池,即其中的每个值只有一个副本,因此可以很容易地重用同一个实例(例如,当您声明字符串文本时)。
"newStr1"是一个字符串文本,它将在/looked中从池中创建。String str1 = new String (...)告诉JVM创建一个String对象的新实例。因此,它只是简单地遵循你让它做的事情。当然,JIT可以对其进行优化以避免创建新实例(它现在是否正在进行这样的优化?)但是,您描述的行为只是JVM要做的事情。new String(...) (它创建了一个新的String对象)之后,您调用了intern(),因此在字符串池中进行查找。再一次,行为是它被告知要做的。是的,你是对的,在你的例子中,结果和String str1="asdf";一样,做了一些不必要的工作。但是,在某些情况下,构造函数不接受字符串文本,而且您仍然希望将字符串强制放在字符串池中。在这种情况下,intern()将变得有意义。https://stackoverflow.com/questions/33663733
复制相似问题