我知道,每次键入字符串字面值“”时,字符串池中都会引用相同的string对象。
但是为什么字符串API不包括一个公共静态最终字符串空= "";,所以我可以使用String.Empty引用?
它至少可以节省编译时间,因为编译器知道要引用现有的String,而不必检查它是否已经被创建以供重用,对吗?就我个人而言,我认为字符串字面量的激增,尤其是微小的字符串,在很多情况下是一种“代码气味”。
所以在没有绳子的背后有一个伟大的设计原因。是空的,还是语言的创造者根本不同意我的观点?
我知道,每次键入字符串字面值“”时,字符串池中都会引用相同的string对象。
但是为什么字符串API不包括一个公共静态最终字符串空= "";,所以我可以使用String.Empty引用?
它至少可以节省编译时间,因为编译器知道要引用现有的String,而不必检查它是否已经被创建以供重用,对吗?就我个人而言,我认为字符串字面量的激增,尤其是微小的字符串,在很多情况下是一种“代码气味”。
所以在没有绳子的背后有一个伟大的设计原因。是空的,还是语言的创造者根本不同意我的观点?
当前回答
如果你真的想要一个字符串。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.
其他回答
字符串。EMPTY是12个字符,""是2个字符,它们在运行时都将引用内存中完全相同的实例。我不太确定为什么是String。EMPTY可以节省编译时间,实际上我认为是后者。
特别是考虑到String是不可变的,你不能先得到一个空String,然后对它执行一些操作——最好使用StringBuilder(或者StringBuffer,如果你想线程安全的话),然后把它转换成String。
更新 从你对问题的评论来看:
是什么激发了这一切 TextBox.setText (" ");
我相信在适当的类中提供一个常量是完全合理的:
private static final String EMPTY_STRING = "";
然后在代码中引用它
TextBox.setText(EMPTY_STRING);
通过这种方式,至少你明确了你想要一个空字符串,而不是你忘记在你的IDE中填充字符串或类似的东西。
如果你真的想要一个字符串。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决定。
或者语言的创造者只是不同意我的观点? 是的。对我来说,这不是什么重要的事。
使用org.apache.commons.lang.StringUtils.EMPTY
对于那些声称""和字符串。空都是可互换的还是说“”更好,你就大错特错了。
每次你执行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编译器或运行时足够高效,可以自动将“”的所有实例指向同一个实例,但也可能不是这样,需要进行额外的处理才能确定。