日期:2014-05-20 浏览次数:20762 次
String str1 = new String("abc");//新构造一个String对象,将"abc"放到里面 String str2 = new String("abc");//再新构造一个String对象,将"abc"放到里面 String str3 = "bcd";//jvm在堆中新建一个String对象,值为"bcd",str3与str4都是他的引用。 String str4 = "bcd"; if (str1 == str2) {//比较的的两个String对象是不是相同,由于两个对象都是new出来的,那肯定不一样, //只是里面放的东西是一样的,就像你的保险箱和我的保险箱都放一模一样的宝石, //但你的保险箱跟我的保险箱他不是同一个 System.out.println("str1==str2");//输出此 } else { System.out.println("str1!=str2"); } if (str3 == str4) { System.out.println("str3==str4");//输出此 } else { System.out.println("str3!=str4"); } str1 = "bcd"; System.out.println("after str1 = \"bcd\""); if (str1 == str3) {//str1转为对 "bcd"的引用,与str3一样,也与str4一样;str1 == str3 == str4 System.out.println("str1==str3");//输出此 } else { System.out.println("str1!=str3"); }
------解决方案--------------------
用new创建的字符串,在用"=="比较时,由于比较的是内存地址,所以肯定是不一样的,而直接用""创建的字符串,如果用"=="比较,只要内容一样,返回结果也是一样的
------解决方案--------------------
3楼正解
------解决方案--------------------
马士兵的J2SE有说到这个问题,他说这是因为在内存中分为不同的区,局部变量存放在栈区,new出来的对象存放在堆区,静态变量和字符串常量存放在数据区,还有编译后的程序是存放在代码区。
好,有了这些知识就可以开始解释了
public class PrintFiles { public static void main(String[] args) { String str1 = new String("abc");//new出来一个String对象,存放在堆区,由str1指向它 /* * 又new出来一个String对象,存放在堆区,由str2指向它, * 注意,该对象与str1指向的不是同一个对象, * 只不过两个对象装的东西是一样的 */ String str2 = new String("abc"); /* * "bcd"是字符串常量,存放在数据区,在内存中只有一份, * str3跟str4两个都指向它 */ String str3 = "bcd"; String str4 = "bcd"; if (str1 == str2)//str1跟str2指向不同的对象,因此地址也不一样 { System.out.println("str1==str2"); } else { System.out.println("str1!=str2"); } if (str3 == str4)//str3跟str4指向相同的对象,因此地址也一样 { System.out.println("str3==str4"); } else { System.out.println("str3!=str4"); } str1 = "bcd";//让str1指向数据区的字符串常量"bcd" System.out.println("after str1 = \"bcd\""); if (str1 == str3)//现在str1跟str3指向相同的对象了,因此地址也一样 { System.out.println("str1==str3"); } else { System.out.println("str1!=str3"); } }