相同点:
- String类和StringBuffer类都用来处理字符串。
- String类和StringBuffer类都提供了length()、toString()、charAt()和substring()方法,它们的用法在两个类中相同。
- 对于String类和StringBuffer类,字符在字符串中的索引位置都从0开始。
不同点:
- String类是不可变类 ,而StringBuffer是可变类。String对象创建后,它的内容无法改变。
public class TestString {
public static void main(String[] args) {
String s = new String("java");
s.concat("test"); //连接test字符串
s.replace('j', 'k'); //将字符串中的j换为k
s.toUpperCase(); //将字符串中的所有字母换为大写
s.toLowerCase(); //将字符串中的所有字母换为小写
System.out.println(s);
StringBuffer sb = new StringBuffer("java");
sb.append("test"); //在原字符串末尾连接test字符串
sb.replace(0,2,"no"); //将位置0到2的字符串替换为no
System.out.println(sb);
}
}
输出结果:
java
novatest
2.String类覆盖了Object类的equals()方法,而StringBuffer类没有覆盖Object类的equals()方法。
String s1 = new String("java");
String s2 = new String("java");
System.out.println(s1.equals(s2));
//打印true,在String类中equals()方法是内容的比较,尽管s1和s2是两个不同的对象
StringBuffer sb1 = new StringBuffer("java");
StringBuffer sb2 = new StringBuffer("java");
System.out.println(sb1.equals(sb2));//打印false
3.两个类都覆盖了Object类的toString()方法,但是各自的实现方式不一样:
- String类的toString()方法返回当前String实例的本身的引用。
- StringBuffer类的toString()方法返回一个以当前StringBuffer的缓冲区中的所有字符为内容的新的String对象的引用。
String s = "java";
System.out.println(s==s.toString()); //打印true,==比较的是两个对象的地址值
System.out.println(s.equals(s.toString())); //打印true
StringBuffer sb = new StringBuffer("java");
System.out.println("java"==sb.toString()); //打印false
System.out.println(sb.equals(sb.toString()));//打印false
4.String类对象可以用操作符”+”进行连接,而StringBuffer类对象之间不能用”+”操作符进行连接。
采用StringBuffer可以减少Java虚拟机创建String对象的次数,减少动态分配和回收内存的次数,因此可以使程序性能大大提高。
单线程运行效率:
String << StringBuffer < StringBuilder