字符串在 Java 编程中非常常见。在实践中,有一些事情可以改进您在代码中处理字符串的方式。其中一些可以帮助您防止性能不佳或空指针异常,或帮助您更好地调试。
1.用于连接的StringBuilder
使用“+”运算符连接字符串很诱人。字符串在 Java 中是不可变的。因此,当您尝试用“+”连接 2 个字符串时,会复制两个字符串的内容。如果您这样做并在循环中进行大量迭代,那么您的字符串连接将非常慢 - O(N^2) 时间!
考虑这个片段——对于较大的 N 值,这将非常慢,因此在实践中应该避免。
<span style="background-color:#f2f2f2"><span style="color:rgba(0, 0, 0, 0.8)"><span style="color:#292929">// 一个读取 N 行文件的函数
public String readFile() {</span><span style="color:#292929"> 字符串文件内容 = '';
for(int i=0;i<N;i++) {
/*
假设 readLine(i) 被实现,
返回第 i 行的字符串
*/</span><span style="color:#292929"> 文件内容 = 文件内容 + 读取行(i);
}
返回文件内容; </span><span style="color:#292929">}</span></span></span>
在这种情况下,请始终使用StringBuilder类。StringBuilder 本质上是一个字符序列,它是可变的——与不可变的“String”不同。
只需使用StringBuilder的append()方法添加更多字符或字符串。您始终可以使用toString()方法将 StringBuilder 转换为“String” 。可以在此处找到 StringBuilder 的 Javadoc 。
上面的示例如下所示 -
<span style="background-color:#f2f2f2"><span style="color:rgba(0, 0, 0, 0.8)"><span style="color:#292929">公共字符串读取文件(){</span><span style="color:#292929"> StringBuilder sb = new StringBuilder();
for(int i=0;i<N;i++) {
sb.append(readLine(i));
}</span><span style="color:#292929"> // 通过调用 toString()
返回"String" return sb.toString();
}</span></span></span>
2. CONSTANT.equals(variable) — 不是相反!
该的equals()方法是非常常见的在实践中比较字符串并采取了一些行动。这里有一点需要记住。考虑下面的代码片段——
<span style="background-color:#f2f2f2"><span style="color:rgba(0, 0, 0, 0.8)"><span style="color:#292929">公开最终班级播音员{</span><span style="color:#292929">// 只是下面方法中使用的一个常量
private static final String ANNOUNCER_NAME = "Hero";</span><span style="color:#292929">public
voidannounce (String input) { if(input.equals(ANNOUNCER_NAME)) {
// 做一些事情来宣布
}
}</span></span></span>
如果输入名称与“Hero”不匹配,我们不希望代码执行任何操作并静默退出。但是如果 input 为 null 会发生什么?代码会抛出 NullPointerException,因为我们会做 null.equals(something) 这是不允许的。有些人会争辩说,我们可以在开始时检查输入是否为空——正确,但这可能不会在使用 equals() 的任何地方发生!
为避免出现陷阱,请始终遵循 CONSTANT.equals(variable) 的约定。因此,上述条件应重构为——
<span style="background-color:#f2f2f2"><span style="color:rgba(0, 0, 0, 0.8)"><span style="color:#292929">public voidannounce(String input) {
if(ANNOUNCER_NAME.equals(input)) {
// 做一些事情来宣布
}
}</span></span></span>
ANNOUNCER_NAME 永远不会为空。因此,如果输入为空,我们将只得到 ANNOUNCER_NAME.equals(null),这是错误的——代码按预期退出而不会抛出 NullPointerException。
3. toString() 实现
任何时候你有一个对象,你都应该有一个用户友好的、人类可读的 toString() 方法实现。Intellij 和 Eclipse 等 IDE 可以使用类成员字段的组合为您自动生成和实现这些方法。实现了一个好的 toString() 方法,使调试过程中的生活更轻松。如果您不实现自定义方法,则使用默认的 toString() 方法。它将创建 Employee 类的字符串表示为“Employee@345981”(只是一个示例),而如果您覆盖 toString() 并使用您自己的格式,它可能看起来像“name=David,age=25”(只是一个例子——当你覆盖时,你可以返回任何你喜欢的表示!)。在调试时,您是否希望看到字符串化为“Employee@345981”或“name=David,age=25”的 Employee 类的对象?