>[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);
}
}
~~~
- windows -- 环境变量
- Vscode -- 编写java
- 初始java
- java -- 关键字
- 编写第一个java程序
- java -- 注释
- 计算机存储 -- 进制
- java -- 类型
- java -- 变量
- 数字类型
- 布尔类型
- 字符类型
- 类型转换
- 双等比较是什么
- java -- 运算符
- 算数运算符
- 字符串拼接
- 关系/比较运算符
- 自增减运算符
- 逻辑运算符
- 三目运算
- 赋值运算符
- 移位运算符
- 位运算符
- 运算符优先级
- java -- 流程控制语句
- if /else if /if -- 判断
- switch case分支结构
- for -- 循环
- 用双重for循环
- while -- 循环
- do while -- 循环
- 案例练习
- java -- 数组
- 数组的存储
- 数组的增删改查
- 数组的特点
- 数组案例
- 二维数组
- 数组的工具方法
- java -- 方法
- java -- 方法的重载
- java -- 方法的调用流程
- java -- 类方法传参注意事项
- java -- 方法练习案例
- 对比 return break continue
- for each循环
- java -- 基础练习
- java -- 面向对象
- java -- 创建类和对象
- java -- 访问控制符
- java -- 类成员方法
- java -- 构造方法
- java -- this
- java -- 封装
- java -- 对象内存图
- java -- 创建对象案例
- java -- static
- java -- 继承
- super -- 关键字
- java -- 构造块和静态代码块
- java -- 重写
- java -- final
- java -- 多态
- java -- 抽象类
- java -- 接口
- 引用类型数据转换
- 综合案例
- java -- 内部类
- java -- 回调模式
- java -- 枚举类型
- java -- switch 使用枚举
- java -- 枚举方法使用
- java -- 枚举类实现接口
- java -- javaBean
- java -- package 包
- java -- import
- java -- 递归练习
- java -- 设计模式
- 单例模式
- java -- 注解
- java -- 元注解
- Java -- 核心类库
- java -- 处理字符串
- Java -- String
- String -- 常用方法
- String -- 正则
- Java -- StringBuilder 和 StringBuffer
- 知识点
- Java -- StringJoiner 字符串拼接
- 练习题
- 字符串的总结
- Java -- 包装类
- Integer
- Double
- Boolean
- Character
- java -- 集合类
- java -- util.Collection
- Iterator接口
- java -- util.List
- java -- ArrayList
- java -- util.Queue
- java -- util.Set
- java -- util.Map
- java -- util.Collections
- Java -- Math
- Java -- java.lang
- Java -- Object
- Java -- 获取当前时间戳
- Java -- 异常
- Java -- java.util
- java -- Date
- java -- Calender
- Java -- java.text
- Java -- SimpleDateFormat
- Java -- java.time
- Java -- java.io
- java -- io.File
- java -- 泛型
- IDEA -- 用法