1. 程式人生 > 其它 >JAVA---String、StringBuffer、StringBuilder

JAVA---String、StringBuffer、StringBuilder

package java0;

import org.junit.Test;

/**
 *
 *
 *
 * @create 2022-03-22 11:39
 */
public class StringBufferBuilderTest {

    /*
        對比String、StringBuffer、StringBuilder三者的效率
        從高到低排列:StringBuilder》 StringBuffer》String



     */

    @Test
    public void test3(){
        long startTime=0L;
        long endTime=0L;

        String text="";
        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(endTime-startTime);

        startTime=System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            builder.append(String.valueOf(i));
        }
        endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);
        
        startTime=System.currentTimeMillis();
        for (int i = 0; i < 20000; i++) {
            text=text+i;
        }
        endTime=System.currentTimeMillis();
        System.out.println(endTime-startTime);
    }


    /*

    StringBuffer的常用方法:
    StringBuffer append(xxx): 提供了很多的append()方法,用於進行字串的拼接。
    StringBuffer delete(int start,int end):刪除指定位置的內容
    StringBuffer replace(int start,int end,String str):把[start,end)位置替換為str
    StringBuffer insert(int offset,xxx):在指定位置插入xxx
    StringBuffer reverse():把當前字元序列逆轉
    public int indexOf(String str)
    public String subString(int start,int end):返回一個從start開始到end索引結束的左閉右開區間的子字串
    public int length()
    public char charAt(int n)
    public void setChartAt(int n,char ch)


     */

    @Test
    public void test2(){
        StringBuffer s1=new StringBuffer("abc");
        s1.append(1);
        s1.append('1');
        System.out.println(s1);

        s1.delete(2,4);
        System.out.println(s1);

        s1.replace(2,4,"hello");
        System.out.println(s1);

        s1.insert(2,false);
        System.out.println(s1);

        s1.reverse();
        System.out.println(s1);

        String s2=s1.substring(1,3);
        System.out.println(s1);
        System.out.println(s1.length());
        System.out.println(s2);


    }


    /*
        String、StringBuffer、StringBuilder三者的異同?
        String:不可變的字元序列,底層使用char[]儲存
        StringBuffer:可變的字元序列;執行緒安全的,效率低;底層使用char[]儲存
        StringBuilder:可變的字元序列;jdk5.0新增的,執行緒不安全的,效率高,底層使用char[]儲存

        原始碼分析:
        String str=new String();//char[] value=new char[0];
        String str1=new String("abc");//char[] value=new char[]{'a','b','c'};

        StringBuffer sb1=new StringBuffer();char[] value=new char[16];底層建立了一個長度為16的陣列
        sb1.append('a');//value[0]='a';
        sb1.append('b');value[1]='b';


        StringBuffer sb2=new StringBuffer("abc");//char[] value=new char["abc".length+16];

        //System.out.println(sb2.length);//3
        //擴容問題:如果要新增的資料底層陣列盛不下了,那就需要庫容底層的陣列。
                預設情況下,擴容為原來容量的2倍+2,同時將原有陣列中的元素複製到新的陣列中。


     */

    @Test
    public void test1(){
        StringBuffer sb1=new StringBuffer("abc");
        sb1.setCharAt(0,'m');
        System.out.println(sb1);

        StringBuffer sb2=new StringBuffer();
        System.out.println(sb2.length());//0
    }
}