4.1 Java之String类

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/lwz45698752/article/details/82797931


回顾

集合:创建的多个对象存放地方,统一管理,看作容器

  • I/O:程序与硬盘或网络资源交互,关注四个基本的抽象类以及具体的不同实现
  • 不同流处理IO特点不同
  • 数据流:只读基本数据类型和字符串
  • 节点流(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方法取左闭右开

猜你喜欢

转载自blog.csdn.net/lwz45698752/article/details/82797931
今日推荐