StringBuffer类
Posted zhaoyunlong
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了StringBuffer类相关的知识,希望对你有一定的参考价值。
StringBuffer代表着可变的字符序列, 线程安全,效率相对于String快 相对于StringBuilder较低
底层也是char [] 来存储的
java.lang.StringBuffer代表可变的字符序列,JDK1.0中声明,可以对字符 串内容进行增删,此时不会产生新的对象。
? 很多方法与String相同。
? 作为参数传递时,方法内部可以改变值。
StringBuffer类不同于String,其对象必须使用构造器生成。有三个构造器:
StringBuffer():初始容量为16的字符串缓冲区
StringBuffer(int size):构造指定容量的字符串缓冲区
StringBuffer(String str):将内容初始化为指定字符串内容
源码分析:
String str = new String(); // 相当于 char [] value = new char[0]; String的底层实现就是char [] String str1 = new String("abc"); // 相当于 char [] value = new char []{"a","b", "c"} StringBuffer sb1 = new StringBuffer(); char [] value = new char [16]; 底层创建了一个长度为16的char数组 system.out.println(sb1.length()); // 0 虽然他的底层数组长度为16 但是他本身的length仍然是0 StringBuffer sb2 = new StringBuffer("abc"); // char [] value = new char["abc".length()+16]
问题:
StringBuffer sb2 = new StringBuffer("abc") 写出输出内容: system.out.println(sb2); 是3 虽然它的底层是16 只是代表可以放置的 而他本身的是count统计出来的是3,
StringBuffer扩容问题:
StringBuffer虽然默认创建一个可以存放16的char [] 容器, 如果超出这个长度需要扩容, 默认情况下扩容为原来容器的2倍+2,并且把原有数组的元素都复制到新数组中
指导: 在开发中建议大家一初始就使用: StringBuffer(int capacity) 一初始就指定长度防止后面再扩容
StringBuffer的方法
可变的字符串序列 StringBuffer的常用方法 append() 在最后的位置上添加一个字符, 常用语拼接 delete(int start, int end); 删除指定位置的内容 replace(int start, int end, String str); 把[start end)的内容替换为str insert(String str); 指定位置插入str reverse(); 把当前字符串翻转 indexOf() 根据内容查下标
charAt() 根据下标查内容 subString() ; 截取字符串 左闭右开 setCharAt(int n, char ch); 改变指定位置的字符 增: append() 删: delete() 查: charAt(int n) 根据下标查内容, indexOf(String str) 根据内容查下标 改: setCharAt();修改其中的一个字符, replace()修改其中的一段字符 插入: insert()
以 StringBuffer stringBuffer = new StringBuffer("abc"); 为 例??
添加: append(String str) 在末尾处添加str
// 增加 append() 在末尾后增加字符 stringBuffer.append("l"); System.out.println(stringBuffer); // abcl
删除: delete(int start, int end)
删除字符串以下标start开始 下标end结尾 的区间内容, 左闭右开
//删除 delete(int start, int end-1) 删除start开始end-1的下标区间字符 左闭右开 stringBuffer.delete(1,2); // 删除下标为1的字符 System.out.println(stringBuffer);// acl
插入: insert(int n, String str)
在字符串下标n处添加str
// 插入 insert(int n, String str) 在下标为n处插入str stringBuffer.insert(1,"ww"); System.out.println(stringBuffer); // awwcl
改:
替换: replcae(int start, int end, String str)
将字符串以下标start开始 下标end区间内的替换为str
// 替换 replace(int start, int end, String str) 把从start开始到 end的上一位区间的字符替换为str ,左闭右开 stringBuffer.replace(3, 4,"老王"); // 把下标为3的字符替换为老王 System.out.println(stringBuffer); // aww老王l
修改单个字符: setCharAt() ,只能是字符不能是字符串
StringBuffer stringBuffer2 = new StringBuffer("你是一个dahaoren"); stringBuffer2.setCharAt(4,‘b‘); // 只能替换单独的字符 并且只能是字符不能是字符串
查:
根据内容获取下标 indexOf(String str);
获取字符串中str的下标
//indexOf() //输出字符串的下标 System.out.println(stringBuffer.indexOf("l")); // 0
输出下标的内容 charAt(int n)
// charAt(int n) // 输出下标是n的字符串 System.out.println(stringBuffer.charAt(3));
截取 subString(int start ,int end) 左闭右开
截取字符串中下标以start开始以下标end区间的内容
//截取 : subString(int start, int end) 获取以start开始end -1 的下标元素,左闭右开 System.out.println(stringBuffer.substring(3,5)); // ww
StringBuilder 类
StringBuilder 和 StringBuffer 非常类似,均代表可变的字符序列,而且 提供相关功能的方法也一样
面试题:
对比String、StringBuffer、StringBuilder String(JDK1.0):不可变字符序列
StringBuffer(JDK1.0):可变字符序列、效率低、线程安全
StringBuilder(JDK 5.0):可变字符序列、效率高、线程不安全 注意:作为参数传递的话,方法内部String不会改变其值,StringBuffer和StringBuilder 会改变其值。
以上是关于StringBuffer类的主要内容,如果未能解决你的问题,请参考以下文章
Java中的StringStringBuilder以及StringBuffer
StringBuffer类 的append方法 怎么添加字符串