String、StringBuffer和StringBuilder的区别以及应用

String、StringBuffer和StringBuilder的区别

初步学习,后续会完善和更新

String

  String类是不可变类,即一旦一个String对象被创建以后,包含在这个对象中的字符序列是不可改变的,直至这个对象被销毁
这里有个问题,既然String对象是字符串常量不可改变,那么我们经常对其进行多次赋值,那是怎么回事的呢?下面的例子是我们不能理解的

String s = "aaa";
s = "bbb";
// 打印出来的a为bbb
System.out.println(s);

原来,上面的对String进行重新赋值的操作会将值bbb赋值给生成新的String对象,而旧的对象值aaa则是等待回收。

String s = "ccc";
s = s +"ddd";
// 打印出来的a为cccddd
System.out.println(s)

上面的String字符串拼接,看似改变了原有的值,其实只是假象。真正的原理是:
①String.valueOf(str1)
②产生StringBuilder, 调用的StringBuilder(str1)构造方法, 把StringBuilder初始化,长度为str1.length()+16,并且调用append(str1)
③调用StringBuilder.append(str2), 把第二个字符串拼接进去, 然后调用StringBuilder.toString返回结果

//Java1.5前为StringBuffer,1.5之后为StringBuilder
StringBuilder.append("ccc").append("ddd").toString();

  String的字符串拼接是要额外占据内存的,以“hello”拼接“world”为例,短短的两个字符串,却需要开辟三次内存空间(极大浪费):
在这里插入图片描述

StringBuffer

  StringBuffer对象则代表一个字符序列可变的字符串,当一个StringBuffer被创建以后,通过StringBuffer提供的append()、insert()、reverse()、setCharAt()、setLength()等方法可以改变这个字符串对象的字符序列。一旦通过StringBuffer生成了最终想要的字符串,就可以调用它的toString()方法将其转换为一个String对象

StringBuffer b = new StringBuffer("123");
b.append("456");
// b打印结果为:123456
System.out.println(b);

b对象的内存空间图:
在这里插入图片描述
  没有产生新的字符串,所以说StringBuffer对象是一个字符序列可变的字符串,它没有重新生成一个对象,而且在原来的对象中可以连接新的字符串。

StringBuilder

  StringBuilder类也代表可变字符串对象。实际上,StringBuilder和StringBuffer基本相似,两个类的构造器和方法也基本相同。不同的是:StringBuffer是线程安全的,而StringBuilder则没有实现线程安全功能,所以性能略高

String、StringBuffer和StringBuilder的共同与区别之处

三者继承关系

在这里插入图片描述

三者共同之处:

都是final类,不允许被继承,主要是从性能和安全性上考虑的,因为这几个类都是经常被使用着,且考虑到防止其中的参数被参数修改影响到其他的应用

区别:

StringBuffer是线程安全,可以不需要额外的同步用于多线程中;

StringBuilder是非同步,运行于多线程中就需要使用着单独同步处理,但是速度就比StringBuffer快多了;

StringBuffer与StringBuilder两者共同之处:可以通过append、indert进行字符串的操作。

String实现了三个接口:Serializable、Comparable、CarSequence

StringBuilder只实现了两个接口Serializable、CharSequence,相比之下String的实例可以通过compareTo方法进行比较,其他两个不可以

三者区别之处:

  1. 运行速度(执行速度):StringBuilder > StringBuffer > String
      Java中对String对象进行的操作实际上是一个不断创建新的对象并且将旧的对象回收的一个过程,所以执行速度很慢;而StringBuilder和StringBuffer的对象是变量,对变量进行操作就是直接对该对象进行更改,而不进行创建和回收的操作,所以速度要比String快很多。
  2. 线程安全:StringBuilder是线程不安全的,而StringBuffer是线程安全的
      如果一个StringBuffer对象在字符串缓冲区被多个线程使用时,StringBuffer中很多方法可以带有synchronized关键字,所以可以保证线程是安全的,但StringBuilder的方法则没有该关键字,所以不能保证线程安全,有可能会出现一些错误的操作。所以如果要进行的操作是多线程的,那么就要使用StringBuffer,但是在单线程的情况下,还是建议使用速度比较快的StringBuilder。

最优应用

  1. String:适用于少量的字符串操作的情况
  2. StringBuilder:适用于单线程下在字符缓冲区进行大量操作的情况
  3. StringBuffer:适用多线程下在字符缓冲区进行大量操作的情况
发布了23 篇原创文章 · 获赞 15 · 访问量 3739

猜你喜欢

转载自blog.csdn.net/qq_42937522/article/details/102970087
今日推荐