我在一个软件中看到了一些旧的代码片段,没有人记得是谁写的,而不是做一些类似的事情:
String abc = SOME_CONSTANT.toLowerCase()
他们做到了:
String abc = new String(SOME_CONSTANT).toLowerCase()
我看不到其中的任何值——这似乎是一个简单的旧的糟糕编程(例如,不理解String是不可变的(。任何人都能看到好的原因吗?
注意:SOME_CONSTANT定义为-
public static final String SOME_CONSTANT = "Some value";
不,它只是创建了更多的对象(除非编译器对其进行了优化(
将一个字符串包装到另一个字符串中的唯一一点是强制复制。例如
String str = "A very very log string .......";
// uses the same underlying string which we might not need after this.
String str1 = str.substring(0, 1);
// take a copy of which only has one char in it.
String str2 = new String(str1);
我只想做
public static final String SOME_CONSTANT = "Some value";
public static final String LOWER_CONSTANT = SOME_CONSTANT.toLowerCase();
我同意你的看法:编程不好
没有充分的理由。正如您所说,String是不可变的,所以对它调用toLowerCase()
总是会生成一个新的字符串。
new String(someString)
只有在一个重要的情况下才有意义:
String s = incredilyLongString.substring(1000,1005);
String t = new String(s);
假设incredilyLongString的长度为1000000个字符(例如,一个XML文件(,而您只需要其中的5个字符。字符串s仍将占用至少一兆字节的内存,但字符串t将从头开始创建,因此只占用必要的内存。
我不确定,但我认为当您使用new String()
时,您会强制JVM为该String创建一个新对象。如果使用SOME_CONSTANT.toLowerCase()
,JVM将在字符串池中进行搜索,并在存在相同字符串的情况下进行引用。
在这种情况下使用new String()
可能是一种很好的做法,只是为了明确toLowerCase()
只会影响生成的新字符串,而不是常量。
但无论如何,效果是相同的