String,StringBuffer,StringBulider区别与联系

简介: String,StringBuffer,StringBulider区别与联系

① String

String类代表定长字符串,其内容在创建之后是不可更改的。特点:不可变,线程安全但效率低。



② StringBuffer



StringBuffer类与String类相似,均是线程安全,但StringBuffer为变长字符串,效率比String高。其代表的是可变长的字符串缓冲区,通过特定的方法可以改变字符串序列的长度和内容,且对于多线程操作是安全的。


在字符串的连接操作上提供了性能和效率都优于String类的"+"的append()方法,因此如果需要大量频繁地进行字符连接操作时,优先采用StringBuffer类的append()方法。


如果从编程习惯来讲,"+“比append()方法更具有可观性,如果只是简单的字符串连接可以采用String类的”+"来提高代码的可读性。


③ StringBuilder


StringBuilder类是StringBuffer类的一个等价类,该类与StringBuffer类具有相同的方法,且同样代表的是可变长的字符串缓冲区。不同的地方在于StringBuilder类是非线程安全的。但是也正是因为少了很多的同步操作,在效率上会高于StringBuffer类。因此如果不涉及多线程操作,可以优先考虑使用StringBuilder类来提高方法的执行效率。


④ 代码测试三者效率:

  @Test
  public void test3(){
    String text = "";
    long startTime = 0L;
    long endTime = 0L;
    StringBuffer buffer = new StringBuffer("");
    StringBuilder builder = new StringBuilder("");
    startTime = System.currentTimeMillis();
    for(int i = 0;i<20000;i++){
    buffer.append(String.valueOf(i));}
    endTime = System.currentTimeMillis();
    System.out.println("StringBuffer的执行时间:"+(endTime-startTime));
    startTime = System.currentTimeMillis();
    for(int i = 0;i<20000;i++){
    builder.append(String.valueOf(i));}
    endTime = System.currentTimeMillis();
    System.out.println("StringBuilder的执行时间:"+(endTime-startTime));
    startTime = System.currentTimeMillis();
    for(int i = 0;i<20000;i++){
    text = text + i;}
    endTime = System.currentTimeMillis();
    System.out.println("String的执行时间:"+(endTime-startTime));
  }


测试结果:

效率从高到底: StringBuilder > StringBuffer > String



⑥ 编译器对"+"处理

测试环境:idea+jdk1.8。

  • 常量直接拼接赋值
//源码
String str8 = "abc"+"abc";
//编译后
 String str8 = "abcabc";


  • 常量+变量将会创建StringBuilder对象
//源码
String str2 = new String("abc");
String str9 = "abc"+str2;
//编译后str9的值
(new StringBuilder()).append("abc").append(str2).toString();



  • 变量+变量也会创建StringBuilder对象
//源码
String  a  =  "a";
String  b  =  "b";
String  c  =  "c";
String  s1  =   a  +  b  +  c;
//编译后 s1的值
 (new StringBuilder()).append(a).append(b).append(c).toString();

由上面的分析结果,可就不难推断出String 采用连接运算符(+)效率低下原因分析,形如这样的代码:

 String s = null;  
 for(int i = 0; i < 100; i++) {  
      s += "a";  
 }  


每做一次 + 就产生个StringBuilder对象,然后append后就扔掉。下次循环再到达时重新产生个StringBuilder对象,然后 append 字符串,如此循环直至结束。


如果我们直接采用 StringBuilder 对象进行 append 的话,我们可以节省 N - 1 次创建和销毁对象的时间。所以对于在循环中要进行字符串连接的应用,一般都是用StringBuffer或StringBulider对象来进行 append操作。


⑦ 总结


(1)如果要操作少量的数据用 String;

(2)多线程操作字符串缓冲区下操作大量数据 StringBuffer;

(3)单线程操作字符串缓冲区下操作大量数据 StringBuilder。

(4)String和StringBuffer都是线程安全的,StringBuffer和StringBuilder都是可变的。

目录
相关文章
|
28天前
|
安全
String、StringBuffer、StringBuilder的区别
String 由 char[] 数组构成,使用了 final 修饰,对 String 进行改变时每次都会新生成一个 String 对象,然后把指针指向新的引用对象。 StringBuffer可变并且线程安全;有一定缓冲区容量,字符串大小没超过容量,不会重新分配新的容量,适合多线程操作字符串; StringBuiler可变并且线程不安全。速度比StringBuffer更快,适合单线程操作字符串。 操作少量字符数据用 String;单线程操作大量数据用 StringBuilder;多线程操作大量数据用 StringBuffer
|
3月前
|
安全 Java
String、StringBuffer、StringBuilder的区别
这篇文章讨论了Java中String、StringBuffer和StringBuilder的区别。String是不可变的,每次操作都会产生新的对象,效率低且浪费内存。StringBuilder可以在原字符串基础上进行操作,不开辟额外内存,弥补了String的缺陷。StringBuffer和StringBuilder类似,但StringBuffer的方法是线程安全的。文章还列举了StringBuffer的常用方法,并提供了使用示例代码。最后总结了这三者的主要区别。
String、StringBuffer、StringBuilder的区别
|
2月前
|
存储 安全 Java
String、StringBuffer 和 StringBuilder 的区别
【10月更文挑战第21天】String、StringBuffer 和 StringBuilder 都有各自的特点和适用场景。了解它们之间的区别,可以帮助我们在编程中更合理地选择和使用这些类,从而提高程序的性能和质量。还可以结合具体的代码示例和实际应用场景,进一步深入分析它们的性能差异和使用技巧,使对它们的理解更加全面和深入。
42 0
|
4月前
|
安全 Java API
Java系类 之 String、StringBuffer和StringBuilder类的区别
这篇文章讨论了Java中`String`、`StringBuffer`和`StringBuilder`三个类的区别,其中`String`是不可变的,而`StringBuffer`是线程安全的可变字符串类,`StringBuilder`是非线程安全的可变字符串类,通常在单线程环境下性能更优。
Java系类 之 String、StringBuffer和StringBuilder类的区别
|
3月前
|
Java 索引
java基础(13)String类
本文介绍了Java中String类的多种操作方法,包括字符串拼接、获取长度、去除空格、替换、截取、分割、比较和查找字符等。
44 0
java基础(13)String类
|
23天前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
37 2
|
2月前
|
Java
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
本文深入探讨了Java中方法参数的传递机制,包括值传递和引用传递的区别,以及String类对象的不可变性。通过详细讲解和示例代码,帮助读者理解参数传递的内部原理,并掌握在实际编程中正确处理参数传递的方法。关键词:Java, 方法参数传递, 值传递, 引用传递, String不可变性。
67 1
【编程基础知识】(讲解+示例实战)方法参数的传递机制(值传递及地址传递)以及String类的对象的不可变性
|
2月前
|
安全 Java 测试技术
Java零基础-StringBuffer 类详解
【10月更文挑战第9天】Java零基础教学篇,手把手实践教学!
49 2
|
3月前
|
安全 Java
String类-知识回顾①
这篇文章回顾了Java中String类的相关知识点,包括`==`操作符和`equals()`方法的区别、String类对象的不可变性及其好处、String常量池的概念,以及String对象的加法操作。文章通过代码示例详细解释了这些概念,并探讨了使用String常量池时的一些行为。
String类-知识回顾①
|
2月前
|
存储 安全 C++
【C++打怪之路Lv8】-- string类
【C++打怪之路Lv8】-- string类
26 1