Java中表达式“new String(...)”的用途是什么?

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (2)
  • 关注 (0)
  • 查看 (33)

在查看在线代码示例时,通过使用new运算符,我有时会遇到String对象赋值给String对象的情况。

例如:

String s;
...
s = new String("Hello World");

这当然与之相比

s = "Hello World";

我不熟悉这个语法,不知道它的目的或效果是什么。由于字符串常量通常存储在常量池中,然后以JVM用于处理字符串常量的任何表示形式存在,甚至可以在堆上分配任何东西吗?

提问于
用户回答回答于

你可能需要的一个地方new String(String)是强制一个子字符串复制到一个新的基础字符数组中,如in

small=new String(huge.substring(10,20))

然而,这种行为不幸的是没有记录和执行依赖。

在阅读大文件(一些高达20MB)时,我被烧成了字符串,并在事后将其刻成线条。我结束了包含整个文件的引用char []的行的所有字符串。不幸的是,我无意中在处理文件的时间里保留了对整个数组的引用,因为我保留的那几行文件比我处理文件的时间更长 - 我不得不用new String()它来解决它。

唯一的实现不可知的方法是:

small=new String(huge.substring(10,20).toCharArray());

这不幸的是必须复制数组两次,toCharArray()一次在String构造函数中。

需要通过文档方式来复制现有字符的字符以获得新的字符串; 或String(String)需要改进的文件以使其更加明确(这里有一个含义,但它的含义很模糊,而且很容易解释)。

假定文件没有说明的缺陷

针对这些持续出现的意见,请观察Apache Harmony的实施过程new String()

public String(String string) {
    value = string.value;
    offset = string.offset;
    count = string.count;
}

没错,没有底层数组的副本。然而,它仍然符合(Java 7)String文档,因为它:

初始化新创建的String对象,以便它表示与参数相同的字符序列; 换句话说,新创建的字符串是参数字符串的副本。除非需要显式拷贝原始文件,否则不需要使用此构造函数,因为字符串是不可变的。

突出部分是“参数字符串的副本”; 它不会说“参数字符串的副本和支持字符串的底层字符数组”。

小心你编程到文档而不是一个 实现

用户回答回答于

唯一一次我发现这个有用的是在声明锁变量:

private final String lock = new String("Database lock");

....

synchronized(lock)
{
    // do something
}

在这种情况下,像Eclipse这样的调试工具会在列出线程当前持有或正在等待的锁定时显示字符串。你必须使用“新的字符串”,即分配一个新的字符串对象,否则共享字符串文字可能被锁定在其他不相关的代码中。

扫码关注云+社区