ThinkChat2.0新版上线,更智能更精彩,支持会话、画图、阅读、搜索等,送10W Token,即刻开启你的AI之旅 广告
>[success] # Java -- StringBuilder 和 StringBuffer 1. 由于**String**类描述的字符串内容是个**常量不可改变**,当需要在Java代码中描述**大量类似的字符串时**,只能**单独申请和存储**,此时会造成内存**空间的浪费** ~~~ public class TestStr { public static void main(String[] args) { // 下面相当于开辟了三次空间 String 类型修改是字符串本身是个常量不会改变 String str = "123"; str = "123456"; str = "123456789"; } } ~~~ 2. 当我们使用大数据量字符串拼接时候发现会出现卡顿例如下面的代码会卡顿一会才会出现结果 ~~~ public class StringBuilderDemo1 { public static void main(String[] args) { String s = ""; for (int i = 0; i < 1000000; i++) { s = s + "abc"; } System.out.println(s); } } ~~~ * 这种情况下就可以使用`StringBuilder` ~~~ public class StringBuilderDemo2 { public static void main(String[] args) { StringBuilder sb = new StringBuilder(); for (int i = 0; i < 1000000; i++) { sb.append("abc"); } System.out.println(sb); } } ~~~ 3. 使用**java.lang.StringBuilder**类和**java.lang.StringBuffer**类来描述字符序列可**以改变的字符串** 解决每次都要单独申请和储存的问题 4. `StringBuffffer`类是从jdk1.0开始存在,**属于线程安全的类,因此效率比较低**,`StringBuilder`类是从jdk1.5开始存在,**属于非线程安全的类,效率比较高**。 5. 因为`StringBuilder`是Java已经写好的类java在底层对他做了一些特殊处理。**打印对象不是地址值而是属性值。** 6. 总结在使用场景上,**字符串的拼接**、**字符串的反转** 这两个场景推荐使用`StringBuilder` >[info] ## 使用 StringBuilder * 常用的构造方法 |方法声明| 功能介绍| |--|--| |StringBuilder() |使用无参方式构造对象,容量为16| |StringBuilder(int capacity) |根据参数指定的容量来构造对象,容量为参数指定大小| |StringBuilder(String str) |根据参数指定的字符串来构造对象,容量为:16+字符串长度| * 构造方法使用 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(29); StringBuilder sb3 = new StringBuilder("hello"); } } ~~~ * 常见的成员方法 |方法声明 |功能介绍| |--|--| |int capacity() |用于返回调用对象的容量| |int length() |用于返回字符串的长度,也就是字符的个数| |StringBuilder insert(int offset, String str) |插入字符串并返回调用对象的引用,就是自己| |StringBuilder append(String str) |追加字符串| |StringBuilder deleteCharAt(int index)|将当前字符串中下标为index位置的单个字符删除| |StringBuilder delete(int start,int end) |删除字符串| |StringBuilder replace(int start,int end,String str)|替换字符串| |StringBuilder reverse() |字符串反转| >[danger] ##### capacity 和 length 用法 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder(); StringBuilder sb2 = new StringBuilder(29); StringBuilder sb3 = new StringBuilder("hello"); // 打印字符串 自动调用toString方法 啥也没有 System.out.println(sb1); // '' System.out.println(sb2); // '' System.out.println(sb3); // hello // sb1 印容量capacity 和 长度length System.out.println(sb1.capacity()); // 16 System.out.println(sb1.length()); // 0 // sb2 印容量capacity 和 长度length System.out.println(sb2.capacity()); // 29 System.out.println(sb2.length()); // 0 // sb3 印容量capacity 和 长度length System.out.println(sb3.capacity()); // 16 +5 = 21 System.out.println(sb3.length()); // 5 } } ~~~ >[danger] ##### insert 插入字符串 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); // 向下标为0的位置插入字符串内容"abcd",也就是向开头位置插入字符串内容 StringBuilder sb2 = sb1.insert(0, "abcd"); System.out.println(sb1); // abcdhello System.out.println(sb2); // abcdhello System.out.println(sb2 == sb1); // true // 会改变原字符串 // 从第四字符位置插入字符串"1234" sb2.insert(4, "1234"); System.out.println(sb2); // abcd1234hello // 从末尾添加字符串 // 向末尾位置插入字符串"ABCD" sb2.insert(sb2.length(), "ABCD"); System.out.println(sb2); // abcd1234helloABCD } } ~~~ >[danger] ##### append -- 向末尾位置追加 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); // 向末尾位置追加字符串内容 sb1.append("aaa"); System.out.println(sb1); // helloaaa } } ~~~ >[danger] ##### deleteCharAt -- 删除下角标对应位置字符 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); // 删除删除下标为1的单个字符 System.out.println(sb1.deleteCharAt(1)); // hllo StringBuilder sb2 = new StringBuilder("abcdef"); // 使用循环依次删除从脚本为2字符串 int index = 2; for (int i = index; i < sb2.length(); i++) { // 删除一个字符后就跳过一个字符继续删除,因为每当删除一个字符后后面的字符会向前补位,因为下标会发生变化 // 始终删除下标为2的字符 sb2.deleteCharAt(i); } System.out.println(sb2); // abdf // 利用倒序删除 StringBuilder sb3 = new StringBuilder("abcdef"); int index1 = 2; for (int i = sb3.length() - 1; i > index1; i--) { sb3.deleteCharAt(i); } System.out.println(sb3); // abc } } ~~~ >[danger] ##### delete -- 删除字符串 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); // 删除删除0 - 2的字符 System.out.println(sb1.delete(0, 2)); // llo StringBuilder sb2 = new StringBuilder("hello"); // 删除删除1 - 结尾的字符 System.out.println(sb2.delete(1, sb2.length())); // h } } ~~~ >[danger] ##### setCharAt -- 内容的修改 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); sb1.setCharAt(0, 'z'); System.out.println(sb1); // zello } } ~~~ >[danger] ##### replace -- 替换字符 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); sb1.replace(0, 2, "asdfg"); System.out.println(sb1); // asdfgllo } } ~~~ >[danger] ##### reverse -- 字符串反转 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); sb1.reverse(); System.out.println(sb1); // olleh } } ~~~ >[danger] ##### indexOf/lastIndexOf -- 根据字符串找到对应位置 ~~~ public class TestStr { public static void main(String[] args) { StringBuilder sb1 = new StringBuilder("hello"); int l = sb1.indexOf("l"); int ll = sb1.lastIndexOf("l"); System.out.println(l); // 2 System.out.println(ll); // 3 } } ~~~ >[info] ## 综合案例 * 将键盘录入的值进行反转并且转换为字符串(`StringBuilder`场景反转) ~~~ import java.util.Scanner; public class StringTest { public static void main(String[] args) { Scanner sc = new Scanner(System.in); String str = sc.next(); StringBuilder strB = new StringBuilder(); str = strB.append(str).reverse().toString(); System.out.print(str); } } ~~~