六、StringBuilder ,StringBuffer类
String类是不可变字符串,因为它内部的成员变量字符数组value[]被final修饰一旦赋值不能改变,String 中有很多方法都是对字符串进行各种操作的方法,这些方法往往都有返回值,返回值又是一个新的字符串对象. 比如 str.trim()去除两端的空格等,也包括做字符串的连接str1+str2,也会产生新的字符串,如果程序中需要反复的对一个字符串进行各种处理,就会造成jvm大量的生成新的对象,在高并发的情况下,内存和CPU会很快耗尽,资源消耗很大,在程序中使用的字符串如果一旦生成就不再改变建议用String这样效率更高,否则应当使用可变字符串来替换它,比如StringBuilder和StringBuffer。可变字符串的最大特征在于针对原串的各种操作不会生成新的对象只是对原有对象中数据的修改。所以String 被称为常量是有道理的。
StringBuilder 是非线程安全的,StringBuffer是线程安全的。如果一个串会同时被多个线程操作,此时要使用线程安全的,否则会出错。非线程安全执行速度快。
以上两者所提供 的方法都是一样的,会用一个就可以了。
java.lang.StringBuilder
StringBuilder()
构造一个没有字符的字符串构建器,初始容量为16个字符。
StringBuilder(CharSequence seq)
构造一个包含与指定的相同字符的字符串构建器 CharSequence 。
StringBuilder(int capacity)
构造一个没有字符的字符串构建器,由 capacity参数指定的初始容量。
StringBuilder(String str)
构造一个初始化为指定字符串内容的字符串构建器。
StringBuilder sb = new StringBuilder();//默认容量是16 char[16]
System.out.println(sb.length());//取字符的个数,不是内部数组的长度
StringBuilder append = sb.append(8).append('u').append(3.56).append("abcd");
System.out.println(append);
注意:对StringBuilder对象的操作返回的依然是原有对象的引用。