在查看在线代码示例时,我有时会遇到通过使用new运算符将字符串常量赋值给String对象的情况。
例如:
String s;
...
s = new String("Hello World");
当然,这与
s = "Hello World";
我不熟悉这个语法,也不知道它的目的和效果是什么。由于字符串常量通常存储在常量池中,然后以JVM处理字符串常量的任何表示形式存储,那么堆上还会分配什么吗?
发布于 2008-12-24 04:28:03
我发现它唯一有用的时候是在声明锁变量时:
private final String lock = new String("Database lock");
....
synchronized(lock)
{
// do something
}
在这种情况下,像Eclipse这样的调试工具将在列出线程当前持有或等待的锁时显示该字符串。你必须使用"new String",即分配一个新的String对象,因为否则共享的string文本可能会在其他一些不相关的代码中被锁定。
发布于 2013-09-11 20:43:53
Software Monkey和Ruggs描述的这个构造器的唯一实用工具似乎已经从JDK7中消失了。在类String中不再有offset
字段,子字符串始终使用
Arrays.copyOfRange(char[] original, int from, int to)
若要修剪副本的字符数组,请执行以下操作。
发布于 2008-12-24 04:16:56
通常,这表示某人在初始化时不喜欢声明的新风格C++。
在C语言时代,在内部作用域中定义自动变量并不被认为是一种好的形式;C++消除了解析器的限制,并对其进行了扩展。
所以你可以看到代码中有
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才允许在代码中的任何位置进行声明。)所以你是对的,它是不必要的,充其量也是糟糕的风格,甚至可能是糟糕的。
https://stackoverflow.com/questions/390703
复制相似问题