第6章-第3节-Java中的字符串缓冲区:StringBuilder和StringBuffer

1、字符串缓冲区

理解:Java内存层面的一款容器(crud操作)

引入场景:
    根据需求需要对某字符串内容进行频繁的改动操作,
    如果使用String类原生的方式进行处理,则会在内存中产生大量的对象;
    面临的问题:内存压力剧增、程序的效率变低
    此时Java设计者提出了字符串缓冲区这种技术,就是用来解决上述的问题

作用/价值:
    对于字符串内容的频繁改动操作,自始至终不会产生新对象

类型:

1)、java.lang.StringBuffer类
2)、java.lang.StringBuilder类


【区别】:StringBuffer和StringBuilder的区别

都用于描述字符串缓冲区,并且是等价类,兼容api,所有api名字都相同;

StringBuffer类:
        jdk1.0就存在(古老)
        实行了同步,意味着是线程安全的类,效率低

StringBuilder类:
        jdk1.5版本才出现(较新)
        没有实行同步,意味着是线程不安全的类,效率高


常用构造方法:

StringBuilder() 
          构造一个不带任何字符的字符串生成器,其初始容量为 16 个字符。
StringBuilder(int capacity) 
          构造一个不带任何字符的字符串生成器,其初始容量由 capacity 参数指定。 
StringBuilder(String str) 
          构造一个字符串生成器,并初始化为指定的字符串内容。
      

 2、常用方法:因为两个类的api名完全一样,下面只以StringBuilder为例,使用它的机率更大:

/*
    1、增操作:
    append
    insert
*/
sb.append("abc").append(123).append(3.14).append(true);
sb.insert(5, "java");

/*
    2、删操作:
    delete
    deleteCharAt
*/
sb.delete(5, 8);    //含头不含尾
sb.deleteCharAt(5);

/*
    2、改操作:
    reverse
    setCharAt
    setLength
*/
sb.reverse();
sb.setCharAt(5, 'W');
sb.setLength(10);    //将容量设为10

3、为了比较String、StringBuilder、StringBuffer的性能与空间使用率,需要讲一个拓展:

System类:
    static long currentTimeMillis():返回以毫秒为单位的当前时间。 

    解析方法:
        得到1970年1月1日0点0分0秒至这一刻的毫秒数    称为:Unix时间戳

Runtime类:
    static Runtime getRuntime():返回与当前 Java 应用程序相关的运行时对象。 

    long totalMemory():返回 Java 虚拟机中的内存总量。 

    long freeMemory():返回 Java 虚拟机中的空闲内存量。 

然后下面代码比较性能:

public class TestSB_2 {
    public static void main(String[] args) {
//        testString();             //String类耗时:5664          String类占用内存:315650056
//        testStringBuffer();       //StringBuffer类耗时:20      StringBuffer类占用内存:5748280
        testStringBuilder();        //StringBuilder类耗时:16     StringBuilder类占用内存:5748416
    }

    public static void testString() {
        //记录当前时间
        long start = System.currentTimeMillis();
        String str = "";
        for (int i = 1;i <= 100000;i++) {
            str += i;
        }
        //记录当前时间
        long end = System.currentTimeMillis();
        System.out.println("String类耗时:" + (end - start));
        Runtime rt = Runtime.getRuntime();
        System.out.println("String类占用内存:" + (rt.totalMemory() - rt.freeMemory()));
    }

    public static void testStringBuffer() {
        //记录当前时间
        long start = System.currentTimeMillis();
        StringBuffer sb = new StringBuffer("");
        for (int i = 1;i <= 100000;i++) {
            sb.append(i);
        }
        //记录当前时间
        long end = System.currentTimeMillis();
        System.out.println("StringBuffer类耗时:" + (end - start));
        Runtime rt = Runtime.getRuntime();
        System.out.println("StringBuffer类占用内存:" + (rt.totalMemory() - rt.freeMemory()));
    }

    public static void testStringBuilder() {
        //记录当前时间
        long start = System.currentTimeMillis();
        StringBuilder sb = new StringBuilder("");
        for (int i = 1;i <= 100000;i++) {
            sb.append(i);
        }
        //记录当前时间
        long end = System.currentTimeMillis();
        System.out.println("StringBuilder类耗时:" + (end - start));
        Runtime rt = Runtime.getRuntime();
        System.out.println("StringBuilder类占用内存:" + (rt.totalMemory() - rt.freeMemory()));
    }
}

 本电子书目录:《Java基础的重点知识点全集》

你可能感兴趣的:(java)