你知道String、StringBuilder、Stringbuffer的区别吗?当你建立字符串的时候,有考虑过该使用哪一个吗?java
别急,这篇文章带你解决这些问题。算法
首先,String是字符串,咱们通常这样声明:数组
String s = "abc";
String类使用被final修饰的char数组来存储字符串的内容,它的一大特性就是不可变,怎么理解这个不可变呢?安全
咱们知道,一个类被final修饰,那么这个类没法被继承,方法也不能被重写,属性也不能改变。多线程
看看这段代码:app
String s = "abc"; s = s+1; System.out.print(s); // 输出: abc1
表面上s的值由abc变成了abc1,其实并非这样,而是在进行+1的操做时,从新建立了一个新的String对象,并给它赋值为abc1.ide
StringBuilder和StringBuffer这俩货一样用char数组存字符串,但并无用final修饰,所以它们建立的内容的可变的,并不像String那样建立了一个新的对象。性能
String是常量,天然没有线程不安全的问题,可是StringBuilder和StringBuffer是变量,就须要考虑这个。ui
咱们查看StringBuilder的源码:线程
@Override public int compareTo(StringBuilder another) { return super.compareTo(another); } @Override public StringBuilder append(Object obj) { return append(String.valueOf(obj)); }
再看看StringBuffer的:
@Override public synchronized int compareTo(StringBuffer another) { return super.compareTo(another); } @Override public synchronized int length() { return count; } @Override public synchronized int capacity() { return super.capacity(); }
发现没有,StringBuffer的每一个方法都加了synchronized同步锁,保证了线程安全,而StringBuilder没加。
StringBuilder>StringBuffer>String
String做为常量,每次更改都建立新对象,性能最低;StringBuilder没有StringBuffer身上的锁,所以性能更好。
无心中发现了一位清华大佬的算法刷题笔记,关注公众号『勾玉技术』回复『清华算法』领取