浅析Java字符串~

156 阅读2分钟

「这是我参与11月更文挑战的第1天,活动详情查看:2021最后一次更文挑战

String、StringBuffer、StringBuilder三者的异同?

  • 不同点:

    • String:不可变的字符序列(final),是线程安全的。
    • StringBuffer:可变的字符序列;线程安全,效率低。
    • StringBuilder:可变的字符序列;jdk5.0新增的,线程不安全效率高。
  • 相同点:

    • 底层都是使用char[]数组存储

字符串String、StringBuffer、StringBuilder分析

源码分析:
    String str = new String();//char[] value = new char[];
    String str1 = new string("abc" ); // char[] value = new char[]{ 'a ' , ' b' , 'c'};

    StringBuffer sb1 = new StringBuffer(); //char[] value = new char[16];底层创建了一个长度为16的动态数组用于存放字符。		      
    System.out.printLn(sb1.Length());
    sb1.append( 'a'); //value[e] = 'a';sb1. append( ' b');//value[1] = 'b ';

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

    //问题1.System.out.println(sb2.Length());7/ 3
    //问题2.扩容问题:如果要添加的数据底层数组盛不下了,那就需要扩容底层的数组。
        默认情况下,扩容为原来容量的2+2,同时将原有数组中的元素复制到新的数组中

    建议:开发中建议大家使用StringBuffer(int capacity)或 stringBuilder(int capacity)

StringBuffer/StringBuilder的常用方法?

  • StringBuffer append(xxx):提供了很多的append()方法,用于进行字符串拼接
  • StringBuffer delete(int start,int end):删除指定从start开始位置到end结束的内容
  • StringBuffer replace(int start, int end,String str):把从start(包含start)开始位置到end结束的内容替换为str
  • StringBuffer insert(int offset, xxx):在指定位置(offset位置)插入xxx
  • StringBuffer reverse():把当前字符序列逆转
  • public int indexof(String str)
  • public string substring(int start,int end):截取左闭右开区间的子字符串
  • public int length():显示字符串长度
  • public char charAt(int n ):查询该字符串中第 n 个字符是什么?
  • public void setcharAt(int n ,char ch):把字符串中的第 n 个位置的字符替换为 h 总结:
  • 增:append(xxx)
  • 删:delete(int start,int end)
  • 改:setcharAt(int n ,char ch) / replace(int start, int end,String str)
  • 查:charAt(int n )
  • 插入:insert(int offset, xxx)
  • 长度:length()
  • 遍历:for()+charAt()

对比StringBulider、StringBuffer、String的效率问题?

@Test
public void test2(){
    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++) {
        text+=i;
    }
    endTime=System.currentTimeMillis();
    System.out.println("String消耗时间为:"+(endTime-startTime));

    startTime=System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        Buffer.append(String.valueOf(i));
    }
    endTime=System.currentTimeMillis();
    System.out.println("Buffer消耗时间为:"+(endTime-startTime));

    startTime=System.currentTimeMillis();
    for (int i = 0; i < 20000; i++) {
        Builder.append(String.valueOf(i));
    }
    endTime=System.currentTimeMillis();
    System.out.println("Bulider消耗时间为:"+(endTime-startTime));
}

运行时间结果:

时间从高到低对比:StringBulider > StringBuffer > String

    String消耗时间为:1061
    Buffer消耗时间为:3
    Bulider消耗时间为:2