package string;
/*
* String()方法重写
* */
public class String1 {
public static void main(String[] args) {
String str = "itcast";
// String类重写了toString方法,在String类中ctrl+f可查看重写的方法
System.out.println(str);
// 常量池中又出现一个body的char类型的数组,str的地址改变了,现在指向常量池中的body所在地址
// 但是在输出str时候,输出的还是字符串,因为String类重写了toString方法
str = "body";
System.out.println(str);
// 结果为false,因为变量a,变量b存的都是指向常量池中不同字符串所在的地址,存的是地址,虽然打印的时候是字符窜,那是因为被toString了;
String a = "d";
String b = "c";
if (a == b) {
System.out.println(true);
} else {
System.out.println(false);
}
// 返回值为true,因为在方法区中先创造了一个字符串,地址假如为0x01,将地址赋予了引用变量a1;
// 现在引用变量b1,在创建字符串"c"之前,会现在常量池中看看是否存在字符串"c",发现存在,那么就让b1指向原来a1所指向的地址;也就是说现在b1,a1都指向常池中存放"c"的地址
String a1 = "c";
String b1 = "c";
if (a1 == b1) {
System.out.println(true);
} else {
System.out.println(false);
}
// 以下是个人理解,还得请问大神,来看看是不是这样的!
// 返回值为false,因为str1是常量池中字符串"ac"所在地址,地址为0x11;
// 而str2是堆中所在地址,0x22;堆中的"ac",是从常量池是中复制过来的,相当于在常量池中创建以一个对象"ac",地址为0x33,
// 然后复制到堆中,地址为0x22;所以堆中也有了新对象"";
String str1 = "ac"; // 只在常量池创建了一个对象
String str2 = new String("ac"); // 创建了两个对象,一个在常量池中,一个在堆中,并且地址不一样;
if (str1 == str2) {
System.out.println(true);
} else {
System.out.println(false);
}
}
}
|
|