Java 在运行'String'的方法之前,用'newstring(…)'包装'String'有什么好处吗?

Java 在运行'String'的方法之前,用'newstring(…)'包装'String'有什么好处吗?,java,string,Java,String,我在一个软件中看到了一些旧的代码片段,没有人记得是谁编写的,而不是执行以下操作: String abc = SOME_CONSTANT.toLowerCase() 它们是: String abc = new String(SOME_CONSTANT).toLowerCase() 我看不出这里面有什么价值——这看起来像是一个非常糟糕的编程(例如,不理解字符串是不可变的)。任何人都能找到这样做的理由吗 注:某些常量定义为- public static final String SOME_CONS

我在一个软件中看到了一些旧的代码片段,没有人记得是谁编写的,而不是执行以下操作:

String abc = SOME_CONSTANT.toLowerCase()
它们是:

String abc = new String(SOME_CONSTANT).toLowerCase()
我看不出这里面有什么价值——这看起来像是一个非常糟糕的编程(例如,不理解字符串是不可变的)。任何人都能找到这样做的理由吗

注:某些常量定义为-

public static final String SOME_CONSTANT = "Some value";

不,它只是创建了更多的对象(除非编译器优化了它)

不,它只是创建了更多的对象(除非编译器优化了它)

我同意你的看法:这是糟糕的编程

我同意你的看法:这是糟糕的编程

没有好的理由。正如您所说,字符串是不可变的,因此对其调用
toLowerCase()
将始终生成一个新字符串。

没有充分的理由。正如您所说,字符串是不可变的,因此对其调用
toLowerCase()
始终会生成一个新字符串。

将字符串包装到另一个字符串中的唯一一点是强制复制。e、 g

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();

将字符串包装到另一个字符串中的唯一一点是强制复制。e、 g

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 s = incredilyLongString.substring(1000,1005);
String t = new String(s);
假设IncredilLongString的长度为1000000个字符(例如,一个XML文件),您只需要5个字符。字符串s仍将占用至少1兆字节的内存,但字符串t将从头创建,因此只占用必要的内存

只有在一个重要情况下才有意义:

String s = incredilyLongString.substring(1000,1005);
String t = new String(s);

假设IncredilLongString的长度为1000000个字符(例如,一个XML文件),您只需要5个字符。字符串s仍将占用至少1兆字节的内存,但字符串t将从头创建,因此只占用必要的内存。

我不确定,但我认为当您使用
new String()
时,会强制JVM为该字符串创建一个新对象。如果使用
SOME_CONSTANT.toLowerCase()
JVM将在字符串池中搜索,如果存在相同的字符串,则只进行引用

可能在这种情况下使用
newstring()
是一种很好的做法,只是为了明确
toLowerCase()
将只影响生成的新字符串,而不是常量


但无论如何,效果是一样的,我不确定,但我认为当您使用
newstring()
时,会强制JVM为该字符串创建一个新对象。如果使用
SOME_CONSTANT.toLowerCase()
JVM将在字符串池中搜索,如果存在相同的字符串,则只进行引用

可能在这种情况下使用
newstring()
是一种很好的做法,只是为了明确
toLowerCase()
将只影响生成的新字符串,而不是常量


但无论如何,效果是一样的

为什么不干脆
公共静态最终字符串SOME_CONSTANT=“SOME value”?在任何情况下,看起来代码有时需要大写,有时需要小写。。。上帝知道为什么这会改变常数本身,而这不可能是OP的想法。也许其他地方需要
一些常量来定义大小写。您甚至可以使用String.intern()作为较低的常量结果。interesting,但对于这种情况无效,因为无论如何都是toLowerCase,所以需要一个新字符串。是的,在这种情况下,我们没有使用常量的程序,因此我们甚至可以跳过声明它们。但在其他情况下,相同的字符串可能会被置于其他上下文中,或者甚至与相同的_常量相同,我假设该常量在实际应用程序中会有另一个值;-)我见过很多例子,其中.lowercase()、null检查等只是为了确保即使之前已经执行了5行代码。为什么不只是
public static final String SOME_CONSTANT=“SOME value”?在任何情况下,看起来代码有时需要大写,有时需要小写。。。上帝知道为什么这会改变常数本身,而这不可能是OP的想法。也许其他地方需要
一些常量来定义大小写。您甚至可以使用String.intern()作为较低的常量结果。interesting,但对于这种情况无效,因为无论如何都是toLowerCase,所以需要一个新字符串。是的,在这种情况下,我们没有使用常量的程序,因此我们甚至可以跳过声明它们。但在其他情况下,相同的字符串可能会被置于其他上下文中,或者甚至与相同的_常量相同,我假设该常量在实际应用程序中会有另一个值;-)我见过很多这样的情况。lowercase()、null检查等只是为了确保即使这是在5行代码之前完成的。你是对的。。。最糟糕的“坏”编程。。。那些不懂基本概念,却认为自己掌握了这些概念的人!你是对的。。。最糟糕的“坏”编程。。。那些不懂基本概念,却认为自己掌握了这些概念的人!字符串
s
将包含对原始
增量长字符串中存储的
char[]
的引用-它不会复制该字符串。因此,只要两个字符串仍然被引用,内存就不会成为问题。只有松开对
incredillongstring
的引用后,才能从中获取值。字符串
s
将包含对原始
incredillongstring
中存储的
char[]
的引用-它不会复制它。因此,只要两个字符串仍然被引用,内存就不会成为问题。只有当您松开对
incredillongstring
的引用时,您才会从中获得一个值。字符串是不可变的-
toLowerCase()
无论如何创建一个新实例,它永远不会影响常量。字符串是不可变的-
toLowerCase()
无论如何创建一个新实例,它永远不会影响常数。事实上,它对同步有微妙的影响