总有一天,我不再畏惧任何人的离开
—— 24.5.8
StringBuilder的介绍
1.概述
一个可变的字符序列,此类提供了一个与StringBuffer兼容的一套API,但是不保证同步(线程不安全,效率高)
2.作用
主要是拼接字符串
3.问题
a、String也能字符串拼接,直接使用“+”即可,为何还要用StringBuilder去拼接呢?
b、原因:
String每拼接一次,就会产生新的字符串对象,就会在堆内存中开辟新的空间,如果拼接次数多了,会占用内存,效率比较低
StringBuilder,底层自带一个缓冲区(没有被final修饰的byte数组),拼接字符串之后都会在此缓冲区中保存,在拼接的过程中,不会产生新对象,节省内存
4.特点
a、底层自带缓冲区,此缓冲区没有被final修饰的byte数组,默认长度为16
b、如果超出了数组长度,数组会自动扩容
创建一个新长度的新数组,将老数组的元素复制到新数组中,然后将新数组的地址值重新赋值给老数组
c、默认每次扩容老数组的2倍+2
如果一次性添加的数据超出了默认的扩容数组长度(2倍+2),比如存了36个字符,超出了第一次扩容的34,就按照实际数据个数为准,以36扩容,小于等于按默认,大于按实际
5.示例:
public static void main(String[] args) {StringBuilder sb = new StringBuilder("111");sb.append("11111111111111111111111111111111111111");for (int i = 0; i < sb.length(); i++) {System.out.println(sb.charAt(i));System.out.println("这是第"+i+"次输出");}}
StringBuilder的使用
1.构造
StringBuilder()
StringBuilder(String str)
public static void main(String[] args) {StringBuilder sb = new StringBuilder();System.out.println(sb);StringBuilder sb1 = new StringBuilder("abc");System.out.println(sb1);}
2.常用方法:
StringBuilder append(任意类型数据) —> 字符串拼接,返回的是StringBuilder自己
public static void main(String[] args) {StringBuilder sb = new StringBuilder();StringBuilder sb1 = new StringBuilder("张晓明");System.out.println(sb);System.out.println(sb1);System.out.println(sb1==sb);System.out.println("——————————————————————————");// 链式调用StringBuilder sb2 = new StringBuilder();sb2 = sb.append("赵敏").append("周芷若").append("小昭");System.out.println(sb);System.out.println(sb2==sb); //true}
StringBuilder reverse()->字符串翻转,返回的是StringBuilder自己
public static void main(String[] args) {StringBuilder sb = new StringBuilder();StringBuilder sb1 = new StringBuilder("张晓明");System.out.println(sb);System.out.println(sb1);System.out.println(sb1==sb);System.out.println("——————————————————————————");// 链式调用StringBuilder sb2 = new StringBuilder();// 字符串添加sb2 = sb.append("赵敏").append("周芷若").append("小昭");System.out.println(sb);System.out.println(sb2==sb); //trueSystem.out.println("——————————————————————————");// 字符串翻转sb.reverse();System.out.println(sb);}
String tostring() —> 将StringBuilder转成String —> 用StringBuilder拼接字符串是为了效率,为了不占内存,那么拼完之后我们后续可能会对拼接好的字符串进行处理,就需要调用String中的方法,所以需要将StringBuilder转为String
public static void main(String[] args) {StringBuilder sb = new StringBuilder();StringBuilder sb1 = new StringBuilder("张晓明");System.out.println(sb);System.out.println(sb1);System.out.println(sb1==sb);System.out.println("——————————————————————————");// 链式调用StringBuilder sb2 = new StringBuilder();// 字符串添加sb2 = sb.append("赵敏").append("周芷若").append("小昭");System.out.println(sb);System.out.println(sb2==sb); //trueSystem.out.println("——————————————————————————");// 字符串翻转sb.reverse();System.out.println(sb);System.out.println("——————————————————————————");// 可变字符串转定长字符串String s = sb.toString();System.out.println(s);}
3.练习
练习1:
键盘录入一个字符串,判断此字符串是否为"回文内容"
public static void main(String[] args) { // 1.创建Scanner对象Scanner sc = new Scanner(System.in);String data = sc.next(); // 2.创建StringBuilder对象StringBuilder sb = new StringBuilder(data); // 3.reverse 字符串翻转sb.reverse(); // 4.将StringBuilder转为String,将可变字符串转为不可变字符串String s = sb.toString(); // 5.判断if (data.equals(s)){System.out.println("是回文内容");}else{System.out.println("不是回文内容");}}
练习2
定义一个数组,以[元素1,元素2,元素3..]的形式输出,用stringBuilder拼接
// 定义一个数组,以[元素1,元素2,元素3..]的形式输出,用stringBuilder拼接public static void main(String[] args) {// 1.创建可变字符串StringBuilder sb = new StringBuilder();// 2.从键盘输入字符串Scanner sc = new Scanner(System.in);System.out.println("请您输入拼接的字符串");// 3.可变字符串接收输入的字符串sb.append(sc.nextLine());// 将可变字符串转变为字符串,然后去除空格String sb1 = sb.toString().replace(" ","");char[] arr = new char[sb1.length()];for (int i = 0; i < sb1.length(); i++) {arr[i] = sb1.charAt(i);}System.out.print("[");for (int i = 0; i < arr.length; i++) {System.out.print(arr[i]+" ");}System.out.print("]");}
String:拼接字符串效率低,每拼接一次,都会产生一个新的字符串对象,耗费内存资源StringBuilder和StringBuffer区别:
a.相同点:
用法一样,作用一样
b.不同点:
StringBuilder:拼接效率比StringBuffer高
线程不安全
StringBuffer:效率比较低,线程安全
拼接效率:StringBuilder>StringBuffer>String
总结
String
1.概述
代表的是字符串
2.特点
a.凡是带双引号的,都是String的对象
b.字符串是常量,他们的值在创建之后不能被更改
c.srring对象是不可变的,所以可以共享3.创建
a.String0
b.String(String s)
c.sring(char[] chars)
d.string(bytell bytes)e.string(char0] chars,int offset,int count)
chars代表被转的数组
ofset代表从数组的哪个索引开始转
count代表转多少个f.String(bytel] bytes,int offset,int count)
bytes代表被转的数组
offset代表从数组的哪个素引开始转count代表转多少个
4.方法
a.判断方法
① boolean equals(Object obj) -- 判断字符串内容是否一样
② boolean equalslgnoreCase(Strings) -- 判断字符串内容是否一样,忽略大小写
b.获取方法
① int length() -- 获取字符串长度
② Slring concal(slring s)-- 拼接字符串,返回新串
③ char charAt(int index)-- 根据索引获取对应的字符
④ int indexOfstrings) -- 获取指定字符在字符串中第一次出现的素引位置
⑤ String subString(int beginIndex) -- 从beginIndex开始截取字符串到最后
⑥ String substring(int beginindex,int endindex) -- 从beginIndex到endIndex截取字符串,含头不含尾c.转换方法
① char[] toCharArray() -- 将字符串转成char数组
② byte[] getBytes0 -- 将字符串转成byte数组
③ bytell getBytes(Sting charsetName) -- 按照指定的编码规则将字符串转成byte数组④ String replace(c1,c2) -- 将c1替换成c2
d.分割方法
① String[] split(string regex) -- 按照指定规则分割字符串
e.其他方法
① boolean contains(String s) -- 判断字符串是否包含指定的字符串内容
② boolean endsWith(string s) -- 判断字符串是否以指定的串儿结尾③ boolean startsWith(String s) -- 判断字符串是否以指定的串儿开头
④ String toLowerCase() -- 将字母转成小写
⑤ String toUpperCase() -- 将字母转成大写
⑥ String trim() -- 去掉字符串两端空格StringBuilder
1.概述
可变的字符序列
2.特点
自带缓冲区,拼接字符串不会随意产生新对象!
3.常用方法
a.StringBuilder append(任意类型)- 字符串拼接,返回自己
b.StringBuilder reverse0 -- 字符串内容翻转,返回自己
c.String toString() -- 将StringBuilder转成String