一.String类
1.String类的特点
Java程序中所有的双引号字符串都是String类型的对象。字符串的内容是不可以改变的,它们的值在创建之后不能被改变。虽然String是不可变的,但是多个对象可以共享同一个字符串对象的地址值,而不是需要重新在字符串常量池中创建新的对象。
注意:所有字符串常量都会放在字符串常量池中(Java 7版本本身与之前字符串常量池在方法区中,Java 8之后则在堆空间中)。
2.字符串常量池的说明
使用字符串字面量直接赋值创建对象时,系统会检测该字符串在字符串常量池中是否存在,若存在,则直接复用常量池中的地址,若不存在,则会在常量池中重新创建一个地址并赋值。
3.字符串创建对象的区别
1.通过构造方法创建:通过new创建的字符串对象,每一次new都会在堆空间申请一个内存空间,虽然内容相同,但是地址不同。
2.直接赋值方式创建:以""方式给出的字符串,只要字符串序列相同(顺序和大小写),无论在程序代码中出现几次,JVM都只会建立一个String对象,并在字符串常量池中维护。
4.String类的常用方法
1.字符串对象.equals(); 传入一个字符串对象,判断调用者字符串对象与参数字符串对象的内容是否相同,区分大小写,返回boolean类型。
2.字符串对象.equalsIgnoreCase(); 传入一个字符串对象,判断调用者字符串对象与参数字符串对象的内容是否相同,不区分大小写,返回boolean类型。
3.字符串对象.toString(); 打印字符串对象时,自动调用toString方法,返回对象本身,所以打印出来的不是对象的地址,而是对象的值。
4.字符串对象.charAt(索引); 获取字符串对应索引位置的值。
5.字符串对象.length(); 获取字符串的长度。
6.字符串对象.toCharArray(); 将字符串转换为字符数组。
7.字符串对象.replace(); 传入两个字符序列,分别表示要被替换的序列,与要用于替换的序列。返回一个新的字符串。
8.字符串对象.split(); 切割字符串,传入一个字符串作为规则(如","或者空格等等)对目标字符串进行切割,最终返回一个字符串数组。
9.字符串对象.subString(); 传入一个开始索引和一个结束索引,得到新的字符串。[first,end)。若只传入一个开始的索引,则表示从开始索引位置到最后一个值全部获取为一个新的字符串。
toUpperCase toLowerCase 将字符串转换为大写或者小写
扩展方法:Integer.parseInt(); 传入一个字符串对象,转换为int类型数据。
二.StringBuilder类
1.StringBuilder中的常用方法
1.append() 可以将各种类型数据拼接到StringBuilder容器中。
2.charAt() 可以返回指定索引位置的字符。
3.deletecharAt() 可以删除指定索引位置的字符。
4.length() 获取字符串长度。
5.replace() 用指定String中的字符串去替换此序列子字符串中的String。参数列表(int start,int end,String str)
6.reverse() 用于字符串的反转。
7.subString() 获取指定first到end索引位置的字符串内容。
参数列表(int first,int end) 左闭右开区间
8.toString() 用于返回字符串。
2.字符串进行拼接时的注意点
字符串str1通过""直接赋值的方式创建字符串对象,则系统会在字符串常量池中创建一个对象并将地址值返回给srt1,str2创建时,系统会根据""中的字符串值与常量池中的对象比对,若存在相同的值则直接复用该对象的地址值,若没有则重新创建一个字符串对象在字符串常量池中。
str3通过构造方法(new)创建字符串时,系统会在堆空间中创建一个对象,将字符串值赋值在这个对象中并将地址值返回给str3。
str4实现的是字符串变量与字符串常量的拼接,JVM会自动在堆空间中创建一个StringBuilder对象和一个字符串对象,通过append()方法对字符串进行拼接,再通过toString()方法将拼接后的StringBuider对象转换为字符串对象传入新的字符串对象中,最后将字符串对象的地址值返回给str4。
str5实现的是字符串常量的拼接,这时候就不会像str4一样在堆空间中创建StringBuilder对象来进行拼接了,它会在编译时期间就完成字符串的拼接(常量优化机制),然后系统会检测字符串常量池中是否有相同的对象。
3.字符串的常量优化机制
Java中的字符串常量优化机制是指在编译阶段对字符串常量进行优化,以提高性能和减少内存消耗。这种优化机制主要包括以下两个方面:
1. 字符串常量池:Java中的字符串常量池是一个存储字符串常量的特殊区域,它位于堆内存中。当编译器在编译Java程序时遇到字符串字面值(如"Hello"),它会先检查字符串常量池中是否已经存在相同内容的字符串。如果存在,则直接引用已有的字符串对象,而不会创建新的对象;如果不存在,则在字符串常量池中创建一个新的字符串对象。这样可以避免在运行时重复创建相同内容的字符串对象,节省内存空间。
2. 字符串连接优化:在Java中,使用加号(+)连接字符串时,编译器会对相邻的字符串常量进行优化,将它们合并为一个字符串常量。例如,编译器会将"Hello" + "World"优化为"HelloWorld"。这种优化可以减少在运行时进行字符串连接操作的次数,提高程序的执行效率。
通过字符串常量池和字符串连接优化机制,Java可以在编译阶段对字符串常量进行优化,减少内存消耗和提高程序性能。