String、String Buffer、String Builder 有啥子区别?
- jdk 1.8
String
String 类 是我们平时用的最多的一个类,它提供了构造和管理字符串的各种基本逻辑。
public final class String
implements java.io.Serializable, Comparable<String>, CharSequence {
/** The value is used for character storage. */
private final char value[];
通过查看源码,String 类被声明为 final class ,属性也为 final 的,所以 String 类是典型的 Immutable 类(即不可变类),也可理解为常量,所以 String 是线程安全的。
由于 String 类的不可变性,所有对字符串的裁剪、拼接操作都会产生 新的 String 对象 ,然后将指针指向新的 String 对象。
AbstractStringBuilder
String Buffer 与 String Builder 都继承了 AbstractStringBuilder 。
abstract class AbstractStringBuilder implements Appendable, CharSequence {
char[] value;
int count;
AbstractStringBuilder() {
}
AbstractStringBuilder(int capacity) {
value = new char[capacity];
}
通过查看 AbstractStringBuilder 的源码可以看到,该类没有被声明为 final,
所以 String Buffer 与 String Builder 都是为了解决上述所说的拼接、裁剪产生的太多中间对象而提供的俩个类,我们可以用 append 或者 add 方法,把字符串添加到已有序列的末尾或者指定位置。
String Buffer 与 String Builder 二者的方法是完全一样的,唯一的区别就是 String Buffer 中所有的方法都简单粗暴的被 synchronized 关键字修饰,而 String Builder 中没有,这也就造成了二者性能上的差异,所以说如果没有线程安全上的需要,还是用 String Builder 比较好。
如何在三者之间选择?
- 操作少量字符串,适用 String
- 单线程在字符串缓冲区下操作大量数据,适用 String Builder
- 多线程在字符串缓冲区下操作大量数据,适用 String Buffer
总而言之,就是简单操作字符串的话用 String 就好,拼接字符串数据量大的话一般用 StringBuilder,如果涉及多线程了,就用 String Buffer
格式化输出
System.out.format()
System.out.format() 模仿自 c 的 printf()来进行格式化输出,如下所示
int x = 5;
double y = 5.222;
System.out.println("Row 1:" + x + y);
System.out.format("Row 1: %d , %f\n" , x , y);
System.out.printf("Row 1: %d , %f\n" , x , y);
format()与 printf()是等价的。
String.format()
String.format() 以生成格式化的 String 对象,同上述 System.out.format()方法一样,但返回一个 String 对象。
String sql = String.format("select * from %s where id in (%s) ",x,y)
可以像这样拼接字符串,而不用非要用 String Builder 来一点一点的 append。
以上内容参考自:
- 极客时间 《Java 核心技术 36 讲》
- https://snailclimb.top/JavaGuide/#/?id=java
- 《Java 编程思想》
由于 jvm 和并发编程还没学,一些东西还不懂,等过段时间再补充补充
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于