60%的人会错的String常见面试题,你会吗?:
例题1:
以下代码输出的结果是什么?
public class Test03 {
public static void main(String[] args) {
String str = "123";
System.out.println(str);
change(str);
System.out.println(str);
}
public static void change(String str) {
str = "234";
}
}
运行结果:
原因分析:
String 是不可变的,所以经过方法也不会发生改变。
例题2:
以下代码执行后会输出什么?
package com.mage.Test;
public class Test02 {
public static void main(String[] args) {
String s1 = "Cat";
String s2 = "Cat";
String s3 = new String("Cat");
System.out.println("s1 == s2 :"+(s1==s2));
System.out.println("s1 == s3 :"+(s1==s3));
String s4 = s1.intern();
System.out.println("s1 == s4 :"+(s1==s4));
System.out.println("s3 == s4 :"+(s4==s3));
}
}
运行结果图:
原因分析:
String s1 = “Cat”;会直接在String常量池中开辟一个空间存放当前String值,
String s2 = “Cat”; 也是在String常量池中开辟一个空间存放当前String值,但当前常量池中已经存在Cat,所以直接会指向Cat的地址;
String s3 = new String(“Cat”);会先在堆中开辟一个空间存放创建的常量池中Cat的地址;
String s4 = s1.intern();获取到的是当前String对象的地址,
例题3:
下列代码的输出什么
package com.mage.Test;
public class Test03 { public static void main(String[] args) {
String s1 = "Cat";
String s2 = "Dog";
final String s3 = s1+s2;
String s4 = "CatDog";
String s5 = "Cat"+"Dog";
System.out.println(s3==s4);
System.out.println(s4==s5);
}
}
运行结果图:
原因分析:
**+号拼接: **
* 左右两边操作数如果是字面值 则直接拼接之后再常量池开空间
img-oO0RGSXk-1564197962165)]
原因分析:
**+号拼接: **
* 左右两边操作数如果是字面值 则直接拼接之后再常量池开空间
* 如果左右两边操作数是变量 则通过常量值重新分配空间 存储变量地址