Java中的字符串三大实践

字符串在 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 类的对象?

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值