第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);    //将容量设为103、为了比较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基础的重点知识点全集》
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!