String字符串的特点:
1. Java程序中所有的双引号字符串,都是String类的对象
2. 字符串不可变,他们的值在创建后不能够被更改
3. 虽然String的值是不可变的,但是他们可以被共享
注意: 这里所说的共享指的是字符串常量池.
字符串常量池:当使用双引号创建字符串对象的时候,系统会检查该字符串是否在字符串常量池中存在
存在 : 不会创建,而是直接复用
不存在:创建
String常见面试题:
问题1: 下面代码的运行结果是?
public static void main(String[] args) {
String s1 = "abc";
String s2 = "abc";
System.out.println(s1 == s2);
}
结果为:true
原因:s1对象通过双引号创建的字符串存储到字符串常量池中,当代码运行到s2时,系统首先会在字符串常量池中进行查找,如果有,则不创建新的字符串. s1和s2指向的内存地址值相同,结果为true
问题2: 下列代码的运行结果是?
public static void main(String[] args) {
String s1 = "abc";
String s2 = new String("abc");
System.out.println(s1 == s2);
}
结果: false
原因: s2 是new出来的对象,进入堆内存创建新的内存地址
注意: 这句代码实际上是创建了两个对象("abc"和new出来的对象). 这种通过有参构造方法创建字符串对象的方法不建议使用,会浪费内存
问题3: 下列代码运行结果是?
public static void main(String[] args) {
String s1 = "abc";
String s2 = "ab";
String s3 = s2 + "c";
System.out.println(s1 == s3);
}
结果: false
原因: 在字符串之间使用 + 号拼接的时候,系统底层会自动创建一个StringBuilder对象,然后再调用起append()方法完成拼接,拼接之后再调用toString()方法转换为String类型.
内存结构如下图所示:
问题4:下列代码运行结果是?
public static void main(String[] args) {
String s1 = "abc";
String s2 = "a"+"b"+"c";
System.out.println(s1 == s2);
}
结果为: true
原因: 特别注意,这里千万不能认为出现了+号拼接,系统底层帮我们干了很多事情
仔细看!!!!(重点): 这三个是带双引号的字符串常量进行拼接
Java中存在常量优化机制,在编译的时候就会将"a"+"b"+"c"拼接为"abc" 因此该结果为true