首先咱们来看一下下面程序的输出结果是什么?
public class StringQuestion {
public static void m1() {
String a = "a1";
String b = "a" + 1;
System.out.println(a == b);
}
public static void m2() {
String a = "ab";
String bb = "b";
String b = "a" + bb;
System.out.println(a == b);
}
public static void m3() {
String a = "ab";
final String bb = "b";
String b = "a" + bb;
System.out.println(a == b);
}
public static void m4() {
String a = "ab";
final String bb = getBB();
String b = "a" + bb;
System.out.println(a == b);
}
private static String getBB() {
return "b";
}
private static String a = "ab";
public static void m5() {
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == a);
System.out.println(s.intern() == a);
}
private static String aa = new String("ab");
public static void m6() {
String s1 = "a";
String s2 = "b";
String s = s1 + s2;
System.out.println(s == aa);
System.out.println(s.intern() == aa);
System.out.println(s.intern() == aa.intern());
}
public static void main(String[] args) {
m1();
m2();
m3();
m4();
m5();
m6();
}
}
输出结果是:
true
false
true
false
false
true
false
false
true
如果你和正确答案一样并且理解为什么是true或者是false,那么,恭喜你,你已经基本上掌握了java中的jString类,下面内容你就不需要看了!!!!!
解释:
1m1()运行输出true;
原因:a和b在常量池上是同一份字符串常量,a和b同时指向“a1”,
两个指向的内存空间相同
2m2()运行输出false;
原因:字符串变量a指向常量池中的“ab”,而表达式中b=“a”+bb的bb是字符串变量,所以字符串变量b不能存储在字符串常量池中,要在堆中新建一个字符串对象存储“ab”,两个指向的内存空间不同!!!因此输出false
3m3()运行输出true,因为final定义了bb为字符串常量,因此表达式b= “a”+bb是确定的,因此a和b同时指向字符串常量池中的“ab”
4m4()运行输出false,因为getBB()相当于newString(“b”);在堆内存中创建了对象,所以b指向的是堆内存中的对象,而a指向的是字符串常量池中的字符串,所以两个指向的不是同一个“ab”,因此输出false
5m5()第一个输出是false,原因:a是指向字符串常量池中“ab”的变量,而s=s1+ s2,s1和s2是变量,是不确定的,不能再存储在字符串常量池中,而是存储在堆中新建的字符串对象,因此a和s指向的不是同一个字符串
M5()的第二个输出结果是true。原因当String调用intern方法时,如果池中已经包含一个等于此String对象的字符串(用equals(Object)方法确定),则返回池中的字符串。否则,将此String对象添加到池中,并返回此String对象的引用。
两个变量指向的是同一个“ab”!!
6m6()第一个输出是false。aa是在堆中分配的对象字符串“ab”,而s是在堆中新建一个对象存储字符串,所以两个变量指向不同的内存空间
第二个输出是false,s.intern()将字符串添加到常量池中了,而aa还是指向堆空间的引用,因此两个字符串变量指向的是不同的内存空间
第三个输出true,s.intern()和aa.intern()都是将堆中的字符串添加到字符串常量池中,在常量池中维护的是同一份数据,因此两个指向的是同一个字符串常量“ab”,所以输出true