IF,String程式設計趣事==和equals的區別
開始
怎麼搞定!怎麼搞的!這兩個String怎麼可能不等!?當我看了Debug的Variables的兩個String變數的值、明明都是一樣的,為什麼用比較運算子==判定、他們倆竟然不等於呢!?
鬱悶死寶寶了,這不可能,不應該= =,當糾結了好一會之後突然想起以前看到過、判定是否相等分兩種、一個是值、一個是物件、經過在網上查了下,輕鬆解決了問題。。。。程式碼如下
<span style="font-size:24px;"> String password = request.getParameter("password"); String oldPassword = UserManager.getInstance().findUserById(userId).getPassword(); if(!password.equals(oldPassword)){ out.println("密碼錯誤"); }</span></span>
沒錯加了個equals、判定就按照我想的邏輯走了。。。這是問什麼呢?
講解
1 資料型別
基本資料型別,也稱原始資料型別。byte,short,char,int,long,float,double,boolean
而String是複合資料型別(類)、他們在堆疊中的區別如下
2 比較運算子號==和equals的區別
==操作比較的是兩個變數的值是否相等,對於引用型變量表示的是兩個變數在堆中儲存的地址是否相同,即棧中的內容是否相同。 equals操作表示的兩個變數是否是對同一個物件的引用,即堆中的內容是否相同。
程式碼賦值如下
<span style="font-size:24px;"> int intDate = 521; char charDate = 521; char charif = 123; String strif = "123"; String strDate ="2228664347"; String strName ="2228664347";</span></span>
注:這裡66621、77521、88456都是堆中物件的地址
用 == 比較intDate和charDate的值
判定521等於521? 是的!
用 == 比較charif和strif的值
判定123等於66621?不是!
用==比較strDate和strName的值
判定77521等於88456?不是!
用equals比較strDate和strName的值用
判定2228664347等於2228664347?是的!
用 equals比較charif和strif的值
判定123等於123?是的!
equals用法最上面程式碼有其實:
JAVA當中所有的類都是繼承於Object這個基類的,在Object中的基類中定義了一個equals的方法,這個方法的初始行為是比較物件的記憶體地址,但在一些類庫當中這個方法被覆蓋掉了,如String,Integer,Date在這些類當中equals有其自身的實現,而不再是比較類在堆記憶體中的存放地址了。
3 字串緩衝池(為什麼我宣告賦值了兩個String型別的都為a用==判定他倆卻相等?)
<span style="font-size:24px;"> String Date1 ="a";
String Date2 ="a";
String Date3 =new String("a");
if(Date1==Date2){
//比較地址一定是相等的
}
if(Date1==Date3){
//比較地址一定是不相等的
}</span>
當Date1有了一個a物件在堆裡時候、如果這時候再建立a的String變數,如Date2,程式不會建立新的物件,而是把Date2棧裡面的地址指向Date1建立的物件。(節約資源)
而Date3 new了一個、這裡就是說我必須要建立一個新的物件,如圖
總結:
還以為遇到了神奇的事情,其實就是基礎知識沒打好、唉= =相當慚愧,相信看了這文章大家對==和equals的區別一定有了深入的理解。
—————————————chenchen———————————————