为什么jvm每次使用new关键字创建字符串时都会创建新的字符串Object

Har*_*tel 10 java string string-pool

如果为内存优化jvm创建string pool,那么为什么每次我们使用new关键字创建字符串时它都会创建新的对象,即使它存在于string pool

Ste*_*n C 29

...为什么每次使用new关键字创建字符串时Java都会创建新的Object,即使它存在于字符串池中?

因为你明确告诉它!该new运营商总是会创建一个新的对象. JLS 15.9.4说:

"类实例创建表达式的值是对新创建的指定类对象的引用.每次计算表达式时,都会创建一个新对象. "


为了记录,调用几乎总是一个错误new String(String)...但在不起眼的情况下它可能是有用的.可以想象你可能想要一个equals返回true==给出的字符串false.打电话new String(String)给你.


对于老版本的Java,则substring,trim以及其他可能的String方法将会给你的共享存储备份与原始的字符串.在某些情况下,这可能会导致内存泄漏.new String(str.trim())例如,调用会以创建修剪字符串的新副本为代价来防止内存泄漏.该String(String)构造保证分配一个新的支持数组,以及给你一个新的String对象.

Java 7中的这种行为substringtrim改变.

  • 也适用于测试 - 强制排除那些讨厌的比较`String`和'==`错误... (6认同)

Sur*_*tta 5

为了给出原始的声明风格,并为性能设计师引入了String文字.

但是当您使用new关键字时,您将在堆上显式创建不在常量池中的对象.

当在堆上创建对象时,没有办法彼此共享该内存,并且与常量池不同,它们变得完全陌生.

打破堆和常量池之间的这个障碍String interning将帮助你.

string interning是一种只存储每个不同字符串值的一个副本的方法,该值必须是不可变的

请记住,常量池也是堆的一小部分,具有一些额外的好处,可用于共享内存.