我知道,每次我键入字符串文字""时,字符串池中都会引用相同的字符串对象.

但是为什么字符串API不包含public static final String Empty = "";,这样我就可以引用String.Empty了?

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

那么,没有细绳的背后是否有一个宏大的设计原因呢.还是语言创作者根本不同意我的观点?

推荐答案

String.EMPTY是12个字符,""是两个字符,它们在运行时都会引用内存中完全相同的实例.我不完全确定为什么String.EMPTY可以节省编译时间,事实上我认为应该是后者.

特别是考虑到String是不可变的,您不可能首先获得一个空字符串,然后对其执行一些操作-最好使用StringBuilder(如果您希望是线程安全的,则使用StringBuffer)并将其转换为字符串.

Update
从你对问题的 comments 可以看出:

实际上是什么启发了这一切

我相信在你合适的课堂上提供一个常数是完全合理的:

private static final String EMPTY_STRING = "";

然后在您的代码中将其引用为

TextBox.setText(EMPTY_STRING);

这样,至少你明确表示你想要一个空字符串,而不是忘记在IDE或类似的东西中填充字符串.

Java相关问答推荐

Junit with Mockito for java

DTO到实体,反之亦然,控制器和服务之间的哪一层应该处理转换?

如何获得执行人?

Spark忽略Iceberg Nessie目录

Mapstruct不能正确/完全映射属性

试着做一个2x2的魔方求解算法,我如何找到解路径(DFS)?

如何使用Jackson将XML元素与值和属性一起封装

用户填充的数组列表永不结束循环

与IntArray相比,ArrayList<;Int>;对于大量元素的性能极差

如何在列表(链表)中插入一个新 node (作为prelast)

将双倍转换为百分比

接受类及其接口的Java类型(矛盾)

Java HashMap保留所有时间复杂性

当使用不同的参数类型调用时,为什么围绕Objects.equals的类型安全包装不会失败?

javax.crypto-密码对象-提供者服务是如何工作的?

人们在 IntelliJ 上将-Dhttp.proxyHost=your.proxy.net -Dhttp.proxyPort=8080放在哪里?

在数组列表中找到对象后,未从数组中删除对象

我真的能很好地解释同步计数器和 AtomicInteger 的 JMH 结果吗

Java 中 Scanner 的自定义分隔符问题

无法在 Android Studio 中访问 Record