String和StringBuilder
String
String概述
String 类在 java.lang 包下,所以使用的时候不需要导包
String 类代表字符串,Java 程序中的所有字符串文字(例如“abc”)都被实现为此类的实例
也就是说,Java 程序中所有的双引号字符串,都是 String 类的对象
字符串不可变,它们的值在创建后不能被更改
String的构造方法
1、以“ ”方式给出的字符串,只要字符序列相同(顺序和大小写),无论在程序代码中出现几次,JVM 都只会建立一个 String 对象,并在字符串常量池中维护
2、 字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在
不存在:创建
存在:不会重新创建,而是直接复用
3、通过 new 创建的字符串对象,每一次 new 都会申请一个内存空间,虽然内容相同,但是地址值不同
关于String创建对象的面试题
1、下面代码的输出结果是?
String s = "abc";
String s2 = "abc";
String s3 = new String("abc");
sout(s==s2);//true
sout(s==s3);//false
sout(s2==s3);//false
2、下面代码的输出结果是?
public class Test3 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1 == s3);//false
}
}
3、常量优化机制
public class Test4 {
public static void main(String[] args) {
String s1 = "abc";
String s2 = "a" + "b" + "c";
System.out.println(s1 == s2);//true
}
}
String的特点
-
Java 程序中所有的双引号字符串,都是 String 类的对象
(String a=“Hello”) -
字符串不可变,它们的值在创建后不能被更改
String的比较
使用 == 做比较
⚫ 基本类型:比较的是数据值是否相同
⚫ 引用类型:比较的是地址值是否相同
字符串是对象,它比较内容是否相同,是通过一个方法来实现的,这个方法叫:equals()
⚫ public boolean equals(Object anObject):将此字符串与指定对象进行比较。由于我们比较的是字符串对象,所以参数直接传递一个字符串
String常用的方法
比较字符串的内容,严格区分大小写
public boolean equals(Object anObject)
比较字符串的内容,忽略大小写
public boolean equalsIgnoreCase(String anotherString)
返回此字符串的长度
public int length()
返回指定索引处的 char 值
public char charAt(int index)
将字符串拆分为字符数组后返回
public char[] toCharArray()
根据开始和结束索引进行截取,得到新的字符串(包含头,不包含尾)
public String substring(int beginIndex, int endIndex)
从传入的索引处截取,截取到末尾,得到新的字符串
public String substring(int beginIndex)
使用新值,将字符串中的旧值替换,得到新的字符串
public String replace(CharSequence target, CharSequence replacement)
根据传入的规则切割字符串,得到字符串数组
注意,. * + | 要是以这些分割,需要加上\\转义,要是有多个分割符,可以用|来连接
public String[] split(String regex)
StringBuilder
提高字符串的操作效率
StringBuilder的构造方法
StringBuilder sb = new StringBuilder();
StringBuilder sb2 = new StringBuilder("abc");
StringBuilder的成员方法
StringBuilder append(Object obj) //向缓冲区添加内容
StringBuilder reverse() // 将缓冲区内容进行反转
toString() //把StringBuilder转换成String
length() //返回值StringBuilder的长度
StringBuilder和String的转化
StringBuilder如何转换为String //调用toString()方法即可返回一个字符串
String如何转换为StringBuilder // 通过StringBuilder的有参构造方法将字符串传入
为什么说StringBuilder可以提高字符串的操作(+)效率
public class Test {
public static void main(String[] agrs){
String S1 = "a";
String S2 = s1 + "b";
String S3 = s2 + "c";
System.out.println(s3)//abc
}
}
执行过程:
-
字节码文件Test.class进入方法区
-
mian()方法被Java虚拟机自动调用执行进入栈内存
-
执行第一行代码:这里使用双引号创建字符串对象,会先检查常量池里面用没有,没有的话会创建,再把 “a” 的地址赋给s1;
-
执行第二行代码:又有一个常量,去检查常量池中有没有,没有,创建;使用 “+” 号拼接,系统底层会自动的创建一个StringBuilder对象,再调用tringBuilder对象的append()方法完成拼接,因为StringBuilder与String的类型不匹配,没法直接进行复制,所以系统会调用StringBuilder对的tostring() 方法将其转换为一个String对象,最后才会将地址002赋值给s2;
-
执行第三行代码:又有一个常量 ,又是 “+” 拼接 ,执行流程同执行上一行的一样,就不重复一次了,最后得到s3的地址004
-
执行最后一行代码,打印结果:abc
意思就是说使用字符串的拼接+时,每次都会通过StringBuilder的append()方法完成的,完成拼接之后,StringBuilder类型还要通过toString()方法转为字符串,这就是为什么用StringBuilder可以提高字符串+的原因