Java ==運算符與equals方法的區別及intern方法的正確使用

 

本篇主要內容:
1.  ==運算符與equals()方法
2. hashCode()方法的應用

3. intern()方法

(本篇末尾會做一個總結)

 

  1. /* 
  2. Come from xixifeng.com 
  3. Author: 習習風(StellAah) 
  4. */  
  5. public class AboutString2   
  6. {  
  7.     public static void main(String[]arsgs)  
  8.     {  
  9.         String myName="xixifeng.com";  
  10.         String myName3="xixifeng";   
  11.         String myName4=".com";  
  12.         String myName5=myName3+myName4;  
  13.         String myName6="xixifeng.com";  
  14.           
  15.         if(myName==myName5)  
  16.         {  
  17.               
  18.             System.out.println("myName==myName5");  
  19.         }  
  20.         else  
  21.         {  
  22.             System.out.println("myName="+myName);  
  23.             System.out.println("myName5="+myName5);  
  24.             System.out.println("myName!=myName5");  
  25.         }  
  26.         //經運行打印出: myName!=myName5   
  27.           
  28.         if(myName==myName6)  
  29.         {  
  30.             System.out.println("myName==myName6");  
  31.         }  
  32.         else  
  33.         {  
  34.             System.out.println("myName!=myName6");  
  35.         }  
  36.         //經運行得出:  myName!=myName5,myName==myName6   
  37.           
  38.         //myName,myName5(myName5的值是由myName3+myName4得到的),myName6 這三個對象的值是相等的, 爲什麼 它們之間用==進行運算的結果是 myName!=myName5,myName==myName6呢?   
  39.         //原因在於==運算符   
  40.         //顯然==參與String運算中不是用來比較值的,而是用來比較對象是否相等的.   
  41.         //那麼在String運算中,通過什麼方法來比較它們的值是否相等呢,java 提供了equals()方法 ,主要用於比較對象的值是否相等   
  42.         //示例如下:   
  43.         //myName==myName5 是false (不是同一個對象)   
  44.         if(myName.equals(myName5))  
  45.         {  
  46.             System.out.println("myName.equals(myName5) 比較的結果是true !");  
  47.         }  
  48.         else  
  49.         {  
  50.             System.out.println("myName.equals(myName5) 比較的結果是false !");  
  51.         }  
  52.         //經運行輸出:myName.equals(myName5) 比較的結果是true ! 在由於myName與myName5不是同一個對象,充分說明:   
  53.         //equals()方法[是用來比較對象的值是否相等]   
  54.           
  55.         //再拋出疑問:是不是兩個對象的哈希值相等就說明這兩個對象相等呢?   
  56.         //(由上述測試myName==myName5 得出false ①表明myName與myName5不是同一個對象)   
  57.         System.out.println(myName.hashCode());  
  58.         System.out.println(myName5.hashCode());  
  59.         //經測試 ②myName與myName5的哈希值相等   
  60.         //由①,② 得出: 兩個對象的hashCode值相等,不能表明其對象也相等.   
  61.   
  62.         //拋出疑問: 怎樣使myName與myName5的對象相等呢?   
  63.         //引入intern()方法   
  64.         myName5=myName5.intern();  
  65.         if(myName==myName5)  
  66.         {  
  67.               
  68.             System.out.println("(myName==myName5) 得true");  
  69.         }  
  70.         else  
  71.         {  
  72.             System.out.println("(myName==myName5) 得false");  
  73.         }  
  74.         //經運行打印出: (myName==myName5) 得true   
  75.         //結論: intern()方法能使兩個(對象不相等而值相等的)對象變得相等   
  76.         //myName5.intern();的意思,可以解釋爲: myName5在內存中查找對象嫁給自己,條件是,該對象要與自己的值相等. 找到了,就指定該對象.   
  77.         //myName5找到對象,並認定,就不必再創建對象了,所以說這樣做,可以節約內存資源.   
  78.           
  79.         //拋出疑問: 什麼樣的對象建議使用intern()呢?   
  80.         // myName="xixifeng.com" myName6="xixifeng.com", myName與myName6的對象是相等的,上述已經證實.   
  81.         // 所以說,對象在直接賦予同樣的值的時候沒有必要用intern().   
  82.         //myName="xixifeng.com" myName5=myName3+myName4,它們的值相等,但是對象不相等,上述已經證實.   
  83.         //所以說, 對象在間接賦予(有可能與已有對象)同樣的值的時候,建議用一下intern()方法,從而可公用內存中存在的對象.   
  84.           
  85.           
  86.         //==參與int型運算中,也營造類似的比較   
  87.         int i=8;  
  88.         int j=3;  
  89.         int k=5;  
  90.         int m=j+k;  
  91.         int n=8;  
  92.         if(i==m)  
  93.         {  
  94.             System.out.println("i="+i);  
  95.             System.out.println("m="+m);  
  96.             System.out.println("i==m");  
  97.         }  
  98.         else  
  99.         {  
  100.             System.out.println("i!=m");  
  101.         }  
  102.           
  103.         if(i==n)  
  104.         {  
  105.             System.out.println("... ... ... ...");  
  106.             System.out.println("i="+i);  
  107.             System.out.println("n="+n);  
  108.             System.out.println("i==n");  
  109.         }  
  110.         else  
  111.         {  
  112.             System.out.println("i!=n");  
  113.         }  
  114.         //經運行得出i=m(m的值由j+k得到),i=n   
  115.         //i,m,n的值都相等 , 由於i==m 得出true i==n得出true    
  116.         //所以可以得出結論: ==參與非對象類型運算時,是用來比較常量的值是否相等         
  117.     }  
  118. }  

 

綜上所屬,得出如下結論: 

1) ==運算符參與對象類型運算時是用來比較對象是否想得的. 

2) ==運算符參與非對象類型運算時是用來比較值是否相等的. 

3) equals()方法用於比較兩個對象的值是否相等 

4) 兩個對象的hashCode()值相等,並不代表其對象也相等 , java中兩個對象值相同,hashCode可以不同。

5) intern()方法能使兩個(對象不相等而值相等的)對象變得相等,從而可以公用內存已有的對象,這樣做可以節約內存資源. 

6) 對象在間接賦予(有可能與已有對象)同樣的值的時候,建議用一下intern()方法,從而可公用內存中存在的對象.

(7)如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果,注:這裏說的equals(Object) 方法是指Object類中未被子類重寫過的equals方法。

 

hashcode和hashMap

HashMap對象是根據其Key的hashCode來獲取對應的Value。
在重寫父類的equals方法時,也重寫hashcode方法,使相等的兩個對象獲取的HashCode也相等,這樣當此對象做Map類中的Key時,兩個equals爲true的對象其獲取的value都是同一個,比較符合實際。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章