2 回答

TA貢獻(xiàn)2037條經(jīng)驗(yàn) 獲得超6個(gè)贊
你給出的兩個(gè)字符串對象體現(xiàn)不這兩種定義的區(qū)別,當(dāng)然也是有區(qū)別的。
如果是:String str_1="abc"; String str_2=new String("abc");就明顯了。
---------------------------------------------
先說幾個(gè)概念吧
1.常量池
指的是在編譯期確定,并被保存在已編譯的字節(jié)碼文件中的一些數(shù)據(jù),它包括類、方法、接口等中的常量,也包括字符串常量。
2.==: 比較是否是同一個(gè)對象
3.equals(): 比較的是對象里的內(nèi)容
---------------------------------------------
下面我開始說區(qū)別
第1種:
String a="abc";
String b="abc";
System.out.print(a==b);
結(jié)果:true
原因:編譯時(shí),這兩個(gè)"abc"被認(rèn)為是同一個(gè)對象保存到了常量池中;運(yùn)行時(shí)JVM則認(rèn)為這兩個(gè)變量賦的是同一個(gè)對象,所以返回true。
---------------------
第2種:
String a=new String("abc");
String b=new String("abc");
System.out.print(a==b);
結(jié)果:false
原因:用構(gòu)造器創(chuàng)建的對象,是不會被放入常理池中的,也很明顯這完全是兩個(gè)對象,只是內(nèi)容相同罷了,結(jié)果當(dāng)然為false了。用equals()或者System.out.print(a.intern()==b.intern());就返回true了。
------------------------------
第3種
String a="abc";
String b=new String("abc");
System.out.print(a==b);
結(jié)果:false
原因:同上
---------------------------
第4種
String a="abcdef";
System.out.print(a=="abcdef");
結(jié)果:true
原因:運(yùn)行出現(xiàn)的字符串常量,若是在常量池中出現(xiàn)過,則JVM會認(rèn)為同一個(gè)對象,以節(jié)省內(nèi)存開銷,所以這兩個(gè)字符串會被認(rèn)為是同一個(gè)對象。
-------------------------------------------
第5種
String a="abcdef";
String b="";
String c=a+b;
System.out.print(c=="abcdef");
結(jié)果:false
原因:編譯時(shí),先將"abcedf"放在常量池中,而c的值則是在運(yùn)行時(shí)在堆里創(chuàng)建的。所以為false。
---------------------------------------------------------------------
其它太明顯的區(qū)別不在贅述。

TA貢獻(xiàn)1810條經(jīng)驗(yàn) 獲得超4個(gè)贊
沒什么區(qū)別,用起來是一樣的~只是聲明方式不同就想數(shù)組可以這樣聲明:
var a=[];
也可以這樣聲明:
var a=array();
對象也是:可以直接var a={};也可以var a=Object;
使用起來都是一樣的,但是在內(nèi)錯(cuò)分配上不同,前者更節(jié)省內(nèi)存
添加回答
舉報(bào)