- StringBuffer
- 结构示意图, Serializable,可以实现网络传输
-
package com.jshedu.StringBuffer_; /** * @author Mr.jia * @version 1.0 */ public class StringBuffer01 { public static void main(String[] args) { /* 1.在父类中AbstractStringBuilder 属性char[] value不是final 该value数组存放 字符串内容,引出存放在堆中。 2.StringBuffer 是一个final类,不能被继承 */ StringBuffer hello = new StringBuffer("hello"); } }
StringBuffer字符内容是存在char[] value,所有在变化(增加/删除)不用每次都更换地址(即不是每次创建新对象),所以效率高于String
-
String保存的是字符串常量,里面的值不能更改(每次String类的更新实际上就是更改地址,是里面又创建了个新的对象,所以地址更改)效率较低,private final char value[];
-
StringBuffer保存的是字符串变量,里面的值可以更改,每次StringBuffer的更新实际上可以更新内容,不用每次更新地址【当把原数组占满才开辟一个新的大的数组然后把原先的数据复制过来,这时地址才改变】,效率高。char[] value;//这个放在堆
- StringBuffer构造器
-
package com.jshedu.StringBuffer_; /** * @author Mr.jia * @version 1.0 */ public class StringBuffer02 { public static void main(String[] args) { //1.创建一个 大小为16的char[],用于存放字符内容 StringBuffer stringBuffer = new StringBuffer(); //2.通过构造器指定char[]大小 StringBuffer stringBuffer1 = new StringBuffer(100); //3.通过给一个String 创建 StringBuffer,char[] 大小就是str.length()+16 StringBuffer hello = new StringBuffer("hello"); } }
构造器指定char[]的大小不一样
-
package com.jshedu.StringBuffer_; /** * @author Mr.jia * @version 1.0 */ public class StringBuffer03 { public static void main(String[] args) { //String--->StringBuffer String str = "hello tom"; //方式1:使用构造器 //注意:返回的才是StringBuffer对象,对str本身没有影响 StringBuffer stringBuffer = new StringBuffer(str); //方式2:使用append方法 StringBuffer stringBuffer1 = new StringBuffer(); stringBuffer1 = stringBuffer1.append(str); //StringBuffer--->String StringBuffer stringBuffer3 = new StringBuffer("红楼梦"); //方式1 使用StringBuffer提供的 toString方法 String s = stringBuffer3.toString(); //方式2 使用构造器 String s1 = new String(stringBuffer3); } }
转换的方式
-
package com.jshedu.StringBuffer_; /** * @author 韩顺平 * @version 1.0 */ public class StringBufferMethod { public static void main(String[] args) { StringBuffer s = new StringBuffer("hello"); //增 s.append(',');// "hello," s.append("张三丰");//"hello,张三丰" s.append("赵敏").append(100).append(true).append(10.5);//"hello,张三丰赵敏100true10.5" System.out.println(s);//"hello,张三丰赵敏100true10.5" //删 /* * 删除索引为>=start && <end 处的字符 * 解读: 删除 11~14的字符 [11, 14) */ s.delete(11, 14); System.out.println(s);//"hello,张三丰赵敏true10.5" //改 //老韩解读,使用 周芷若 替换 索引9-11的字符 [9,11) s.replace(9, 11, "周芷若"); System.out.println(s);//"hello,张三丰周芷若true10.5" //查找指定的子串在字符串第一次出现的索引,如果找不到返回-1 int indexOf = s.indexOf("张三丰"); System.out.println(indexOf);//6 //插 //老韩解读,在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移 s.insert(9, "赵敏"); System.out.println(s);//"hello,张三丰赵敏周芷若true10.5" //长度 System.out.println(s.length());//22 System.out.println(s); } }
StringBuffer的方法
-
-
StringBuilder
-
一个可变的字符序列。此类提供一个与
StringBuffer
兼容的 API,但不保证同步。该类被设计用作StringBuffer
的一个简易替换,用在字符串缓冲区被单个线程使用的时候(这种情况很普遍)。如果可能,建议优先采用该类,因为在大多数实现中,它比StringBuffer
要快。 -
在
StringBuilder
上的主要操作是append
和insert
方法,可重载这些方法,以接受任意类型的数据。 -
将
StringBuilder
的实例用于多个线程是不安全的。
-
-
String,StringBuilder,StringBuffer比较
-
StringBuffer和StringBuilder非常类似,均代表可变的字符序列,而且方法也一样。
-
String:不可变字符序列,效率低,但是复用率高
-
StringBuffer:可变字符序列,效率较高(增删),线程安全,看源码
-
StringBuilder:可变字符序列,效率最高,线程不安全
-
String使用注意说明:String s="a";//创建一个字符
-
s+="b";//实际上原来的"a"字符串对象已经丢弃了,现在又产生一个字符串s+"b"(也就是"ab")。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能==>结论:如果我们对String做大量修改,不用String。
-
-
-
String,StringBuilder,StringBuffer的选择
-
如果字符串存在大量的修改操作,一般使用 StringBuffer 或StringBuilder
-
如果字符串存在大量的修改操作,并在单线程的情况,使用 StringBuilder
-
如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer
-
如果我们字符串很少修改,被多个对象引用,使用String,比如配置信息等
-
StringBuilder的方法使用和 StringBuffer 一样
-