javase -- java常用类-StringBuilder和StringBuffer


StringBuilder和StringBuffer.

1、String、StringBuilder、StringBuffer三者的异同?.

不同

String:JDK1.0 不可变的字符序列

StringBuilder:JDK1.0 可变的字符序列:线程安全的,效率偏低

StringBuffer:JDK1.5 可变的字符序列:线程不安全,效率高

相同

JDK1.8及以前,底层都是使用char[]存储

JDK1.9及以后,底层都是使用byte[]存储

2、底层中.

new StringBuilder();// 底层new了一个容量为16的char或byte数组
new StringBuilder("ab");// 底层new了一个容量为"ab".length() + 16的char或byte数组

3、涉及问题.

1.长度.

StringBuilder sb = new StringBuilder();
//问sb的长度
System.out.println(sb.length());// 0


    @Override
    public int length() {
        return count;// 返回的是一个计数器,并不是value.length
    }

2.扩容问题.

如果底层数组装不下,默认扩容为原来的2倍+2,同时将原有数组中的元素复制到性的数组中

4、常用方法(以StringBuffer为例).

StringBuffer append(XXX)在字符串末尾添加XXX

StringBuffer delete(int start, int end)删除指定位置的内容

StringBuffer replace(int start, int end, String str)替换指定位置的内容

StringBuffer insert(int offset, XXX)在指定位置插入XXX

StringBuffer reverse()字符串序列反转

int indexOf(String str)

String substring(int start, int end)

int length()

int charAt(int n)

void setCharAt(int n, char ch)设置指定索引的字符

StringBuilder与StringBuffer相同

5、效率比较(拼接操作).

StringBuilder > StringBuffer > String

public class MyTest{
    public static void main(String[] args) {

        new CalcTime("String"){
            String s = new String();
            @Override
            public void code() {
                for (int i=1;i < 30000; i++){
                    s += i;
                }
            }
        }.test();

        new CalcTime("StringBuilder"){
            StringBuilder sbd = new StringBuilder();
            @Override
            public void code() {
                for (int i=1;i < 30000; i++){
                    sbd.append(i);
                }
            }
        }.test();

        new CalcTime("StringBuffer"){
            StringBuffer sbf = new StringBuffer();
            @Override
            public void code() {
                for (int i=1;i < 30000; i++){
                    sbf.append(i);
                }
            }
        }.test();

    }
}

abstract class CalcTime{
    private String name;
    public void test(){
        long start = System.currentTimeMillis();
        code();
        long end = System.currentTimeMillis();
        System.out.println(this.name +"耗时" + (end - start) + "ms");
    }

    public CalcTime(String name){
        this.name = name;
    }
    public abstract void code();
}

文章作者: liuminkai
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 liuminkai !
评论
 上一篇
javase -- java常用类-日期时间API javase -- java常用类-日期时间API
日期时间API.JDK8之前.1、java.lang.System中currentTimeMillis();.System.currentTimeMillis();// 时间戳 2、java.util.Date类.两个构造器的使用 new
2020-08-08
下一篇 
javase -- java常用类-String(含堆) javase -- java常用类-String(含堆)
String(字符串). final类:不可被继承,不可变的字符序列 支持序列化 可以比较大小 字符串是常量,用双引号表示,其值不可更改(String a = “1”; ==> String a = “12”; 这个不叫更改字
2020-08-07
  目录