第二十章 JavaSE专题之字符串常用类String、StringbBuffer、StringBuilder详述(图解+实测+面试题)
2022/2/13 9:44:57
本文主要是介绍第二十章 JavaSE专题之字符串常用类String、StringbBuffer、StringBuilder详述(图解+实测+面试题),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
1、String类概述
1.1、String介绍
(1)String对象用于保存字符串,也就是一组字符序列
(2)字符串常量对象是用双引号括起的字符序列
(3)字符串的字符使用Unicode字符编码,即一个字符(不区分字母还是汉字)占两个字节;
(4)String类是final类,不能被继承;
(5)String字符串内容底层存储使用char数组存储,并且内存地址不可修改,而数组内容可修改;
private final char value[];
1.2、String类的继承关系
- 查看类图关系:继承一个父类,实现三个接口
(1)父类Object:所有类的基类
(2)接口Serializable:说明String对象可串行化,即该对象可在网络传输
(3)接口Comparable:说明String对象可相互比较大小
- 注意事项:String有很多构造器,即
1.3、String创建剖析
(1)直接赋值
String s1 = "taobao";
-
创建步骤:
- 查看常量池中是否有"taobao"数据空间
- 如果有则直接指向;
- 如果没有则重新创建,然后指向;
- 查看常量池中是否有"taobao"数据空间
-
内存剖析
(2)调用构造器
String s2 = new String("taobao");
-
创建步骤
- 先在堆中创建空间,里面维护了value属性,指向常量池的"taobao"内存地址
- 如果常量池中有"taobao",直接通过value指向队中内存空间
- 如果没有则创建后指向
- 先在堆中创建空间,里面维护了value属性,指向常量池的"taobao"内存地址
-
内存剖析
1.4、String对象特性
(1)面试题1:以下语句创建了几个对象?画出内存布局图
String s1 = "taobao"; s1 = "jingdng";
-
创建对象个数:2个
- ①taobao对象
- ②jingdong对象
-
内存剖析图
(2)面试题2:以下语句创建了几个对象?画出内存布局图
String s1 = "taobao"+".com"; // 优化等价于 String s1 = "taobao.com"
- 创建对象个数:1个
- ①taobao.com
- 内存剖析图
(3)面试题3:以下语句创建了几个对象?画出内存布局图
String s1 = "taobao"; String s2 = ".com"; String s3 = s1 + s2; String s4 = "taobao.com"; // s3和s4地址不相等,s3指向堆,s4指向常量池
- 创建对象个数:
- ①taobao
- ②.com
- ③taobao.com
- 内存剖析图
- 注意事项:关于s3的创建过程
- ①先创建一个 StringBuilder sb = StringBuilder();
- ②执行sb.append(“taobao”);
- ③执行sb.append(".com");
- ④String s3 = sb.toString();
(4)面试题4:以下语句创建了几个对象?
String s1 = new String("hello") + new String("world");
- 创建对象个数:6个
- ①new StringBuilder
- ②堆中new String(“hello”)
- ③常量池中的"hello"
- ④堆中new String(“world”)
- ⑤常量池中的"world"
- ⑥new String (“hello world”)
1.5、String常用方法
方法名称 | 方法描述 | 范例 |
---|---|---|
equals | 区分大小写,判断内容是否相等 | |
equalsIgnoreCase | 忽略大小写的判断内容是否相等 | |
length | 获取字符串的长度,即字符个数 | |
indexOf | 获取字符在字符串中第一次出现的索引,索引从0开始,找不到则返回-1 | |
lastindexOf | 获取字符在字符串中最后一次出现的索引,索引从0开始,找不到则返回-1 | |
substring | 截取指定范围的子串 | |
trim | 去前后空格 | |
charAt | 获取某处索引的字符 |
2、StringBuffer类
2.1、StringBuffer介绍
- 定义:StringBuffer是一个容器,代表可变的字符序列,可以对字符串内容进行增删
(1)StringBuffer的直接父类:AbstractStringBuilder
(2)SringBuffer实现了Serializable,即StringBuffer的对象可串行化
(3)在父类AbstractStringBuilder有属性char数组不是final修饰,该数组存放字符串类型(真正存放位置在堆中)
char[] value;
(4)StringBuffer是一个final类,不能被继承
2.2、StringBuffer类的继承关系
- 查看类图关系:
(1)直接父类AbstractStringBuilder:
①父类Object:所有子类的基类
②接口Appendable:
③接口CharSequence:
(2)接口Serializable:说明String对象可串行化,即该对象可在网络传输
2.3、StringBuffer和Sring区别
(1)String保存的是字符串常量,里面的值不能更改,每次String类的更新实际上就是更改地址,效率较低
- value:指向字符串常量池
private final char value[];
- 内存剖析图
(2)StringBuffer保存的是字符串变量,里面的值可以更改,其更新实际上可以更新内容,不用更新地址,效率较高
- value:指向堆中
char[] value;
- 内存剖析图
- 注意事项:只有当空间大小不够的时候,才会进行地址更改
2.4、StringBuffer创建&转换
(1)StringBuffer创建
// 1、创建一个大小为16的char[],用于存放内容 StringBuffer stringBuffer1 = new StringBuffer(); // 2、创建一个指定char[]大小的stringbuffer StringBuffer stringBuffer2 = new StringBuffer(100); // 3、通过String创造stringbuffer,char[]大小就是str.ength()+16 StringBuffer stringBuffer3 = new StringBuffer("hello");
(2)String和StringBuffer转换
- String转换为StringBuffer:对String没有影响
// String-->StringBuffer String str1 = "hello"; // 1、构造器转换 StringBuffer stringBuffer1 = new StringBuffer(str1); // 2、append转换 StringBuffer stringBuffer2 = new StringBuffer(); stringBuffer2.append(str1);
- StringBuffer转换成String
2.5、StringBuffer常用方法
方法名称 | 方法描述 | 范例 |
---|---|---|
append | 在后面增加字符串 | |
delete | 删除索引从start到end的字符串 | |
replace | 替换指定字符串 | |
indexOf | 查找指定字串在字符串中第一次出现索引位置,没有则返回-1 | |
insert | 在指定索引位置插入字符串 | |
length | 获取长度 |
3、StringBuilder类
3.1、StringBuilder介绍
(1)一个可变的字符序列
(2)应用场景:用在字符串缓冲区被单个线程使用的时候
(3)主要方法:append、insert
3.2、StringBuilder继承关系
- 同StringBuffer
3.3、String、Stringbuffer和StringBuilder区别
(1)String:不可变字符序列,效率低,但是复用率高
(2)StringBuffer:可变字符序列、效率较高、线程安全
(3)StringBuilder:可变字符序列、效率最高、线程不安全
这篇关于第二十章 JavaSE专题之字符串常用类String、StringbBuffer、StringBuilder详述(图解+实测+面试题)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-06-26结对编程到底难不难?答案在这里
- 2024-06-19《2023版Java工程师》课程升级公告
- 2024-06-15matplotlib作图不显示3D图,怎么办?
- 2024-06-1503-Loki 日志监控
- 2024-06-1504-让LLM理解知识 -Prompt
- 2024-06-05做软件测试需要懂代码吗?
- 2024-06-0514-ShardingSphere的分布式主键实现
- 2024-06-03为什么以及如何要进行架构设计权衡?
- 2024-05-31全网首发第二弹!软考2024年5月《软件设计师》真题+解析+答案!(11-20题)
- 2024-05-31全网首发!软考2024年5月《软件设计师》真题+解析+答案!(21-30题)