文章目录
- 0.对应项目:test-spring-boot
- 1.概述
- 2.String的特点
- 2.1.String的缺点
- 2.2.String类常用方法
- 0) 总述
- 1) String substring(int start)
- 2) String substring(int start, int end)
- 3) boolean equals(Object obj)
- 4) boolean contentEquals(CharSequence charSeq)
- 5) String[] split(String str)
- 6) int length()
- 7) boolean startsWith(String prefix)
- 8) boolean endsWith(String suffix)
- 9) String replaceAll(String regex, String replacement)
- 2.3.结论
- 3.StringBuffer和StringBuilder
- 3.1.相比String的优势
- 3.2.二者区别
- 3.3.常用方法(仅以StringBuilder举例)
- 0) 总述
- 1) String substring(int start)
- 2) String substring(int start, int end)
- 3) int length()
- 4) StringBuilder append(Object obj)
- 5) StringBuilder insert(int offset, Object obj)
- 6) StringBuilder delete(int start, int end)
- 7) StringBuilder deleteCharAt(int index)
- 8) StringBuilder replace(int start, int end, String str)
- 4.特例解析
0.对应项目:test-spring-boot
在test-string模块下进行代码演示
1.概述
字符串变量 | 是否可变 | 特点 |
---|---|---|
String | 否 | |
StringBuffer | 是 | 效率低,线程安全(多线程) |
StringBuilder | 是 | 效率高,线程不安全(单线程常用) |
2.String的特点
String是不可变的对象
一旦定义好,之后的所谓的更改,实际上都是在生成新的对象,并重新将引用指向这个新的对象
2.1.String的缺点
以拼接hello和World为例:
String str = "hello" //为"hello"分配内存
str = str + "World" //为"World"分配内存,再为"helloWorld"分配内存
实现上述拼接,生成一个"helloWorld"字符串,就占用了三份内存。这样的做法效率很低,且此时"hello"和"World"这两个对象已经丢失并遗弃,浪费内存空间
2.2.String类常用方法
0) 总述
String target = "helloWorld";
String target2 = "1,2,3,4,5,6,7"
// 01.切割字符串
String str1 = target.substring(3);
// 02.切割字符串
String str2 = target.substring(0, 3);
// 03.判断两个String内容是否相等
boolean flag1 = "helloworld".equals(target);
// 04.判断内容是否相等,参数可以是String、StringBuffer、StringBuilder
boolean flag2 = "helloworld".contentEquals(new StringBuilder("hello"));
// 05.拆分字符串
String[] strArray = target2.split(",");
// 06.返回字符串长度
int length = target.length();
// 07.判断是否以某前缀开始
boolean flag3 = target.startsWith("hello");
// 08.判断是否以某后缀结束
boolean flag4 = target.endsWith("World");
// 09.检索并替换所有
String str3 = target2.replaceAll(",", "★");
1) String substring(int start)
切割字符串,从start开始
2) String substring(int start, int end)
切割字符串,左闭右开
3) boolean equals(Object obj)
判断传入类型是否为String,如果是再判断内容是否相同。
如果传入类型不是String(哪怕是StringBuffer和StringBuilder),那么会直接返回false
4) boolean contentEquals(CharSequence charSeq)
判断内容是否相同
其中CharSequence是String、StringBuffer、StringBuilder的父类
5) String[] split(String str)
拆分字符串
6) int length()
返回字符串长度
7) boolean startsWith(String prefix)
判断字符串是否以某前缀开始
8) boolean endsWith(String suffix)
判断字符串是否以某后缀结束
9) String replaceAll(String regex, String replacement)
第一个参数是正则表达式,也可以直接用目标字符串
第二个参数是替换的字符串
如下例题,是将字符串中所有的 逗号 换成 星星
2.3.结论
如果某字符串经常变动,不应定义为String类型
而应该使用StringBuffer和StringBuilder
3.StringBuffer和StringBuilder
StringBuffer和StringBuilder都是可变的对象
继承关系如下图所示:
3.1.相比String的优势
与String类不同,StringBuffer和StringBuilder的对象是可变的,内容的改变并不会产生新的对象
经常涉及拼接、删减、插入等操作时,应将字符串定义为这两种类型
3.2.二者区别
二者功能、方法都类似,二者的特点是:
1) StringBuffer执行速度较慢,线程安全(支持多线程)
2) StringBuilder执行速度更快,线程不安全(只支持单线程)
基于以上特点,大部分情况都应优先使用StringBuilder
3.3.常用方法(仅以StringBuilder举例)
由于StringBuffer与StringBuilder的方法完全一致
此处仅以StringBuilder举例进行说明
0) 总述
StringBuilder的equals()没有重载,无法用于判断内容相同
调用时应当注意(但常见用法其实是调用String类的contentEquals())
同时StringBuilder没有contentEquals()、split()、replaceAll()方法。
String sb = new StringBuilder("hello");
// 01.切割字符串,返回类型是String
String str1 = sb.substring(3);
// 02.切割字符串,返回类型是String
String str2 = sb.substring(1, 3);
// 03.返回字符串长度
int length = sb.length();
// 04.末尾拼接
sb.append("World");
// 05.索引位置插入
sb.insert(1, "★★★★★★");
// 06.索引范围删除
sb.delete(1, 3);
// 07.索引位置删除
sb.delete(3);
// 08.索引范围替换
sb.replace(1, 3, "★★★★★★");
1) String substring(int start)
切割字符串,返回类型是String
2) String substring(int start, int end)
切割字符串,返回类型是String
3) int length()
返回字符串长度
4) StringBuilder append(Object obj)
在末尾拼接参数的字符串形式
可以是任意类型(甚至是自定义类型)
拼接的内容是这个对象调用toString()的值
可以看到返回类型是StringBuilder,该方法的返回值是这个对象本身。
对于String类,在对String字符串修改后,还要用新的引用去接收,这是因为方法无法对这个对象本身操作,而是生成了一个新的对象
但StringBuilder不需要,因为StringBuilder调用append方法后是对这个对象本身进行操作,而没有产生新的对象
5) StringBuilder insert(int offset, Object obj)
索引位置插入第二个参数的toString()值,和上述的特点类似。
6) StringBuilder delete(int start, int end)
删除从start到end的字符(左闭右开)
7) StringBuilder deleteCharAt(int index)
删除索引位置的字符
8) StringBuilder replace(int start, int end, String str)
替换索引范围内的字符串(左闭右开)
4.特例解析
4.1.例子
分析以下代码:
// 01.使用String实现"拼接"
String str1 = "hello" + "World";
// 02.使用String实现拼接
String str1 = "hello";
String str2 = "World";
String str3 = str1 + str2;
// 03.使用StringBuilder实现拼接
StringBuilder sb = new StringBuilder()
.append("hello")
.append("World");
以上三种情况的效率比较是:
第一种 > 第三种 > 第二种
4.2.解析
1) 第一种其实是伪拼接,实际在执行时,JVM会认为以下两行代码等效:
String str1 = "hello" + "world";
String str1 = "helloWorld";
因此JVM只会为其分配一份的内存资源,而并没有真正拼接,因此效率最快
2) 第二种则是真正的拼接了,执行时JVM会分配三份内存资源,因此效率最差
3) 第三种是使用StringBuilder拼接,JVM会为其分配一份内存资源。