String、StringBuilder、StringBuffer的爱恨情仇

第三阶段 JAVA常见对象的学习

StringBuffer和StringBuilder类

(一) StringBuffer类的概述

(1) 基本概述

下文以StringBuffer为例java

前面咱们用字符串作拼接,比较耗时而且也耗内存(每次都会构造一个新的string对象),而这种拼接操做又是比较常见的,为了解决这个问题,Java就提供了两个字符串缓冲区类。StringBuffer和StringBuilder供咱们使用。数组

简单比较:安全

String 长度大小不可变多线程

StringBuffer 长度可变、线程安全、速度较慢app

StringBuilder 长度可变、线程不安全、速度最快学习

-----------------------------------------------------------------------------------------------------------------优化

解释:ui

  1. 在执行速度方面的比较:StringBuilder > StringBufferthis

  2. StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,每当咱们用它们对字符串作操做时,其实是在一个对象上操做的,不像String同样建立一些对象进行操做,因此速度就快了。线程

  3. StringBuilder:线程非安全的

    StringBuffer:线程是安全的(synchronized关键字进行修饰)

当咱们在字符串缓冲区被多个线程使用时,JVM不能保证StringBuilder的操做是安全的,虽然他的速度最快,可是能够保证StringBuffer是能够正确操做的。固然大多数状况下就是咱们是在单线程下进行的操做,因此大多数状况下是建议用StringBuilder而不用StringBuffer的,就是速度的缘由。

对于三者使用的总结:

1.若是要操做少许的数据用 = String 2.单线程操做字符串缓冲区 下操做大量数据 = StringBuilder 3.多线程操做字符串缓冲区 下操做大量数据 = StringBuffer

(2) StringBuffer的构造方法

//无参构造方法
StringBuffer()
    
//指定容量的字符串缓冲区对象
StringBuffer(int size)
    
//指定字符串内容的字符串缓冲区对象
StringBuffer(String str)

(二) StringBuffer 类的功能

(1) 添加功能

//能够把任意类型添加到字符串缓冲区里,而且返回字符串缓冲区自己(this)
public StringBuffer append (String str)

//在offset位置把任意类型的数据插入到字符串缓冲区中,而且返回字符串缓冲区自己(this)
public StringBuffer insert(int offset,String str)

(2) 删除功能

//删除指定位置的字符,而且返回自己
public StringBuffer deleteCharAt(int index)

//删除从指定位置开始指定位置结束的内容,而且返回自己
public StringBuffer delete(int start, int end)

(3) 替换功能

//从start到end用str代替
public StringBuffer replace(int start,int end,String str)

(4) 反转功能

//Eg: 好你界世 → 世界你好
public StringBuffer reverse()

(5) 截取功能

//从start位置开始截取,取之后字符串,但不返回自己,原数据不影响
public String substring(int start)

//截取start到end之间的字符串
Publci Stirng substring(int start, int end)

(三) String 和 StringBuffer 类相互转换

(1) 转换缘由:

String → StringBuffer 是为了使用后者的功能

StringBuffer → String 可能须要后者的类型

(2) 转换方式

※ String → StringBuffer

String s = “Hello”

//经过构造方法
StringBuffer a = new StringBuffer(s);

//经过append()方法

StringBuffer a = new StringBuffer();
a.append(s);

※ StringBuffer → String

StringBuffer buffer = new StringBuffer(“java”)

//经过构造方法
String str = new String (buffer);

//经过toString()方法
String str = buffer.toString();

(四) “+” 和 StringBuilder 类的爱恨情仇

首先java并不支持运算符重载。

(String类中的 “+”“+=”是java中仅有的两个重载过的运算符)

因此咱们能够经过“+”符号 将多个字符串进行拼接

将这段代码利用 javap -c filename 反编译

咱们能够看到代码被编译器自动优化成使用StringBuilder方式拼接

运行效率获得了保证

img

下面一个案例 数组拼接成指定格式的字符串 代码中使用了循环语句

//在循环中经过String拼接字符串
public class StringBuilderDemo {
   public static void main(String[] args) {
       String[] arr = {"Hello", "World", "!!!"};
       String s1 = arrayToString(arr);
       System.out.println(s1);
   }

   public static String arrayToString(String[] arr) {
       String s = "";

       s += "[";
       for (int x = 0; x < arr.length; x++) {
           if (x == arr.length - 1) {
               s += arr[x];
           } else {
               s += arr[x];
               s += ", ";
           }
       }
       s += "]";
       return s;
   }
}
//运行结果
[Hello, World, !!!]

使用String方式进行拼接,咱们反编译能够看到,StringBuilder被建立在循环的内部,这意味着每循环一次就会建立一次StringBuilder对象,这但是一个糟糕的事情。

img

//在循环中使用StringBuilder拼接字符串
public class StringBuilderDemo2 {
    public static void main(String[] args) {
        String[] arr = {"Hello", "World", "!!!"};
        String s1 = arrayToString(arr);
        System.out.println(s1);
    }

    public static String arrayToString(String[] arr) {
        StringBuilder s = new StringBuilder();
        s.append("[");
        for (int x = 0; x < arr.length; x++) {
            if (x == arr.length - 1) {
                s.append(arr[x]);
            } else {
                s.append(arr[x]);
                s.append(", ");
            }
        }
        s.append("]");
        return s.toString();
    }
}
//运行结果
[Hello, World, !!!]

使用StringBuilder方式进行拼接,反汇编代码,能够看到,不只循环部分的代码更为简洁,并且它只生成了一个StringBuilder对象。显式的建立StringBuilder对象还容许你预先为其指定大小。能够避免屡次从新分配缓冲。

总结:

若是字符串操做比较简单,就可使用“+”运算符操做,编译器会为你合理的构造出最终的字符串结果

若是使用循环语句 最好本身手动建立一个StringBuilder对象,用它来构最终结果

结尾:

若是内容中有什么不足,或者错误的地方,欢迎你们给我留言提出意见, 蟹蟹你们 !^_^

若是能帮到你的话,那就来关注我吧!(系列文章均会在公众号第一时间更新)

在这里的咱们素不相识,却都在为了本身的梦而努力 ❤

一个坚持推送原创Java技术的公众号:理想二旬不止

img

相关文章
相关标签/搜索