JavaEE-13-Java中的StringBuffer类和StringBuilder类

StringBuffer概述:

  前面我们讲过Stringr的两种拼接方法:1.使用符号“+”; 2.使用方法concat(String str).

  但是,使用这两种方法进行拼接都会生成一个新的String对象,既耗时,又浪费空间。

  而StringBuffer就可以解决这个问题,因为它是线程安全的可变字符串。

构造方法:
  StringBuffer():无参构造方法

  StringBuffer(int capacity):指定容量的字符串缓冲区对象

  StringBuffer(String str):指定字符串内容的字符串缓冲区对象

常用方法:

  int capacity():返回当前容量  ---理论值

  int length():返回长度(字符数) ---实际值

 示例:以下是创建StringBuffer 3种方法(一般使用第一种)    

StringBuffer sb=new StringBuffer();
System.out.println(sb.capacity());  //调用无参构造函数,int的默认长度为16
System.out.println(sb.length());   //无字符串,故长度为0

StringBuffer sb2=new StringBuffer(50);  
System.out.println(sb2.capacity());  //调用指定容量构造函数,长度为指定长度50
System.out.println(sb2.length());  //无字符串,故长度还是0

StringBuffer sb3=new StringBuffer("hello");
System.out.println(sb3.capacity());  //调用指定字符串构造函数,长度为(默认长度16)+(指定的字符串长度5)=21
System.out.println(sb3.length());  //字符串长度为5,故长度为5

 

 特有功能:

  添加功能:

    StringBuffer append(String str):可以把任意类型添加到字符串缓冲区中,并返回字符串缓冲区本身

    StringBuffer insert(int offset,String str):在指定位置把任意类型的数据插入字符串缓冲区中,并返回字符串缓冲区本身    

  删除功能:

    StringBuffer deleteCharAt(int index):删除指定位置的字符,并返回字符本身。

    StringBuffer delete(int start, int end):删除从起始位置到结束位置的字符。(Java中的所有范围方法都是包左不包右,即包含起始位置不包含结束位置)

  替换功能:

    StringBuffer replace(int start,int end,String str):使用指定字符串替换起始位置到结束位置的字符。

  反转功能:

    StringBuffer reverse():将字符串反转

  截取功能:注意返回值,上面的4个功能返回的都是字符串本身,但截取返回值不是字符串本身

    StringBuffer substring(int start):截取指定位置开始到结尾的字符

    StringBuffer substring(int start,int end):截取指定位置开始到指定位置结束的字符

 

 StringBuffer与String之间的转换

  1.String对象转成 StringBuffer对象:

  String是字符串类,所以可以直接将字符串赋值给它,比如:

    String s = "hello";

  但StringBuffer不能直接赋值字符串给它,因为它只是一个字符串的缓冲区,

  通过看其构造函数,我们发现赋值字符串有以下两种方法:

    1).使用第一种构造函数,先构造一下空的对象,再使用append()方法

      StringBuffer sb = new StringBuffer();

      sb.append("hello");

    2).使用第三种构造函数,用指定字符串来构造字符串缓冲区

      StringBuffer sb = new StringBuffer("hello");

  2.StringBuffer对象转成String对象,也是有两种方法(一般用第二种方法):

    1).通过构造方法

      StringBuffer buffer = new StringBuffer("java");

      String str = new String(buffer);

    2).通过tostring()方法

      String str2 = buffer.toString();

   例:把数组的内容拼接成一个字符串 

 1 public class StringBufferTest2 {
 2     public static void main(String[] args) {
 3         int[] arr = { 44, 33, 55, 11, 22 };
 4 
 5         // 方式1:用String的"+"拼接,开辟的内存空间很多,所以效率很低
 6         System.out.println(arrayToString(arr));
 7         // 方式2:用StringBuffer拼接
 8         System.out.println(arrayToString2(arr));
 9     }
10 
11     public static String arrayToString(int[] arr) {
12         String s = "";
13 
14         s += "[";
15         for (int x = 0; x < arr.length; x++) {
16             if (x == arr.length - 1) {
17                 s += arr[x];
18                 s += "]";
19             } else {
20                 s += arr[x];
21                 s += ",";
22             }
23         }
24         return s;
25     }
26 
27     public static String arrayToString2(int[] arr) {
28         StringBuffer sb = new StringBuffer();
29         sb.append("[");
30         for (int x = 0; x < arr.length; x++) {
31             if (x == arr.length - 1) {
32                 sb.append(arr[x]);
33                 sb.append("]");
34             } else {
35                 sb.append(arr[x]);
36                 sb.append(",");
37             }
38         }
39         return sb.toString();
40     }
41 }

上面的代码分别使用了String和StingBuffer两种方法,通过代码我们可以看出,

使用String方法时会开辟更多的内存空间,导致效率低下,故我们一般会使用第二种方法.

 

StringBuilder类

  一个可变的字符序列,此类提供一个与StringBuffer兼容的API,但不保证同步。

  该类被设计用作StringBuffer的一个简易替换,用在字符串缓冲区被单个线程使用的时候。

  所以StringBuilder比StringBuffer更快,效率更高,建议优先采用此类。

    

String,StringBuffer,StringBuilder三者之间的区别

  1.内容可变性

    String是内容不可变的,StringBuffer和StringBuilder都是内容可变的。

    注:String在系统内存中存储的是一个值,无论方法怎么调用,这个值都是不会变的。

      而StringBuffer在内存中存储的是一个地址引用,一旦调用的方法给该引用的地址赋予了新的值,原对象就会发生改变。

  举例:

public class StringBufferDemo {
    public static void main(String[] args) {
        String s1 = "hello";
        String s2 = "world";
        System.out.println(s1 + "---" + s2);
        change(s1, s2);
        System.out.println(s1 + "---" + s2);//不改变原值

        StringBuffer sb1 = new StringBuffer("hello");
        StringBuffer sb2 = new StringBuffer("world");
        System.out.println(sb1+"---"+sb2);
        change(sb1, sb2);
        System.out.println(sb1+"---"+sb2);//改变原值
    }

    public static void change(String s1, String s2) {
        s1 = s2;
        s2 = s1 + s2;
    }
    
    private static void change(StringBuffer sb1,StringBuffer sb2) {
        sb1=sb2;
        sb2.append(sb1);
    }
}
change

  2.同步性

    StringBuffer是同步的,数据安全,但效率低

    StringBuilder是不同步的,数据不安全,但效率高

    注:以上所说的数据安全指的是多线程的情况下,一般我们的使用场景都是单线程的,所以StringBuilder更常用。

 

StringBuffer和数组的区别

  二者都可以看成是一个容器,装其他的数据

  但是,StringBuffer的数据最终是一个字符串数据。

  而数组可以放置多种数据,只是每次放置的必须是同一种数据类型的。

 

 

 

    

 
posted @ 2020-09-01 19:52  benon  阅读(151)  评论(0编辑  收藏  举报