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中的这种行为substring和trim改变.
为了给出原始的声明风格,并为性能设计师引入了String文字.
但是当您使用new关键字时,您将在堆上显式创建不在常量池中的对象.
当在堆上创建对象时,没有办法彼此共享该内存,并且与常量池不同,它们变得完全陌生.
打破堆和常量池之间的这个障碍String interning将帮助你.
string interning是一种只存储每个不同字符串值的一个副本的方法,该值必须是不可变的
请记住,常量池也是堆的一小部分,具有一些额外的好处,可用于共享内存.
| 归档时间: |
|
| 查看次数: |
2702 次 |
| 最近记录: |