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

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

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

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


当前回答

为了补充Noel M所说的内容,您可以看看这个问题,这个答案表明常数是被重用的。

http://forums.java.net/jive/message.jspa?messageID=17122

字符串常量总是被“拘禁” 所以真的不需要这样 常数。 字符串s = " ";字符串t = " ";布尔b = s = = t;/ /正确的

其他回答

不要只是说“字符串的内存池以字面形式重用,大小写封闭”。编译器在底层做什么并不是这里的重点。这个问题是合理的,特别是考虑到它所获得的赞成票数。

这是关于对称的,没有它,api就很难为人类使用。众所周知,早期的Java sdk忽略了这条规则,现在为时已晚。下面是我想到的一些例子,你可以随意加入你最喜欢的例子:

BigDecimal。0,但没有AbstractCollection。空的,字符串。空 数组中。List.size() List.add() Set.add()但是Map.put() ByteBuffer.put()还有不要忘了StringBuilder.append() Stack.push()

如果你真的想要一个字符串。EMPTY常量,你可以在你的项目中创建一个名为“Constants”(例如)的实用程序静态final类。这个类将维护你的常量,包括空String…

在同样的思想中,你可以创建ZERO, ONE int常量…在Integer类中不存在,但就像我评论的那样,写和读都很痛苦:

for(int i=Constants.ZERO; ...) {
    if(myArray.length > Constants.ONE) {
        System.out.println("More than one element");
    }
}

Etc.

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

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

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

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

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