首页 > 其他 > 详细

StringBuffer类

时间:2020-07-05 09:31:54      阅读:40      评论:0      收藏:0      [点我收藏+]

StringBuffer类

字符串拼接存在的问题

  • 思考:我们在实际开发中,如果需要进行字符串的频繁拼接,会有什么问题?

    • 因为Java中的字符串是不可变的,每一次拼接都会产生新的字符串。这样会占用大量的方法区内存,造成内存空间的浪费。
    • String s = "abc";s += "hello"; 这两行代码,就导致在方法区字符串常量池当中创建了3个对象。分别是:"abc""hello""abchello"
    public class StringBufferTest01 {
        public static void main(String[] args) {
            String s="";
    //        这样做会给java的方法区字符串常量池带来很大压力。
            for (int i = 0; i < 100; i++) {
                s+=i;
                System.out.println(s);
            }
        }
    }
    

StringBuffer类的概述

  • 如果以后要进行大量字符串的拼接操作,建议使用JDK中自带的:-
    • java.lang.StringBuffer
    • java.lang.StringBuilder
  • StringBuffer底层实际上是一个byte[]数组,往StringBuffer中放字符串,实际上是放到byte[]数组中了。StringBuffer的初始化容量是16。

StringBuffer进行字符串拼接

public class StringBufferTest02 {
    public static void main(String[] args) {
//        创建一个初始化容量为16个byte[]数组。(字符串缓冲区对象)
        StringBuffer stringBuffer = new StringBuffer();
//        拼接字符串,以后拼接字符串统一调用append()方法
//        append是追加的意思
        stringBuffer.append("a");
        stringBuffer.append("b");
        stringBuffer.append("c");
        stringBuffer.append(3.14);
        stringBuffer.append(true);
//        append()方法底层在追加的时候,如果byte数组满了,会自动扩容。
        stringBuffer.append(100L);
        System.out.println(stringBuffer.toString());
    }
}
  • 如何优化StringBuffer的性能?

    • 在创建StringBuffer的时候尽可能给定一个初始化容量。最好减少底层数组的扩容次数。预估计一下,给一个大一些的初始化数组。
    • 关键点:给出一个合适的初始化容量。可以提高程序的执行效率。
    public class StringBufferTest02 {
        public static void main(String[] args) {
    //        指定初始化容量的StringBuffer对象(字符串缓冲区对象)
            StringBuffer sb = new StringBuffer(100);
            sb.append("hello");
            sb.append("world");
            sb.append("hello");
            sb.append("jack");
            sb.append("hello");
            System.out.println(sb);
            System.out.println(sb.toString());
        }
    }
    

StringBuilder进行字符串的拼接

  • StringBufferStringBuilder的区别
    • StringBuffer中的方法有:synchronized关键字修饰。表示StringBuffer在多线程环境下运行是安全的。
    • StringBuilder中的方法没有:synchronized关键字修饰,表示StringBuilder在多线程环境下运行是不安全的。
    • StringBuffer是线程安全的;StringBuilder是非线程安全的。
public class StringBuilderTest01 {
    public static void main(String[] args) {
//        使用StringBuilder也可以完成字符串的拼接
        StringBuilder sb = new StringBuilder();
        sb.append(100);
        sb.append(true);
        sb.append("hello");
        sb.append("kitty");
        sb.append(3.14);
        System.out.println(sb);
    }
}

StringBuffer类

原文:https://www.cnblogs.com/yxc-160206/p/13237519.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!