文章目录
写在前面
本文为 StringBuilder、StingBuffer 的笔记
自学java第…天
常常是最后一把钥匙打开了沈殿门,不要失去信心,只要坚持不懈,就终会有结果的 加油,陌生人
一、StringBuffer
1.StringBuffer 的父类是 abstractStringBuilder
2.StriBuffer 实现了 Serializable,即可以串行化
3.在父类 abstractStringBuilder 有属性 char[] value,不是 final该 value 数组存放字符串内容,存放在堆中
4.StringBuffer 是一个 final 类,不能被继承
5.StringBuffer 字符内容存放在 char[] value,所有变化不用每次都更换地址,效率高于 STring
StringBuffer 常用构造器
1.StringBuffer():构造一个其中不带字符的字符串缓冲区,初始容量为16个字符
2.StringBuffer(int capacity) // capacity:容量
构造一个不带字符,但具有指定初始容量的字符缓冲区,即对 char[] 大小进行指定
3.StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
public static void main(String[] args) {
// 1.StringBuffer():构造一个其中不带字符的字符串缓冲区,初始容量为16个字符
new StringBuffer();
// 2.StringBuffer(int capacity) // capacity:容量
// 构造一个不带字符,但具有指定初始容量的字符缓冲区,即对 char[] 大小进行指定
new StringBuffer(180);
// 3.StringBuffer(String str):构造一个字符串缓冲区,并将其内容初始化为指定的字符串内容
new StringBuffer("hello"); // 5 + 16 = 21
}
String 和 StringBuffer 相互转换
String 转 StringBuffer
public static void main(String[] args) {
// 方式一:使用构造器
// 注意:返回的才是 StringBuffer,对 str 本身没有影响
String str = "hello,World!";
StringBuffer stringBuffer = new StringBuffer(str);
//方式二:使用 append 方法
StringBuffer stringBuffer1 = new StringBuffer();
stringBuffer1.append(str);
}
StringBuffer 转 String
public static void main(String[] args){
StringBuffer string1 = new StringBuffer("Java");
// 方式一:使用 toString
String str01 = string1.toString();
// 方式二:使用构造器
String str02 = new String(string1);
}
StringBuffer 常用方法
***1.append:增
2.delete(start,end):删除
3.replace(start,end,String):改,将 start ~ end 间的内容替换成 String,不包含 end
4.indexOf:查:查找子串在字符串第一次出现的索引,如果找不到返回 -1
5.insert:插
6.length:获取长度
public static void main(String[] args){
StringBuffer s = new StringBuffer("hello");
// append:增,
s.append(",Java");// hello,Java
s.append(",C").append(",C++").append(",Go");// hello,Java,C,C++,Go
System.out.println(s);// hello,Java,C,C++,Go
// delete(start,end):删除
// 删除索引为 10~16的字符 [10,16)
s.delete(10,16);
System.out.println(s); // hello,Java,Go
// replace(start,end,String):改,将 start ~ end 间的内容替换成 String,不包含 end
s.replace(6,10,"HTML"); // 将 Java 替换成 HTML
System.out.println(s); // hello,HTML,Go
// indexOf:查:查找子串在字符串第一次出现的索引,如果找不到返回 -1
System.out.println(s.indexOf("HTML"));// 6
// insert:插
// 在 HTML 后插入一个 ,Python,其他内容往后
s.insert(10,",Python");
System.out.println(s);// hello,HTML,Python,Go
//length:获取长度
System.out.println(s.length());// 20
}
StringBuffer 练习
题目:
个人思路分析:
1.创建 Scanner 对象,接收用户输入
2.将输入的价格转为 StringBuffer
3.使用 indexOf() 判断小数点位置
4.使用循环,从后往前:
~~~~~~~~~~~~~~ int i = index; i > 0; i–
5.判断 index 是否小于0,如果小于0结束插入,如果不小于,在 index - 3 的位置插入 ,号
个人代码实现
public static void main(String[] args) {
// 输入商品名称和商品价格,要求打印效果示例
// 商品名 商品价格
// 手机 123,456,789.59
// 要求:价格的小数点前面每三位使用逗号隔开,在输出
/*
思路分析
1.创建 Scanner 对象,接收用户输入
2.将输入的价格转为 StringBuffer
3.使用 indexOf() 判断小数点位置
4.使用循环,从后往前:
int i = index; i > 0; i--
5.判断 index 是否小于0,如果小于0结束插入,如果不小于,在 index - 3 的位置插入 ,号
*/
Scanner scanner = new Scanner(System.in);
System.out.print("请输入商品名称:");
String name = scanner.next();
System.out.print("请输入价格:");
String price = scanner.next();
StringBuffer price_ = new StringBuffer(price); // 将价格转为 StringBuffer 类
int index = price.indexOf("."); // 判断小数点在位置
for (int i = index; i > 0; i--) { // 循环从后面往前插
index -= 3; // 插入位置
if (index <= 0) { // 是否小于0,如果小于0结束插入
break;
}
price_.insert(index,",");
}
System.out.println(name + "\t" + price_);
}
测试结果
老师思路
老师思路:
1.定义一个Scanner 对象,接收用户输入的价格(String)
2.希望使用到 StringBuffer的 insert,需要将 String 转为 StringBuffer
3.使用相关方法进行字符串处理
代码实现
String price = "134567891.51";
StringBuffer sb = new StringBuffer(price);
for (int i = sb.lastIndexOf(".") - 3; i > 0; i -= 3) {
sb.insert(i,",");
}
System.out.println(sb);
个人代码实现 VS 老师代码实现
老师代码比个人代码更优更简洁
二、StringBuilder
1.StringBuilder 继承了 abstractStringBuilder 类
2.实现了 serializable 接口,说明StringBuilder 对象可以串行化(对象可以网络传输,可以保存到本地)
3. StringBuilder 是 final 类,不能被继承
4.StringBuilder 对象字符序列仍是存放在父类 abstractStringBuilder 的 char[] value;因此字符序列是在堆中
5.StringBuilder 的方法没有做互斥的处理,即没有 synchronized 关键字,因此,在单线程的情况下使用 StringBuilder
三、String、StringBuffer、StringBuilder的选择
1.如果字符串存在大量的修改操作,一般使用StringBuffer或StringBuilder
2.如果字符串存在大量的修改操作,并在单线程的情况下,使用StringBuilder
3.如果字符串存在大量的修改操作,并在多线程的情况,使用StringBuffer
4.如果字符串很少修改,给多个对象引用,使用 String,比如配置信息等