StringBuilder类和StringJoiner类
  cnCTZTo8tgOC 2023年11月02日 44 0

StringBuilder

Java编译器对​​String​​​做了特殊处理,使得我们可以直接用​​+​​拼接字符串。

考察下面的循环代码:

String s = "";
for (int i = 0; i < 1000; i++) {
s = s + "," + i;
}

虽然可以直接拼接字符串,但是,在循环中,每次循环都会创建新的字符串对象,然后扔掉旧的字符串。这样,绝大部分字符串都是临时对象,不但浪费内存,还会影响GC效率。

为了能高效拼接字符串,Java标准库提供了​​StringBuilder​​,它是一个可变对象,可以预分配缓冲区,这样,往​​StringBuilder​​中新增字符时,不会创建新的临时对象:

StringBuilder sb = new StringBuilder(1024);
for (int i = 0; i < 1000; i++) {
sb.append(',');
sb.append(i);
}
String s = sb.toString();

​StringBuilder​​还可以进行链式操作:

// 链式操作

 Run

如果我们查看​​StringBuilder​​的源码,可以发现,进行链式操作的关键是,定义的​​append()​​方法会返回​​this​​,这样,就可以不断调用自身的其他方法。

仿照​​StringBuilder​​,我们也可以设计支持链式操作的类。例如,一个可以不断增加的计数器:

// 链式操作

 Run

注意:对于普通的字符串​​+​​操作,并不需要我们将其改写为​​StringBuilder​​,因为Java编译器在编译时就自动把多个连续的​​+​​操作编码为​​StringConcatFactory​​的操作。在运行期,​​StringConcatFactory​​会自动把字符串连接操作优化为数组复制或者​​StringBuilder​​操作。

你可能还听说过​​StringBuffer​​,这是Java早期的一个​​StringBuilder​​的线程安全版本,它通过同步来保证多个线程操作​​StringBuffer​​也是安全的,但是同步会带来执行速度的下降。

​StringBuilder​​和​​StringBuffer​​接口完全相同,现在完全没有必要使用​​StringBuffer​​。

练习

请使用​​StringBuilder​​构造一个​​INSERT​​语句:

public class Main {
public static void main(String[] args) {
String[] fields = { "name", "position", "salary" };
String table = "employee";
String insert = buildInsertSql(table, fields);
System.out.println(insert);
String s = "INSERT INTO employee (name, position, salary) VALUES (?, ?, ?)";
System.out.println(s.equals(insert) ? "测试成功" : "测试失败");
}
}

StringJoiner

要高效拼接字符串,应该使用​​StringBuilder​​。

很多时候,我们拼接的字符串像这样:

// Hello Bob, Alice, Grace!

 Run

类似用分隔符拼接数组的需求很常见,所以Java标准库还提供了一个​​StringJoiner​​来干这个事:

import java.util.StringJoiner;

 Run

慢着!用​​StringJoiner​​的结果少了前面的​​"Hello "​​和结尾的​​"!"​​!遇到这种情况,需要给​​StringJoiner​​指定“开头”和“结尾”:

import java.util.StringJoiner;

 Run

String.join()

​String​​还提供了一个静态方法​​join()​​,这个方法在内部使用了​​StringJoiner​​来拼接字符串,在不需要指定“开头”和“结尾”的时候,用​​String.join()​​更方便:

String[] names = {"Bob", "Alice", "Grace"};
var s = String.join(", ", names);

练习

请使用​​StringJoiner​​构造一个​​SELECT​​语句:

import java.util.StringJoiner;

public class Main {
public static void main(String[] args) {
String[] fields = { "name", "position", "salary" };
String table = "employee";
String select = buildSelectSql(table, fields);
System.out.println(select);
System.out.println("SELECT name, position, salary FROM employee".equals(select) ? "测试成功" : "测试失败");
}
}
【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年11月08日 0

暂无评论

推荐阅读
  3I1N9ysrcSyk   2023年12月08日   31   0   0 javahapi数据交换
  DF5J4hb0hcmT   2023年12月07日   50   0   0 javaArthas
cnCTZTo8tgOC
作者其他文章 更多

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02

2023-11-02