String、StringBuffer和StringBuilder
同:
- 都用来封装字符串;
- 实现CharSequence接口
不同
-
string被final修饰,是不可变类,一旦赋值,不可改变;
- StringBuffer和StringBuilder都继承自AbstractStringBuilder类,使用字符数组保存字符串,是可变类;
-
创建对象初始化时,String可通过
- String a = new String("abc");
- String a = "abc";两种方法进行初始化
- 而StringBuilder和StringBuffer只能通过new的方法来初始化
-
String字符串修改的方式是先创建一个StringBuffer,其次调用StringBuffer的append()方法,最后调用StringBuffer的toString()方法返回结果;
String a = "abc"; a = a + "d"; System.out.println(a); // a = "abcd";
等同于
StringBuffer xy = new StringBuffer("abc"); xy.append("d"); xy.toString(); System.out.println(xy); // xy = "abcd";
String字符串修改的过程要StringBuffer多几部操作,增加一些临时对象,从而导致代码的效率降低。
StringBuffer和StringBuilder在修改字符串方面要比String的效率高
-
String类实现了equals()方法和hashCode()方法
StringBuffer类没有实现equals()方法和hashCode()方法
-
StringBuffer和StringBuiloder都提供了一系列插入、追加、修改字符串字符序列等方法,用法基本相同,
只是StringBuilder是线程不安全的,StringBuffer是线程安全的
如果单线程使用字符串,则StringBuilder的效率高一些,但是当线程访问时,最好使用StringBuffer
在执行效率上,StringBuilder最高,StringBuffer次之,String最低。
如果要操作数量比较小,应优先使用String类;
如果是单线程操作大量数据,应优先使用StringBuilder;
如果是在多线程操作大量数据,应优先使StringBuffer类