equals()方法的問題
之前做過比較兩個(gè)String類型的值時(shí)
比如:
String str1="你好";
String str2="你"+"好";
String str3="你";
String str4="好";
String str5=str3+str4;
System.out.println(str1.equals(str2));
System.out.println(str1.equals(str5));
為什么這兩個(gè)句子返回的都是true啊,不是說好的比較地址的嗎?有疑惑啊
2015-10-22
子木李 說得對(duì),樓主還可以嘗試去建立一個(gè)類的兩個(gè)實(shí)例,內(nèi)部變量完全一樣,但是你用equals去比較時(shí),返回的是false,這就會(huì)驗(yàn)證你理解中的兩個(gè)對(duì)象使用 equals 是進(jìn)行地址比較;但是你會(huì)發(fā)現(xiàn)兩個(gè)String,哪怕是通過new String()得到的(理論上是兩個(gè)對(duì)象),你會(huì)發(fā)現(xiàn)執(zhí)行 equals 操作會(huì)獲得 true, 這是因?yàn)閖ava字符池機(jī)制的作用,關(guān)于這個(gè)可以推薦樓主看下 “JAVA 字符池”,這個(gè)應(yīng)該可以幫到樓主;
另外補(bǔ)充一些我知道的相關(guān)的一知半解:String對(duì)象是不可改變的,比如說String str1 = new String("hello"); 然后你讓 str1 = "java"; 你會(huì)發(fā)現(xiàn)str1只是改變了自身引用,對(duì)其之前的內(nèi)容 “hello” 串并不會(huì)有改變;
2015-10-22
string類型的equals方法的規(guī)則是這樣的:如果兩個(gè)對(duì)象的類型一致,并且內(nèi)容一致,則返回true,樓主理解的比較地址也是正確的,不過java的String類的機(jī)制是:對(duì)于String實(shí)例,運(yùn)行時(shí)狀態(tài)會(huì)盡可能地確保任意兩個(gè)具有相同字符信息的String字面值指向同一個(gè)內(nèi)部對(duì)象,即是如果字面值一樣,那么它們其實(shí)是同一個(gè)地址,所以,返回的是true,str1、str2、str5都是“你好”