在运行方法之前用“new String(..)”包装“String”有什么好处吗

  • 本文关键字:String 包装 方法 运行 new java string
  • 更新时间 :
  • 英文 :


我在一个软件中看到了一些旧的代码片段,没有人记得是谁写的,而不是做一些类似的事情:

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()只会影响生成的新字符串,而不是常量。

但无论如何,效果是相同的

相关内容

  • 没有找到相关文章

最新更新