Java常用类04:StringBuffer、StringBuilder类

StringBuffer,可变长字符串类,线程安全高,运行效率慢,适用于多线程

StringBuilder,可变长字符串类,运行效率快,线程不安全,适用于单线程

二者都比String类运行效率高,也更节省内存,采用独有的append()和insert()方法添加元素,不能使用+字符串拼接

append()、insert()、replace()、delete()、reverse()方法

public class Hello {
    public static void main(String[] args) {
        StringBuilder str = new StringBuilder();  //StringBuffer类的方法完全一样

        str.append("语言");  //append()方法追加,不能用+拼接
        str.insert(0, "java");  //insert()方法在指定位置插入
        System.out.println(str);  //java语言,可以看到StringBuffer是直接修改源字符串的,不需要重新赋值

        String a = "java语言";
        System.out.println(str.toString() == a);  //false,StringBuffer类重写了toString()方法,将其转换成一个新的String对象而不是常量池,因此和普通String是不一样的
        System.out.println(str.toString().equals(a));  //true

        str.replace(0, 2, "Ja");  //replace()方法在指定范围进行替换
        System.out.println(str);  //Java语言
        str.setCharAt(0, 'j');  //setCharAt()方法将指定位置字符进行替换

        str.delete(4, str.length());  //delete()方法将指定范围删除
        System.out.println(str);  //java
        str.deleteCharAt(3);  //deleteCharAt()方法删除指定位置的字符
        System.out.println(str);  //jav

        str.reverse();  //reverse()方法反转字符串
        System.out.println(str);
    }
}

目前toString()方法用处总结:

  1. Object类用来返回对象的字符串表示,一般会重写该方法自定义打印的内容
  2. Arrays类继承Object,用来将数组转换为字符串打印,Arrays.toString(args)
  3. Exception类继承Object,在自定义异常类时重写toString()方法,打印异常信息
  4. StringBuffer和StringBuilder类继承Object,将其转换成一个新的String对象而不是常量池,因此和普通String是不一样的

charAt()、indexOf()、length()、substring()

其他一些常用的方法和String类一样

注意要先用toString()方法转换成字符串,才能使用toCharArray()方法转换成字符数组

验证运行效率

public class Hello {
    public static void main(String[] args) {
        String s1 = "";
        StringBuffer s2 = new StringBuffer();
        StringBuilder s3 = new StringBuilder();
        
        //System类的currentTimeMillis()方法返回1970年1月1日至今过去的毫秒数
        long start = System.currentTimeMillis();
        
        for (int i = 0; i < 99999; i++) {  //21000毫秒
            s1 += i;
        }
        
//        for (int i = 0; i < 99999; i++) {  //8毫秒
//            s2.append(i);
//        }
        
//        for (int i = 0; i < 99999; i++) {  //6毫秒
//            s3.append(i);
//        }
        long end = System.currentTimeMillis();
        System.out.println("用时:" + (end - start) + "毫秒");
    }
}
posted @ 2021-09-09 10:42  振袖秋枫问红叶  阅读(59)  评论(0)    收藏  举报