1. 程式人生 > >IF,String程式設計趣事==和equals的區別

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———————————————