javaSE String类(超详细)
系列文章目录
文章目录
- 系列文章目录
- @[TOC](文章目录)
- 一、String类基本用法
- 1.1JDK中String类的源码
- 为什么String类被final修饰
- 1.2创建字符串的四种方式
- 1.3字面量
- 内存分析
- 1.4字符串比较
- equals() 使用注意事项
- 二、关于字符串常量池问题(面试重点)
- 2.1池的设计思想:
- 2.2 手工入池:intern方法(面试重点)
- 第一种情况
- 第二种情况(易错点+面试题+重难点)
- 2.3字符串不可变性
- 2.4改变字符串方法
- 三、StringBuffer 和 StringBuilder
- 3.1 String和StringBuilder相互转换
- 3.2 StringBuilder的常用方法
- 面试常考题
- 练习(重难点笔试题)
- 四、String类的常用方法
- 4.1字符串比较
- 4.2字符和字符串相互转换
- 转换部分ch字符数组的部分内容为字符串
- 将字符串变为字符数组
- 4.3判断字符串组成(编程思想)
- 补充字符判断数字的方法
- 4.4字符串和字节的相互转换
- 4.5字符串查找操作
- 4.6字符串替换操作
- 4.7字符串拆分操作
- 拆分IP地址
- 转义处理
- 多次拆分
- 4.8字符串截取处理
- 4.9其他操作
- str.isEmpty()
- byte[]和char[]
- 写一个方法让字符串首字母是大写字符
- 课后练习
- @[TOC](文章目录)
- 1.1JDK中String类的源码
- 为什么String类被final修饰
- 1.2创建字符串的四种方式
- 1.3字面量
- 内存分析
- 1.4字符串比较
- equals() 使用注意事项
- 2.1池的设计思想:
- 2.2 手工入池:intern方法(面试重点)
- 第一种情况
- 第二种情况(易错点+面试题+重难点)
- 2.3字符串不可变性
- 2.4改变字符串方法
- 3.1 String和StringBuilder相互转换
- 3.2 StringBuilder的常用方法
- 面试常考题
- 练习(重难点笔试题)
- 4.1字符串比较
- 4.2字符和字符串相互转换
- 转换部分ch字符数组的部分内容为字符串
- 将字符串变为字符数组
- 4.3判断字符串组成(编程思想)
- 补充字符判断数字的方法
- 4.4字符串和字节的相互转换
- 4.5字符串查找操作
- 4.6字符串替换操作
- 4.7字符串拆分操作
- 拆分IP地址
- 转义处理
- 多次拆分
- 4.8字符串截取处理
- 4.9其他操作
- str.isEmpty()
- byte[]和char[]
- 写一个方法让字符串首字母是大写字符
- 课后练习
一、String类基本用法
1.1JDK中String类的源码
实现了多个接口

为什么String类被final修饰
这个类不希望有别的版本,不能有别的子类实现,不能修改这个类中的方法

1.2创建字符串的四种方式
方式一和方式四最为常用


1.3字面量

内存分析
蓝色方框表示 栈
下图表示的是str和str2引用都指向同一个对象

"Hello"字面量也是一个对象,即使str1改变了原来的指向(原来指向str对象)现在指向str1,原str对象内容hello world不会被修改

1.4字符串比较
==(比较地址)和 equals方法(比较内容)的区别

两个地址不同的对象

equals()方法会区分大小写

也有不区分大小写的比较方法:

equals() 使用注意事项
用username去比较可能会空指针异常

二、关于字符串常量池问题(面试重点)
这三个引用指向了相同的内存地址

相等的原因:

当new关键字产生新对象

不相等的原因:有new就有新对象的产生,新对象产生就有新的内存地址。

2.1池的设计思想:

2.2 手工入池:intern方法(面试重点)

第一种情况
解析:此时因为hello第一次出现,会在常量池产生一个hello的对象,但是str1是通过new关键字产生的对象,str1实则指向的是普通对象hello,并不是常量池中的hello对象。intern()方法有返回值,返回常量池中的地址,但是下图中没有接收返回值,此时str2指向的是常量池中地址,因此str1和str2指向的内存地址不同

内存分析:

解决方法:str1接收一下返回值就可以了。str1接收intern()方法的返回值:返回的是常量池的地址。

第二种情况(易错点+面试题+重难点)
data引用指向字符数组,此时常量池还没有字符串对象,new的对象加入的是一个字符数组,字符数组不是字符串,所以不存在常量池中的对象,常量池还是空,此时的new只是产生了一个普通对象abc。str.intern()会直接把这个对象挪入常量池,虽然str1没有接收intern()方法返回值,但str1还是指向abc,只不过此时abc已经在常量池中了,和情况一是不一样的


补充:


2.3字符串不可变性


为何字符串的对象无法修改内容而其他类的对象能修改内容?
- 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了.
- 不可变对象是线程安全的.
- 不可变对象更方便缓存 hash code, 作为 key 时可以更高效的保存到 HashMap 中

value这个数组是私有权限,字符串外部根本无房访问value的值。并且String并没有提供关于value属性的getter和setter方法。

2.4改变字符串方法
a.在运行时通过反射破坏value数组的封装(了解,不推荐,ds部分讲反射大家就会写了,反射是所有框架的基础)相当于访问一个类的内部private权限的成员
public static void main(String[] args) throws Exception {String str="hello";Class<String>cls=String.class;Field field= cls.getDeclaredField("value");//破坏封装field.setAccessible(true);//在String外部通过反射拿到value数组char[] value=(char[]) field.get(str);value[0]='H';System.out.println(str);}
b.使用StringBuilder类的拼接方法append:

三、StringBuffer 和 StringBuilder
和String类都不是一个类!但两者使用方法都差不多

3.1 String和StringBuilder相互转换

3.2 StringBuilder的常用方法

delete方法删除是左闭右开,没有第十个索引就删除world这个单词

插入数据后,数据对应的索引就是offset

面试常考题


练习(重难点笔试题)

一开始str指向good,在change方法中str引用指向了test ok,在exchange方法调用结束后,里面str和ch引用就出栈了,但是原本的str还是指向good

四、String类的常用方法
4.1字符串比较
比较是否相等用一和二两种方法,要比较大小关系使用第三种方法。



4.2字符和字符串相互转换

toString在类的对象里才有,字符数组不可以使用。这个ch.toString打印的是字符数组地址,而数组Arrarys.toString可以使用

转换部分ch字符数组的部分内容为字符串
offset:表示要变为字符串的起始索引
count:表示要变为字符串的个数

此外还可以使用String str=String.valueOf(ch)
将字符串变为字符数组

System.out.println(str.charAt(10));
// 执行结果
产生 StringIndexOutOfBoundsException 异常
如果索引超过字符串长度会报错

提示:String对象是无法改变的,所以data【0】=H后,如果打印str是不会发生任何改变hello。打印data会发生改变变成Hello。总之String的对象就是无法改变

4.3判断字符串组成(编程思想)

重点,必须掌握

补充字符判断数字的方法

编程思路:
上图中if循环可以使用字符类的方法代替

4.4字符串和字节的相互转换
和char[]相同,使用String类的构造方法,还有部分转换为String类


按照指定编码格式:默认是按照UTF-8格式转换,一个汉字3个字节
,

4.5字符串查找操作


4.6字符串替换操作


易错点:字符串的替代是否修改字符串对象的内容?


4.7字符串拆分操作

拆分IP地址

转义处理

多次拆分

4.8字符串截取处理
几乎所有方法索引区间都是左闭右开【)

截取的字符串一定是新的字符串!!!!!!

4.9其他操作


str.isEmpty()

byte[]和char[]
byte[] 是把 String 按照一个字节一个字节的方式处理, 这种适合在网络传输, 数据存储这样的场景下使用. 更适合针对二进制数据来操作.
char[] 是吧 String 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.
写一个方法让字符串首字母是大写字符

课后练习




本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!
