String和StringBuffer的详解,联系和区别

String是Java中基础且重要的类,并且String也是Immutable类的典型实现,被声明为final class,除了hash这个属性其它属性都声明为final,因为它的不可变性,所以例如拼接字符串时候会产生很多无用的中间对象,如果频繁的进行这样的操作对性能有所影响。StringBuffer就是为了解决大量拼接字符串时产生很多中间对象问题而提供的一个类。


StringBuffer是一个具有对象引用传递特点的字符串对象。 StringBuffer对象可以调用其方法动态的进行增加、插入、修改和删除操作,且不用像数组那样事先指定大小,从而实现多次插入字符,一次整体取出的效果,因而操作字符串非常灵活方便。 一旦通过StringBuffer生成最终想要的字符串,就可调用它的toString方法将其转换为一个String对象。

那么有人就问StringBuffer调用它的toString方法指向一个地址,最后还是变成了一个String对象,为什么在不直接用String呢?(意思是多次一举),这里我们就引出StringBuffer的好处了。

从这两类的区别分析:String类是不可变类,StringBuffer类是可变类,String 类提供的比如substring,replace等方法都不会更改字符串内容,实际上是创建一个方法所浮于特性的新字符串,返回一个改变后内容的新字符串。 而StringBuffer的append等方法都会改变字符缓冲区中的字符串内容。简单来说,String类不可变,所以我们每次"改变字符串内容",其实是创建了新的String对象,而StringBuffer类是可变的,我们每次改变字符串内容就是对原字符串对象的操作。所以StringBuffer在处理改变字符串等等上比String效率更高和消耗内存更小。


下面我们举个例子来说明一下,我们需要在love字符串基础上再拼接一个love字符串

String s= new String("love");
s = s + "love";
System.out.println(s);
StringBuffer sb = new StringBuffer("love");
sb.append("love");
String s = sb.toString();
System.out.println(s);

这个一次拼接还看不出什么,因为都是创建了两个对象,只不过上边是两个String对象,下边的方法是一个StringBuffer和String对象。效率和消耗的内存也差不了多少

接下来我们给这个过程加上循环,比如我要得到一个love字符串基础上再拼接一个100个love的字符串,分别用String和StringBuffer来实现结果又会是怎样

String s= new String("love");
for(int i = 0; i < 100; i++){
	s = s + "love";
}
System.out.println(s);
StringBuffer sb = new StringBuffer("love");
for(int i = 0; i < 100; i++){
	sb.append("love");
}
String s = sb.toString();
System.out.println(s);

两者的区别和效率就出来了,上边的代码的效率很低,因为创建了101个对象(开始的一个和循环100次创建的100个);而下边的代码的效率很高,因为只创建了一个StringBuffer对象,最后用toString方法转化为String对象,总结起来就是一个StringBuffer对象和String对象的消耗(2个)。

这还只是循环100次,可想而知1000次,10000次,StringBuffer相比String优势一下就出来了,所以增删查改字符串使用StringBuffer是比较好的(有些视情况而定)。


String和StringBuffer一些共性:

  1. 都是用来处理字符串的。
  2. 都提供了 length() , toString() ,charAt() , substring() 方法 ,用法一样。
  3. 对于String 类和 StringBuffer 类,字符在字符串中的索引位置都从0开始。

String和StringBuffer主要区别:

  1. String类的内容一旦声明后是不可改变的,改变的只是其内存的指向,而StringBuffer类的对象内容是可以改变的(String对象不可修改指的是对象本身不可修改,而不是引用不可修改)。
  2. String 类覆盖了Object类的 equals()方法,StringBuffer类没有覆盖。
  3. 都覆盖了Object()类的 toString() 方法,实现不一样。String类的toString() 方法返回当前String实例本身的引用。 StringBuffer类的toString方法返回一个以当前StringBuffer的缓冲区中的所有字符串为内容的新的String对象的引用。
  4. String 对象可以用 操作符 "+ "进行连接,StringBuffer不能。
发布了149 篇原创文章 · 获赞 84 · 访问量 15万+

猜你喜欢

转载自blog.csdn.net/weixin_43465312/article/details/102771374