首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >表达式"new String(...)“的用途是什么?在Java中?

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

Stack Overflow用户
提问于 2008-12-24 03:57:39
回答 4查看 20K关注 0票数 75

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

例如:

代码语言:javascript
复制
String s;
...
s = new String("Hello World");

当然,这与

代码语言:javascript
复制
s = "Hello World";

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

EN

回答 4

Stack Overflow用户

发布于 2008-12-24 04:28:03

我发现它唯一有用的时候是在声明锁变量时:

代码语言:javascript
复制
private final String lock = new String("Database lock");

....

synchronized(lock)
{
    // do something
}

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

票数 10
EN

Stack Overflow用户

发布于 2013-09-11 20:43:53

Software Monkey和Ruggs描述的这个构造器的唯一实用工具似乎已经从JDK7中消失了。在类String中不再有offset字段,子字符串始终使用

代码语言:javascript
复制
Arrays.copyOfRange(char[] original, int from, int to) 

若要修剪副本的字符数组,请执行以下操作。

票数 4
EN

Stack Overflow用户

发布于 2008-12-24 04:16:56

通常,这表示某人在初始化时不喜欢声明的新风格C++。

在C语言时代,在内部作用域中定义自动变量并不被认为是一种好的形式;C++消除了解析器的限制,并对其进行了扩展。

所以你可以看到代码中有

代码语言:javascript
复制
int q;
for(q=0;q<MAX;q++){
    String s;
    int ix;
    // other stuff
    s = new String("Hello, there!");
    // do something with s
}

在极端情况下,所有的声明可能都在函数的顶部,而不是在封闭的作用域中,比如这里的for循环。

不过,通常情况下,这会导致字符串ctor被调用一次,并丢弃生成的字符串。(正是为了避免这种情况,Stroustrup才允许在代码中的任何位置进行声明。)所以你是对的,它是不必要的,充其量也是糟糕的风格,甚至可能是糟糕的。

票数 -1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/390703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档