1.java.lang.StringBuffer代表可变字符序列,可以对字符串内容进行删减。
很多方法与String相同,但StringBuffer是可变长度的
StringBuffer是一个容器
package com.cn.stringbuffer;
/**
* @author xxx
* @version 1.0
*/
public class StringBuffer01 {
public static void main(String[] args) {
//1. StringBuffer直接父类是AbstractStringBuilder
//2.StringBuffer实现了Serializable,即StringBuffer的对象可以串行化
//3.在父类中 AbstractStringBuilder 有属性 char[] value,不是final
//该 value 数组存放在字符串内容,引出存放在堆中
//4.StringBuffer 是一个final类,不能被继承
//5.因为StringBuffer 字符内容是存在 char[] value,所有在变化(增加或删除)
//不用每次都更滑地址(即 不是每次创建新对象),所以效率高于String
StringBuffer stringBuffer = new StringBuffer("hello");
}
}
2.String VS StringBuffer
1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际就是更新地址,效率较低,
//private final char[] value;
2)StringBuffer保存字符串变量,里面的值可以更改,每次StringBuffer的更新实际上更新内容,不用每次更新地址,效率较高 //char[] value //这个放在堆
3.String 和 StringBuffer 相互转换
package com.cn.stringbuffer;
/**
* @author xxx
* @version 1.0
*/
public class StringBuffer02 {
public static void main(String[] args) {
String str = "hello";
//String -> StringBuffer
//方式一 使用构造器
//注意:返回才是StringBuffer 对象,对str本身没有影响
StringBuffer stringBuffer1 = new StringBuffer(str);
System.out.println(stringBuffer1);
//方式二 使用的是append方法
StringBuffer stringBuffer2= new StringBuffer();
stringBuffer2 = stringBuffer2.append(str);
System.out.println(stringBuffer2);
//StringBuffer -> String
//方式一 使用toString方法
StringBuffer stringbuffer3= new StringBuffer("安子轩");
String s = stringbuffer3.toString();
System.out.println(s);
//方式二 使用构造器
String s1 = new String(stringbuffer3);
System.out.println(s1);
}
}
4.StringBuffer 类的常见方法
package com.cn.stringbuffer;
/**
* @author xxx
* @version 1.0
*/
public class StringBuffer03 {
public static void main(String[] args) {
StringBuffer s = new StringBuffer("hello");
//增加
s.append(',');//hello,
s.append(100);//hello110
s.append("你好").append(100).append('男');//hello 你好 100 男
System.out.println(s);
//删除
/*
删除所以为 >= start && < end 处的字符
解读: 删除 6~9的字符 [6 ,9 )
*/
s.delete(6,9);
System.out.println(s);//hello,你好100男
//替换
//解读:使用 安子轩 替换 索引 6~8 的字符 [6 ,8)
s.replace(6,8,"安子轩");
System.out.println(s);//hello,安子轩100男
//查找指定的子串在字符串第一个出现的索引,如果找不到返回-1
int indexOf = s.indexOf("安子轩");
System.out.println(indexOf);//6
// 插入
//在索引为6的位置 插入"jack",原来索引为9的内容自动后移
s.insert(6,"jack");
System.out.println(s);//hello,jack安子轩100男
System.out.println(s.length());//17
}
}
5.1StringBuffer测试题1
package com.cn.stringbuffer;
/**
* @author xxx
* @version 1.0
*/
public class StringBuffer04 {
public static void main(String[] args) {
String str = null;
StringBuffer stringBuffer = new StringBuffer();
stringBuffer.append(str);//需要看底层源码 AbstractStringBuilder append
System.out.println(stringBuffer.length());//4
System.out.println(stringBuffer);//null
//下面会抛出空指针异常 NullPointerException
StringBuffer stringBuffer1 = new StringBuffer(str);//看底层源码 super(str.length() + 16);
System.out.println(stringBuffer1);
}
}
5.2StringBuffer测试题2
package com.cn.stringbuffer;
/**
* @author xxx
* @version 1.0
*/
public class StringBuffer05 {
public static void main(String[] args) {
//输出商品名称和商品价格,要求打印效果,使用我们前面学习的方法完成
//商品名 商品价格
//手机 123,654.59 要求:价格的小数点前面三位用逗号隔开
String pice = "1236545.59";
StringBuffer stringBuffer = new StringBuffer(pice);
// int i = stringBuffer.lastIndexOf(".");
// stringBuffer = stringBuffer.insert(i-3,",");
for (int i = stringBuffer.lastIndexOf(".")-3; i > 0;i-=3){
stringBuffer = stringBuffer.insert(i,",");
}
System.out.println(stringBuffer);
}
}
6.StringBuilder基本介绍
1)一个可变字符序列。此类提供一个与StringBuffer兼容的API,但不保证同步(StringBuilder 不是线程安全)。该类设计作用Stringbuffer的一个简单替换,用在字符串缓冲区被单个线程使用的时候。如果可以说,建议优先采用该类,因为在大多数显示中,它比Stringbuffer要快。
2)在StringBuilder上的主要操作是append 和 insert 方法,可重载这些方法,已接授任意类型的数据
package com.cn.stringbuilder_;
/**
* @author xxx
* @version 1.0
*/
public class StringBuilder01 {
public static void main(String[] args) {
//解读
//1.StringBuilder 的直接父类 AbstractStringBulider
//2.StringBuilder 实现了Serializable 即StringBuilder的对象可以串行化
//3.在父类中 AbstractStringBulider 有属性 char[] value ,不是final
//该value 数组存放 字符串内容,引出存放在堆中的
//4.Stringbuilder 是一个final类 不能被继承
//5.因为StringBuilder 字符内容是存放在 char[] value,所以在变化【增加/删除】
//不用每次都更换地址【即不是哦每次创建新对象】,所以效率高于String
StringBuilder hello = new StringBuilder("hello");
}
}
//1. StringBuilder 继承 AbstractStringBuilder 类
//2. 实现了 Serializable ,说明 StringBuilder 对象是可以串行化(对象可以网络传输,可以保存到文件)
//3. StringBuilder 是 final 类, 不能被继承
//4. StringBuilder 对象字符序列仍然是存放在其父类 AbstractStringBuilder 的 char[] value;
//因此,字符序列是堆中
//5. StringBuilder 的方法,没有做互斥的处理,即没有 synchronized 关键字,
//因此在单线程的情况下使用
//StringBuilder
7.String StringBuffer 和 StringBuilder比较、
1)StringBuilder 和 StringBuffer非常类似。均代表可变的字符序列,而且方法也一样
2)String:不可变字符序列,效率低,但复用率高
3)StringBuffer :可变字符序列,效率较高(增删),线程安全。
4)StringBuilder:可变字符序列,效率高,线程不安全
5)String 使用注意事项:
String s = "a";//创建了一个字符串
s += "b";//实际上原来的"a"字符串对象已经没了,现在产生了一个字符串s+"b";(也就是"ab").如果多次执行这些改变字符串内容的操作,会导致不良副本自渡船对象存留在内存中,降低效率,如果这样操作放到循环中,会极大影响程序的性能=>结论:如果我们对String 做大量修改,不要使用String
2.String StringBuffer 和 StringBuilder选择
使用原则,
1)如果字符串存在大量的修改操作,一般使用StringBuffer 或 StringBuilder
2) 如果字符串存在大量的修改操作,并且在单线程的情况,使用StringBuilder
3)如果字符串存在大量的修改操作,并且在多线程层的情况,使用StringBuffer
4)如果我们字符串很少改,被多个对象引用,使用String,比如配置信息等。