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

2024-01-03 09:23:27

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基础的重点知识点全集》

文章来源:https://blog.csdn.net/jnbbwyth/article/details/135352943
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。