Java 中对字符串对象的字符串常量赋值:理解“new String(...)”
在检查代码示例时,您可以遇到过使用“new”运算符将 String 常量分配给 String 对象的情况。这种语法引发了关于其目的和效果的问题,特别是考虑到常量池中字符串常量的典型存储。
“new String(...)”的目的
“new String(...)”的主要目的是创建一个新的 String 对象,其中包含指定 String 文字的副本。与“s = “Hello World”;”引用常量池中存储的现有字符串文字不同,“s = new String(“Hello World”);”使用自己的字符数组后备存储在堆中创建一个新对象。
堆上的分配
是的,在“new String(... )”,在堆上分配一个新对象来存储 String 的值。这与引用常量池中现有的字符串文字相反。
用例和实现依赖
在某些情况下,您可能希望强制使用不同的副本使用“new String(...)”的内部字符数组。例如:
small = new String(huge.substring(10, 20))
但是,此行为未记录且依赖于实现。不同的 Java 虚拟机 (JVM) 可能会以不同的方式处理此表达式。
陷阱和限制
Apache Harmony 中 String(String) 的早期实现实际上并没有创建一个底层字符数组的副本。这可能会导致潜在的内存问题,例如即使不再需要也保留对大型字符数组的引用。
要使用单独的字符副本创建新的 String 对象,有必要使用:
small = new String(huge.substring(10, 20).toCharArray());
这种方法确保了字符的不同副本,但需要两个数组副本,可以是
结论
“new String(...)”表达式在堆中创建一个新的 String 对象,其中包含指定 String 文字的副本。虽然它在某些情况下很有用,但重要的是要了解其潜在的陷阱和实现依赖性,以避免意外行为。
以上是何时以及为何在 Java 中使用'new String(...)”?的详细内容。更多信息请关注PHP中文网其他相关文章!