面向对象系列七
2.String通过StringBuilder似复刻变量修改创建
3.StringBuilder、StringBuffer区别:
一、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
将此似复刻变量里的字符数组内容反转