文章目录
回顾
- 集合:存放对象的容器
- I/O:程序与硬盘或网络资源交互,关注四个基本的抽象类以及具体的实现
- 数据流:只处理基本数据类型和字符串+字符数组
- 节点流(4个):处理文本和非文本文件
字符串概述
- 字符串常量池存放字符串实体, 若常量池中没有对应字符串,则创建一个
- 字符串底层用字符数组实现
- 堆空间引用变量指向常量池实体
- equals比较内容,所以相等
- 字符串底层用字符数组存储,数组长度不可变,其是不可变的字符序列,所以在原字符串后添加内容,要重新创建字符串,所以str4等价于str8
- intern表示字符串拼接在一起
- String original指的是字符串常量池中存放的字符串
- value为char型数组,引用类型变量
- 传入对象的value属性赋值给当前对象的value属性,值传递(地址)
字符串构造器解析
- 单行代码两步走:1.字符串常量池创建字符串对象2.地址值赋值,则堆空间内对象实体的属性值value指向该字符串对象
- JavaEE的value值赋值给当前对象的value值
- 单行代码一共创建了两个对象
- new在堆空间开辟区域,创建new的信息,字符串真正内容不在堆空间中
- new–》堆空间内开辟区域–》开辟区域的对象实体也有地址值
- 总结:字符串有属性value,是个字符串数组,为引用变量类型,赋值操作实质是值传递(传递地址值)
字符串方法
以下所有方法的原字符串均不变
常用方法一
输出结果:
- length对数组是属性,对字符串是方法
- indexOf等价于firstIndexOf(),即第一次出现的索引位置
- 索引从0开始
- compareTo方法返回字符串从0索引处开始比较,直到不同,当前对应字符减去形参对应字符的值
常用方法二
输出结果:
- 关注去除空格的方法,只是字符串前后的空格,不包括字符串内的空格
- 左闭右开的区间提取字符串
- split方法返回字符串数组
String类的compareTo和equals方法
- String实现comparable接口,重写compareTo方法,用于排序
- 方法内部,字符串从0索引开始对比字符,返回值为当前减去形参
- equals方法比较:若同一引用,直接true,否则,为字符串,则强转,再比较字符串长度,不相等,false,反之,从前往后字符匹配
字符串练习
reverse方法
-
字符串分为三部分,前部不变,中部改变,后部不变,中部reverse后,最后连接操作
-
str1 += c语句中c转化为字符串类型,该代码很耗费内存,因为字符串一直重新创建,而不是直接连接(解释见上节内存图)
-
考虑使用StringBuffer(可变数组)优化
-
转化为数组,数组进行reverse,再转化为字符串
-
关注循环条件
trim方法
- 从头,从尾检查是否为空格,从而移动索引
- 关注while循环控制条件,start<end不要忘,防止字符串为全空格,出现下标越界
获取一个字符串在另一个字符串出现次数
- 以这些问题为代表,涉及到数理逻辑问题
- 关注问题的数理逻辑,思考问题方式,业务逻辑需要算法逻辑
- 举例,思考问题过程转化为代码形式
- 从头开始比较,子串字符串A不变,而母串初始为全部字符串B,找第一次出现的索引处,然后待比较的母串B渐渐向后移(缩短)
寻找两串相同的最长子串
- 首先判断谁长谁短,然后进行两串比较,设置长短两类字符串
- 外层循环控制短子串长度,初始为完整长度,然后依次减1
- 内层循环控制子串长度截取方式,全部从前截取,从后截取,或者部分从前部分从后截取
- 关注可能存在同样长度的相同子串,要使用集合存储,不然会遗漏相同子串
- 关注if语句位置,内层找到,则外层退出,不必继续外层循环
字符串排序
- 先转化为字符数组,字符数组有工具类,sort方法(自然排序,按字母表顺序)
字符串与其他数据类型的转换
- 一个中文字符为两个字节,若字符串中含有中文字符,则字节数组读取不了,只能采用字符数组
- 关注四个方法和两个String构造器
StringBuffer/StringBuilder
- 关注三种类的效率和线程安全问题
- StringBuffer是一个容器,底层通过数组实现,数组是容器,同理,其是容器,集合也是容器,关注容器的增删改查
- StringBuffer新增容量属性(不等价于length),默认为16大小,即初始创建容量为16的数组
- 超过容量,自动扩容,后台底层已封装好
- 字符串可扩展,动态可添加
方法
- 调用reverse则其本身也改变
- delete方法取左闭右开