我知道,每次键入字符串字面值“”时,字符串池中都会引用相同的string对象。

但是为什么字符串API不包括一个公共静态最终字符串空= "";,所以我可以使用String.Empty引用?

它至少可以节省编译时间,因为编译器知道要引用现有的String,而不必检查它是否已经被创建以供重用,对吗?就我个人而言,我认为字符串字面量的激增,尤其是微小的字符串,在很多情况下是一种“代码气味”。

所以在没有绳子的背后有一个伟大的设计原因。是空的,还是语言的创造者根本不同意我的观点?


当前回答

所有这些“”字面值都是同一个对象。为什么要制造那么多额外的复杂性呢?它只是输入的时间更长,更不清楚(编译器的成本是最小的)。由于Java的字符串是不可变的对象,因此根本不需要区分它们,除非可能是为了提高效率,但对于空字符串字面值来说,这不是什么大问题。

如果你真的想要一个EmptyString常量,可以自己创建。但这样做只会鼓励更冗长的代码;这样做永远不会有任何好处。

其他回答

我知道,每次我输入String字面值“”,相同的String对象在String池中被引用。 没有这样的保证。你不能在应用程序中依赖它,这完全由jvm决定。

或者语言的创造者只是不同意我的观点? 是的。对我来说,这不是什么重要的事。

使用org.apache.commons.lang.StringUtils.EMPTY

Apache StringUtils也解决了这个问题。

其他方案的缺点:

isEmpty() -不是空安全的。如果 string为空,抛出NPE Length() == 0 -同样不是空安全的。 也没有考虑到 空格的字符串。 与EMPTY常量的比较- 5月 不是空安全的。空白的问题

Granted StringUtils是另一个可以拖动的库,但它工作得非常好,节省了大量的时间和检查空值或优雅地处理npe的麻烦。

对于那些声称""和字符串。空都是可互换的还是说“”更好,你就大错特错了。

每次你执行myVariable = "";您正在创建对象的实例。 如果Java的String对象有一个空的公共常量,那么对象就只有一个实例""

如:-

String.EMPTY = ""; //Simply demonstrating. I realize this is invalid syntax

myVar0 = String.EMPTY;
myVar1 = String.EMPTY;
myVar2 = String.EMPTY;
myVar3 = String.EMPTY;
myVar4 = String.EMPTY;
myVar5 = String.EMPTY;
myVar6 = String.EMPTY;
myVar7 = String.EMPTY;
myVar8 = String.EMPTY;
myVar9 = String.EMPTY;

10个(11个包括String.EMPTY)指向一个对象

或:-

myVar0 = "";
myVar1 = "";
myVar2 = "";
myVar3 = "";
myVar4 = "";
myVar5 = "";
myVar6 = "";
myVar7 = "";
myVar8 = "";
myVar9 = "";

10个指针指向10个对象

这是低效的,在一个大型应用程序中,可能是非常重要的。

也许Java编译器或运行时足够高效,可以自动将“”的所有实例指向同一个实例,但也可能不是这样,需要进行额外的处理才能确定。

所有这些“”字面值都是同一个对象。为什么要制造那么多额外的复杂性呢?它只是输入的时间更长,更不清楚(编译器的成本是最小的)。由于Java的字符串是不可变的对象,因此根本不需要区分它们,除非可能是为了提高效率,但对于空字符串字面值来说,这不是什么大问题。

如果你真的想要一个EmptyString常量,可以自己创建。但这样做只会鼓励更冗长的代码;这样做永远不会有任何好处。