1、字符串的分类
(1)不可变字符串:String
(2)可变字符串:StringBuilder,StringBuffer
疑问:
(1)可变不可变??
(2)StringBuilder —— (先讲)
(3)StringBuilder和StringBuffer区别 ??
2、StringBuilder底层 —— 非常重要的两个属性:
3、StringBuilder内存分析
注意看数组的扩容。
代码示例:
package test9_StringBuilder;
public class Test1 {
public static void main(String[] args) {
//StringBuilder类在package java.lang 包下,所以直接使用,无需导包。
//创建StringBuilder的对象
StringBuilder sb3 = new StringBuilder();
//表面上调用StringBuilder的空构造器,实际底层是对value数组进行初始化,长度为16
//System.out.println(sb3); //没赋值,是空的
StringBuilder sb2 = new StringBuilder(8);
//表面上调用StringBuilder的有参构造器,传入一个int类型的数,实际底层就是对value数组进行初始化,长度为你传入的数字
System.out.println(sb2); //没赋值,是空的
System.out.println(sb2.length()); //length为 0
//System.out.println(sb2.count);//外部包获取不到count
StringBuilder sb = new StringBuilder("abc"); //底层较为复杂
//sb.append("def").append("aaaaaaaa").append("bbb").append("oooooooo");
System.out.println(sb.append("def").append("aaaaaaaa").append("bbb").append("ooooooo"));
//链式调用方式:return this
//sb = sb.append("def").append("aaaa");
//System.out.println(sb);
}
}
4、解释可变和不可变字符串
(1)String —— 不可变
(2)StringBuilder —— 可变
可变,在StringBuilder 这个对象的地址不变的情况下,想把“abc”变成“abcdef”是可能的,直接追加即可。
代码示例:
package test9_StringBuilder;
public class Test2 {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder();
/* sb.append("abc");
System.out.println(sb);
sb.append("def");
System.out.println(sb);*/
System.out.println(sb.append("abc") == sb.append("def")); //true
}
}
5、常用方法
(1)StringBuilder常用方法
代码示例:
package test9_StringBuilder;
import java.sql.SQLOutput;
public class Test3_methods {
public static void main(String[] args) {
StringBuilder sb = new StringBuilder("nihao!");
//增
sb.append("I'm zhou.");
System.out.println(sb);
//删
sb.delete(3,6); //删除位置在[3,6)上的字符
System.out.println(sb);
sb.deleteCharAt(10);//删除位置在10上的字符
System.out.println(sb);
//改 —— 插入
StringBuilder sb1 = new StringBuilder("aa123bb");
sb1.insert(3,"@"); //在下标为3的位置上插入
System.out.println(sb1);
//改—— 替换
StringBuilder sb2 = new StringBuilder("112233445566778899");
//sb2.replace(4,5,"插入成功!"); //在下标[4,5)位置上插入字符串
sb2.replace(4,14,"插入成功!"); //在下标[4,14)位置上插入字符串
//注:不管插入位置的长短和插入字符串的长短,
//直接用待插入的字符串去替换指定位置上的内容
System.out.println(sb2);
sb2.setCharAt(2,'!');//替换指定位置上的内容
System.out.println(sb2);
//查
StringBuilder sb3 = new StringBuilder("qwerdf");
System.out.println(sb3);
for (int i = 0; i < sb3.length(); i++) {
System.out.print(sb3.charAt(i)+"\t");
}//122128110123109111 ??? 原因是用了'\t',应该是"\t".
// '\t',也即Tab键,ASCII码表对应的是9
System.out.println();
System.out.println(sb3.charAt(2));//e
System.out.println(sb3.charAt(2)+1);//102
//截取
String str = sb3.substring(2,4);
//截取[2,5),返回的是一个新的String,对StringBuilder没有影响
System.out.println(str);
System.out.println(sb3);
}
}
(2)StringBuffer常用方法
同上,将StringBuilder 改为 StringBuffer即可,可见两者用法几乎一样。
6、String、StringBuffer、StringBuilder区别与联系
1) String类是不可变类,即一旦一个String对象被创建后,包含在这个对象中的字符序
列是不可改变的,直至这个对象销毁。
2) StringBuffer类则代表一个字符序列可变的字符串,可以通过append、insert、
reverse、setChartAt、setLength等方法改变其内容。一旦生成了最终的字符串,调
用toString方法将其转变为String。
3) JDK1.5新增了一个StringBuilder类,与StringBuffer相似,构造方法和方法基本相
同。不同是StringBuffer是线程安全的,而StringBuilder是线程不安全的,所以性
能略高。通常情况下,创建一个内容可变的字符串,应该优先考虑使用StringBuilder
StringBuilder : JDK1.5 开始 效率高 线程不安全
StringBuffer : JDK1.0 开始 效率低 线程安全