编程随笔-SpringBoot | 05.String、StringBuffer和StringBuilder

0.对应项目:test-spring-boot

在test-string模块下进行代码演示

参考文章:String、StringBuffer与StringBuilder之间区别

1.概述

字符串变量是否可变特点
String
StringBuffer效率低,线程安全(多线程)
StringBuilder效率高,线程不安全(单线程常用)

2.String的特点

String是不可变的对象

一旦定义好,之后的所谓的更改,实际上都是在生成新的对象,并重新将引用指向这个新的对象

2.1.String的缺点

以拼接hello和World为例:

String str = "hello"				//为"hello"分配内存
str = str + "World"				 	//为"World"分配内存,再为"helloWorld"分配内存

img

实现上述拼接,生成一个"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)

切割字符串,左闭右开

image-20210506184614401


3) boolean equals(Object obj)

判断传入类型是否为String,如果是再判断内容是否相同。

如果传入类型不是String(哪怕是StringBuffer和StringBuilder),那么会直接返回false

image-20210506171133793


4) boolean contentEquals(CharSequence charSeq)

判断内容是否相同

其中CharSequence是String、StringBuffer、StringBuilder的父类

image-20210506171345743


5) String[] split(String str)

拆分字符串

image-20210506171909337


6) int length()

返回字符串长度


7) boolean startsWith(String prefix)

判断字符串是否以某前缀开始

8) boolean endsWith(String suffix)

判断字符串是否以某后缀结束

image-20210506172823845


9) String replaceAll(String regex, String replacement)

第一个参数是正则表达式,也可以直接用目标字符串

第二个参数是替换的字符串

如下例题,是将字符串中所有的 逗号 换成 星星

image-20210506190020173

2.3.结论

如果某字符串经常变动,不应定义为String类型

而应该使用StringBuffer和StringBuilder

3.StringBuffer和StringBuilder

StringBuffer和StringBuilder都是可变的对象

继承关系如下图所示:

img

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()的值

image-20210506182053825

可以看到返回类型是StringBuilder,该方法的返回值是这个对象本身

对于String类,在对String字符串修改后,还要用新的引用去接收,这是因为方法无法对这个对象本身操作,而是生成了一个新的对象

但StringBuilder不需要,因为StringBuilder调用append方法后是对这个对象本身进行操作,而没有产生新的对象


5) StringBuilder insert(int offset, Object obj)

索引位置插入第二个参数的toString()值,和上述的特点类似。

image-20210506184944649


6) StringBuilder delete(int start, int end)

删除从start到end的字符(左闭右开)

7) StringBuilder deleteCharAt(int index)

删除索引位置的字符

image-20210506185428365


8) StringBuilder replace(int start, int end, String str)

替换索引范围内的字符串(左闭右开)

image-20210506190707946

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会为其分配一份内存资源。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值