上一篇中讲解了String类的用法。那么String有什么特点呢?
字符串特点:字符串是常量,其值在创建后就不能被修改。字符串的内容一旦发生变化,就会创建一个新的对象。
代码验证字符串特点:
1 public class Demo1 { 2 3 public static void main(String[] args) { 4 String str1 = "hello"; 5 String str2 = str1+" world"; 6 System.out.println("str1与str2是同一个 对象吗?"+(str1==str2)); 7 } 8 }
因此,字符串的内容不适宜频繁修改,为了解决此问题就出现了StringBuffer类和StringBuilder类。
StringBuffer
StringBuffer 其实就是一个存储字符的容器。StringBuffer 底层是依赖了一个字符数组才能存储字符数据 的,该字符串数组默认 的初始容量是16, 如果字符数组的长度不够使用 时,自动增长1倍+2。
容器具备的行为:增删改查。
具体的方法可以参照api。
1、增加(存储)
StringBuffer append():将指定的数据作为参数添加到已有数据结尾处(除了byte和short类型的数据没有以外其他数据类型都有都可以)
StringBuffer insert(index,数据):可以将数据插入到指定index位置
代码示例如下:
1 public static void stringBuffer_add(){ 2 StringBuffer sb = new StringBuffer(); 3 sb.append("abc").append(true).append(5378);//方法调用链结果是一串字符串 4 StringBuffer sb1 = sb.append(34563); 5 //结果是true sb和sb1指向同一个对象,这叫做面盆理论,不管往StringBuffer这个容器里加什么结果还是这个容器 6 System.out.println("sb==sb1:"+(sb==sb1)); 7 //指定位置添加元素 8 StringBuffer sb2=sb1.insert(3,"hello"); 9 System.out.println(sb2.toString()); 10 }
2、删除
StringBuffer delete(start,end) 删除缓冲区中的数据,包含start,不包含end,如果start超过角标的话,会抛出异常字符串角标越界
StringBuffer deleteCharAt(index) 删除指定位置的字符
代码示例如下:
1 public static void stringBuffer_del(){ 2 StringBuffer sb = new StringBuffer("haohaoxuexi,tiantianxiangshang"); 3 System.out.println(sb.toString()); 4 5 //删除某一部分 6 sb.delete(1,3); 7 System.out.println(sb.toString()); 8 9 //删除字符串中的某一个元素 10 sb.delete(2,3); 11 sb.deleteCharAt(2); 12 System.out.println(sb.toString()); 13 //清空缓冲区 14 sb.delete(0,sb.length()); 15 System.out.println(sb.toString()); 16 }
3、修改
StringBuffer replace(start,end,string); 替换指定位置的字符串
void setCharAt(int index,char ch); 只可以替换某一个字符
代码示例:
1 public static void stringBuffer_Update(){ 2 StringBuffer sb1 = new StringBuffer("javascript"); 3 StringBuffer sb2 = sb1.replace(4,10,"ee"); 4 System.out.println(sb2); 5 sb1.setCharAt(1,'j'); 6 System.out.println(sb1); 7 }
4、查看
char charAt(int index) 获取指定索引的字符
int indexOf(String str) 查找第一次出现字符串的索引
int lastIndexOf(String str) 查找最后一次出现字符串的索引
int length() 返回StringBuffer的长度
String substring(int start , int end) 截取StringBuffer
代码示例:
1 public static void stringBuffer_read(){ 2 StringBuffer sb = new StringBuffer("javascript"); 3 char ch = sb.charAt(3); 4 int index1 = sb.indexOf("sc"); 5 int index2 = sb.lastIndexOf("sc"); 6 int len = sb.length(); 7 String str = sb.substring(5,7); 8 System.out.println("ch="+ch+",index1="+index1+",index2="+index2+",len="+len+",str="+str); 9 }
5、其他方法
StringBuffer reverse(); 反转
setLength();设置StringBuffer容器的长度
void getChars(int srcBegin,int srcEnd,char[] dst,int dstBegin);将缓冲区中指定数据存储到指定字符数组中
代码示例:
1 public static void stringBuffer_Other() { 2 StringBuffer sb = new StringBuffer(); 3 //设置长度 4 sb.setLength(4); 5 System.out.println(sb.length()); 6 7 //将字符串反转 8 StringBuffer sb1 = new StringBuffer("java"); 9 sb1 = sb1.reverse(); 10 System.out.println(sb1); 11 // 将缓冲区中指定数据存储到指定字符数组中 12 char[] arr = new char[15]; 13 StringBuffer sb2 = new StringBuffer("haohaoxuexi"); 14 sb2.getChars(0, 7, arr, 3); 15 for(char c : arr){ 16 System.out.print(c); 17 } 18 }
StringBuilder
JDK1.5版本之后出现了StringBuilder,StringBuilder几乎和StringBuffer中的方法完全一样。
StringBuffer和StringBuilder的相同和不同点:
相同点:
1、两个类都是字符串缓冲类。
2、两个类的方法都是一致的。
不同点:
1、StringBuffer是线程安全的,操作效率低;StringBuilder是线程非安全的,操作效率高。
2、StringBuffer是jdk1.0的时候出现的,StringBuilder是jdk1.5的时候出现的。
推荐使用:StringBuilder,因为其效率高。而且在现实开发中很少出现多线程情况下对同一字符串操作,所以这种操作可以忽略。