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[]
      • 写一个方法让字符串首字母是大写字符
      • 课后练习

一、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字符串不可变性

在这里插入图片描述
在这里插入图片描述
为何字符串的对象无法修改内容而其他类的对象能修改内容?

  1. 方便实现字符串对象池. 如果 String 可变, 那么对象池就需要考虑何时深拷贝字符串的问题了.
  2. 不可变对象是线程安全的.
  3. 不可变对象更方便缓存 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 按照一个字符一个字符的方式处理, 更适合针对文本数据来操作, 尤其是包含中文的时候.

写一个方法让字符串首字母是大写字符

在这里插入图片描述

课后练习

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述


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

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部