📄个人简介
🔔作者简介:大家好,我是小学生!!🙈大三学生一枚,目前正在自学Java,如果大家觉得我写的还不错的话,希望大家给我点赞👍+收藏⭐+评论📢,有什么写的不对的地方还请大家多多指教🙏,共同进步。
📝个人主页:小学生!!
📖系列专栏
🌕阶段一:Java基础编程
💦目前已原创19篇🌕阶段二:数据结构与算法
🌕阶段三:操作系统
🌕阶段四:计算机网络
文章目录
1.StringBuffer类
1.StringBuffer类的结构剖析
- StringBuffer 的直接父类 是 AbstractStringBuilder
- StringBuffer 实现了 Serializable, 即StringBuffer的对象可以串行化
- 在父类中 AbstractStringBuilder 有属性 char[] value,不是final该 value 数组存放 字符串内容,引出存放在堆中的
- StringBuffer 是一个 final类,不能被继承
- 因为StringBuffer字符内容是存在 char[] value, 所以在变化(增加/删除)时不用每次都更换地址(即不是每次创建新对象), 所以效率高于 String。
2.String类 VS StringBuffer类
- String保存的是字符串常量,里面的之可以更改,每次String类的更新实际上就是更改地址,效率很低//private final char value[];
- StringBuffer保存的是字符串变量,里面的之可以更改,每次StringBuffer的更新只是更新内容,不用每次更新地址,效率较高。//char[] value;在堆中
3.String和StringBuffer的转换
public class StringAndStringBuffer {
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);
}
}
4.StringBuffer类的常见方法
- append:在字符串的后面加字符串。
- delete(start,end):删除索引>=start && <end处的字符,前闭后开 [start,end)。
- replace(start,end,str):将start----end间的内容替换成str,前闭后开 [start,end)。
- indexOf :查找子串在字符串第1次出现的索引,如果找不到返回-1
- insert:在字符串中插入其后面的字符向后移。
- length:获取字符串长度。
public class StringBufferMethod {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
//1.在字符串的后面加字符串
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"
/*
* 2.删除索引为>=start && <end 处的字符,前闭后开 [start,end)。
*/
s.delete(11, 14);
System.out.println(s);//"hello,张三丰赵敏true10.5"
//3.将start----end间的内容替换成str,前闭后开 [start,end)。
s.replace(9, 11, "周芷若");
System.out.println(s);//"hello,张三丰周芷若true10.5"
//4.查找指定的子串在字符串第一次出现的索引,如果找不到返回-1
int indexOf = s.indexOf("张三丰");
System.out.println(indexOf);//6
//5.在字符串中插入其后面的字符向后移
//在索引为9的位置插入 "赵敏",原来索引为9的内容自动后移
s.insert(9, "赵敏");
System.out.println(s);//"hello,张三丰赵敏周芷若true10.5"
//6.获取字符串长度
System.out.println(s.length());//22
System.out.println(s);
}
}
2.StringBuilder类
- StringBuilder 继承 AbstractStringBuilder 类 。
- 实现了 Serializable ,说明StringBuilder对象是可以串行化(对象可以网络传输,可以保存到文件)。
- StringBuilder 是final类, 不能被继承。
- StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder的 char[] value;因此,字符序列是堆中。
- StringBuilder 的方法,没有做互斥的处理,即没有synchronized 关键字,因此在单线程的情况下使用StringBuilder。
- StringBuilder与StringBuffer使用的方法一致。
3.String,StringBuffer和StringBuilder的比较
-
StringBuilder和 StringBuffer非常类似,均代表可变的字符序列,而且方法也一样。
-
String:不可变字符序列,效率低,但是复用率高。
-
StringBuffer:可变字符序列、效率较高(增删)、线程安全。
-
StringBuilder:可变字符序列、效率最高、线程不安全。
-
String使用注意说明:
string s=“a”; //创建了一个字符串
s += “b”; //实际上原来的"a"字符串对象已经丢弃了,现在又产生了一个字符串s+“b”(也就是"ab”)。如果多次执行这些改变串内容的操作,会导致大量副本字符串对象存留在内存中,降低效率。如果这样的操作放到循环中,会极大影响程序的性能 =>结论:如果我们对String做大量修改,不要使用String
4.String,StringBuffer和StringBuilder的选择
-
如果字符串存在大量的修改操作,一般使用StringBuffer 或StringBuilder。
-
如果字符串存在大量的修改操作,并在单线程的情况,使用StringBuilder。
-
如果字符串存在大量的修改操作,并在多线程的情况,使用 StringBuffer。
-
如果我们字符串很少修改,被多个对象引用,使用String, 比如配置信息等。