【Java学习】String类变量

面向对象系列七

一、String类似复刻变量

1.似复刻变量

1.1结构

1.2常量池检查

1.3构造方法

1.4""形式

1.5引用

2、字符数组

2.1不可变性

2.2常创性

二、String类变量里的方法

1.获取

1.1引用获取:

1.2字符获取:

1.3数组获取

1.3.1数组长度:

1.3.2数组是否空:

2.比较

2.1相等比较:

2.2大小比较

2.2.1大小正常比较:

2.2.2大小忽略大小写比较:

2.3包含比较:

3.查找(重载字符对象、位置)

3.1indexOf【前 -> 后】

3.1.1从头往后查字符:

3.1.2从指定位置往后查字符:

3.1.3从头往后查字符串:

3.1.4从指定位置往后查字符串:

3.2lastIndexOf【前 <- 后】

3.2.1从末往前查字符:

3.2.2从指定位置往前查字符:

3.2.3从末往前查字符串:

3.2.4从指定位置往前查字符串:

4.转化

4.1类型数据转化

4.1.1类型数据转字符串(重载数据类型):

4.1.2字符串转类型数据:

4.2字符数组转化

4.2.1字符数组转字符串:

4.2.2字符串转字符数组:

4.3字母大小写转化

4.3.1小写字母转大写:

4.3.2大写字母转小写:

5.替换(重载字符对象)

5.1replace【所有】

5.1.1所有字符替换:

5.1.2所有字符串替换:

5.2replaceAll【所有、正则】

5.2.1所有字符正则支持替换:

5.2.2所有字符串正则支持替换:

5.3replaceFirst【首个】

5.3.1首个字符替换:

5.3.2首个字符串替换:

6.拆分(重载组数)

6.1全部拆分:

6.2组数拆分:

7.截取(重载位置)

7.1截取至尾部分:

7.2截取范围部分:

8.去空:

三、StringBuilder类似复刻变量

1.String、StringBuilder区别:

2.String通过StringBuilder似复刻变量修改创建

3.StringBuilder、StringBuffer区别:

四、StringBuilder类变量里的方法

9.修改

9.1单个下标字符修改:

9.2区间下标字符串修改:

10.插入(重载数据类型)

10.1尾插:

10.2指定位置前插入:

11.删除

11.1单个下标字符删除:

11.2区间下标字符串删除:

12.反转:


一、String类似复刻变量

1.似复刻变量

1.1结构

用class类类型创Arrays数组类变量,用class类类型创String字符串类变量,用String类变量创关于它的一个似复刻变量,每个String类变量创的似复刻变量里创的存储的复制变量都是一个字符数组引用变量与一个存哈希值的整型变量,它们里面的值会在创建时再构造上有,每创一个字符串类变量的似复刻变量都会有相关的似复刻变量空间与常量池的字符数组空间一起两个空间


1.2常量池检查

构造赋字符数组引用时,会将传来的字符成串内容先在堆区的字符串常量池中检查,如果检查到里面已创有存好有了该字符成串内容的字符数组,字符串常量池中是不会重复创建内容相同的字符数组的,于是构造时在字符数组引用那边就填上为此相同的已存在的字符数组的引用,如果检查到字符串常量池中并未创建有此存放内容相同的字符数组就在字符串常量池中创建该内容的字符数组并将其引用构造给似复刻变量的那个会指向数组的引用


1.3构造方法

创建似复刻变量构造时都是需要传入字符成串即在常量池字符数组的内容来构造的,重载有的构造方法有new传字符成串new传字符数组字符成串字面量直接赋值字面量构造时不仅会在常量池中检查字符数组重复,也会对堆区的已创的似复刻变量进行检查重复,如果也已有以字面量构造来的且字符数组内容相同的似复刻变量,便也不重复创似复刻变量了,创建似复刻变量的构造直接返回已存在的那个相同的似复刻变量的引用


1.4""形式

包括所有的"",每个字符串也都是一个String类变量创的似复刻变量


1.5引用

似复刻变量空间很大,小小的固定大小的引用变量就能很好地对它操作管理,引用都是这样的,对类变量的引用、对数组的引用,都能很好地统一格式地管理那些空间大且不固定的变量的内容


2、字符数组

2.1不可变性

final

创的似复刻变量里的字符数组引用是被final修饰的,说明创好的每个似复刻变量里的字符数组引用变量里的值是不可修改的,字符数组引用变量里的值结果指向的在空间的哪个位置是固定的不能修改的,但指向的字符数组变量是可修改的因为并没有被final修饰

private

但因为似复刻变量里它的字符数组引用被private修饰我们又一定是在String类外创的使用的,是无法直接拿到用到它自己里面存有的字符数组引用的,只能通过访问它里面的有关它字符数组引用的接口来间接访问到,String类变量里有关字符数组引用接口的方法都没有去解引用去修改字符数组内容的操作,所有创的似复刻变量只能操作有关它的接口,接口里没有修改其字符数组引用的指向(且不能)、没有修改引用指向的字符数组内容的操作的,所以无法实现对它的字符数组引用所有有关的修改(取都无法直接取到)

  • 所以似复刻变量创出来后指向对应常量池的字符数组是固定上不可变性的

2.2常创性

因为字符数组内容是不可修改的不可对它原地修改实现效果的,都是再创新的字符数组在新的字符数组上对着实现对应效果操作的,所有的往字符串转化修改都是创对应转化效果内容的新的字符数组来实现的真的很会创空间,但常量池的不可重复存储性又弥补上了空间利用率


二、String类变量里的方法

创的似复刻变量里当然也有此String类变量里所有方法的访问路径信息,String类变量里提供了许多处理似复刻变量里面指向的有关字符数组字符串信息的非静态方法(也有静态方法)

1.获取

print(打印内容),都是将打印内容调用传入所在类必有的父类Object里的toString方法,打印内容都会向上转型不管它所在类是否有重写toString方法,最后都会创返回String类变量的似复刻变量给print,print接收String类的似复刻变量就可打印出里面字符数组引用所指的在常量池字符数组的内容

  • print的打印方法打印操作参数对象就是String、StringBuilder、StringBuffer类的似复刻变量
  • toString方法都是返回包含有所要字符数组信息字符串信息的String类的似复刻变量

1.1引用获取

str.toString()

— return String

String类变量里重写的toString方法就是返回它似复刻变量对象自己,即获取此String类似复刻变量自己引用


1.2字符获取

str.charAt(索引)

— return char

 获取此String类似复刻变量里指向的字符数组对应索引的字符


1.3数组获取

1.3.1数组长度

str.length();

— return int

获取此String类似复刻变量里指向的字符数组的长度即字符个数

1.3.2数组是否空

str.isEmpty();

— return boolean

判断此String类似复刻变量里指向的字符数组的长度即字符个数是否为0(以""创建的似复刻变量)


2.比较

2.1相等比较

str1.equals(str2);

— return boolean

判断两String类似复刻变量指向的字符数组里的内容是否相等


2.2大小比较

2.2.1大小正常比较

str1.compareTo(str2);

— return int

比较两String类似复刻变量指向的字符数组的内容的大小

因为String类变量连接有Comparable<String>大小比较规则接口,String类变量里有重写实现接口里的比较规则方法,重写实现有比较规则方法compareTo,String类似复刻变量可调用借此比较规则方法来实现两String类里字符数组内容大小的判断

比较规则:方法里字符串大小的比较规则是优先以对应字符大小比较出来,对应上的全相等的话再以字符串长度大小比较,会返回它们的差值

2.2.2大小忽略大小写比较

str1.compareToIgnoreCase(str2);

— return int


2.3包含比较

str1.contains(str2);

— return boolean

比较此String类似复刻变量指向的字符串是否包含指定子串 


3.查找(重载字符对象、位置)

其实只有两个方法:indexOf 与 lastIndexOf,所有的都是它们的重载

  • 重载:indexOf、lastIndxtOf(字符还是字符串、从哪开始)

3.1indexOf【前 -> 后】

3.1.1从头往后查字符:

str.indexOf(ch);

— return int

从字符数组索引0从头开始往后找指定字符返回其下标

3.1.2从指定位置往后查字符:

str.indexOf(ch,索引);

— return int

从字符数组指定索引开始往后找指定字符返回其下标

3.1.3从头往后查字符串:

str1.indexOf(str2,索引);

— return int

从字符数组索引0开始往后找指定子串并返回子串它首字符下标

3.1.4从指定位置往后查字符串:

str1.indexOf(str2,索引);

— return int

从字符数组指定索引开始往后找指定子串并返回子串它首字符下标


3.2lastIndexOf【前 <- 后】

3.2.1从末往前查字符:

str.lastIndexOf(ch);

— return int

从字符数组最后尾索引开始往前找指定字符返回其下标

3.2.2从指定位置往前查字符:

str.lastIndexOf(ch,索引);

— return int

从字符数组指定索引开始往前找指定字符并返回其下标

3.2.3从末往前查字符串:

str1.lastIndexOf(str2);

— return int

从字符数组尾索引开始往前找指定子串并返回子串它首字符下标

3.2.4从指定位置往前查字符串:

str1.lastIndexOf(str2,索引);

— return int

从字符数组指定索引开始往前找指定子串并返回子串它首字符下标


4.转化

4.1类型数据转化

4.1.1类型数据转字符串(重载数据类型):

String.valueOf(类型数据);

— return String

将类型数据转化成对应字符串格式

  • 重载:valueOf(什么类型数据)

valueOf静态方法的重载,可将所有类型的数据转化成对应字符串格式,如果是引用类型数据,则里面调用Object的toString方法会将它转成字符串(如果此引用所在的类变量未重写父类toString转成其地址信息字符串,所在类变量里重写了就转成重写方法里它引用指向数据的字符串化)

4.1.2字符串转类型数据:

包装类变量.parseInt("类型数据");

— return 类型数据

将此数据类型内容的字符串转化成对应类型的数据

每种数据类型的包装类变量中的parseInt方法(静态)能将此数据类型内容的字符串转化成对应类型的数据


4.2字符数组转化

4.2.1字符数组转字符串:

new String(charray);

— return String

将此字符数组变量内容转化生成String类似复刻变量字符串内容

创似复刻变量对象时String类变量里的传字符数组构造方法就将此字符数组变量内容转化再生成了一份String类似复刻变量字符串内容

4.2.2字符串转字符数组:

str.toCharArray();

— return char[]

将String类似复刻变量所指的字符数组创建拷贝一份出来在堆上

String类似复刻变量调用String类变量里的toCharArray非静态方法,将String类似复刻变量所指的字符数组拷贝创建一份出来在堆上就不在常量池的可对它正常修改的相同内容的字符数组并返回其引用


4.3字母大小写转化

4.3.1小写字母转大写:

str.toUpperCase();

 —> return String

将String类似复刻变量里指向的字符数组里的小写字母字符转化成大写字母字符

4.3.2大写字母转小写:

str.toLowerCase();
—> return String

将String类似复刻变量里指向的字符数组里的大写字母字符转化成小写字母字符


5.替换(重载字符对象)

  • 重载:replace、replaceAll、replaceFirst(字符还是字符串)

将对象里面指向的字符数组内容指定字符替字符、指定字符串替字符串替换内容类型必须一致(char -> char,String -> String)

5.1replace【所有】

5.1.1所有字符替换:

str.replace(ch1,ch2);

—> return String

将所有对应字符替换

5.1.2所有字符串替换:

str.replace(str1,str2);

—> return String

将所有对应部分字符串替换


5.2replaceAll【所有、正则】

5.2.1所有字符正则支持替换:

str.replaceAll(ch1,ch2);

—> return String

支持正则表达式地将所有对应字符替换

5.2.2所有字符串正则支持替换:

str.replaceAll(str1,str2);

—> return String

支持正则表达式地将所有对应部分字符串替换


5.3replaceFirst【首个】

5.3.1首个字符替换:

str.replaceFirst(ch1,ch2);

—> return String

将首个对应字符替换

5.3.2首个字符串替换:

str.replaceFirst(str1,str2);

—> return String

将首个对应部分字符串替换


6.拆分(重载组数)

  • 重载:split(拆分成多少组)

将对象字符串以指定字符串(没有指定字符的)左右分块拆分,在常量池中创建分割出来的一块块字符串和相对应的String类似复刻变量的,同时还会创建引用数组来存放拆分出来的似复刻变量引用并返回此数组引用,在字符串中,有 \ 与 | 指定拆分操作的符号:

  • \ 转义操作符将\与它后面的字符一块转义成一个新意义字符\\将转义操作符转义成普通的\符号,\\整体就成为了一个普通的\符号,一些字符 | * + \ 如果要以它们去分割字符串,需要在它们前面加上\符号指定出来
  • | 连字符,表示以多个字符串来拆分

6.1全部拆分:

str1.split(str2);

—> return String[]

将对象里的字符串以指定字符串全部左右分块拆分

6.2组数拆分:

str1.split(str2,组数);

—> return String[]

将对象里的字符串以指定字符串左右分块拆分为为最多指定组数


7.截取(重载位置)

  • 重载:substring(截取位置部分)

7.1截取至尾部分:

str.substring(索引);

—> return String

截取字符数组索引处至末的字符串出来

7.2截取范围部分:

str.substring(索引,索引);

—> return String

截取字符数组首索引至尾索引的字符串出来 


8.去空:

str.trim();

—> return String

去掉字符串块前后的空白内容

三、StringBuilder类似复刻变量

1.String、StringBuilder区别:

Sring、StringBuilder、StringBuffer三者都是用来管理字符数组字符串内容的类变量StringBuilder、StringBuffer类变量创建似复刻变量它对应管理的字符数组对象就是创建在似复刻变量本身里面的,而String类变量创建的似复刻变量对应管理的字符数组对象在常量池中的不在似复刻变量里面(似复刻变量创建指向字符数组的引用来对其管理),字符数组在似复刻变量里面在堆上是可修改的(常量池中不可修改),StringBuilder、StringBuffer类变量创建管理下的字符数组字符串内容是可修改的


2.String通过StringBuilder似复刻变量修改创建

String类似复刻变量指向的字符串新创建实现修改时,每一次的修改都有创建StringBuilder类(StringBuffer类一样)的似复刻变量来完成的,将这次要修改的字符串内容转化移在StringBuilder似复刻变量(String->StringBuilder)里可变的动态字符数组里完成可以进行的修改,似复刻变量里的字符数组的内容修改成指定内容后,再通过StringBuilder似复刻变量的toString将里面字符数组的内容再转化创建回此修改结果内容的字符串对象(StringBuilder->String)即此内容的String类似复刻变量与对应的常量池字符数组

字符串每一次的修改就会创建3个新的对象如果要频繁修改要创建许多修改内容的字符串时,我们不要在以String字符串出发去改因为它出发下改每次都会去创建一个新的StringBuilder对象,我们以StringBuilder出发,在它可变的字符数组里修改着完成每一个需要的字符数组内容,每次修改好一次字符数组内容后toString出此String类字符串,然后再继续在此字符数组里面再去修改着成要的字符数组内容再toString,这样整个过程只需只用一个StringBuilder对象创建即可完成就不用每次创建着StringBuilder对象然后再销毁再去创建了


3.StringBuilder、StringBuffer区别:

StringBuffer类变量里的方法都使用synchronized修饰的,每一次线程进来时都会有加锁与释放锁的操作,能有序安全地完成多线程下的操作如果是单线程,就没有必要去加锁与释放锁了,使用StringBuilder无锁操作的性能更优(其它的全部一样)


四、StringBuilder类变量里的方法

9.修改

将对象里面指向的字符数组内容指定单个下标字符修改字符、指定区间下标字符串修改字符串,修改内容类型和替换一样,也是必须一致的(char -> char,String -> String)

9.1单个下标字符修改

stb.setCharAt(索引,ch);

—> return void

将此StringBuilder类似复刻变量里的字符数组指定下标字符修改为指定字符,无返回值

9.2区间下标字符串修改

stb.replace(索引,索引,str);

—> return StringBuilder

将此StringBuilder类似复刻变量里的字符数组指定下标区间字符串修改为指定字符串,并返回当前此对象似复刻变量引用


10.插入(重载数据类型)

  • 重载:append、insert(什么类型数据)

10.1尾插

stb.append(类型数据);

— return StringBuilder

将类型数据以字符串形式尾插到此似复刻变量里字符数组后面成内容

10.2指定位置前插入

stb.insert(索引,类型数据);

— return StringBuilder

将类型数据以字符串形式在此似复刻变量里字符数组指定索引位置之前插入


11.删除

11.1单个下标字符删除

stb.deleteCharAt(索引);

— return StringBuilder

将此似复刻变量里的字符数组指定索引位置的一个字符删除

11.2区间下标字符串删除

stb.delete(索引,索引);

— return StringBuilder

将此似复刻变量里的字符数组指定下标区间的字符串删除


12.反转

stb.reverse();

— return StringBuilder

将此似复刻变量里的字符数组内容反转