1. ==運算符與equals()方法
2. hashCode()方法的應用
3. intern()方法
(本篇末尾會做一個總結)
- /*
- Come from xixifeng.com
- Author: 習習風(StellAah)
- */
- public class AboutString2
- {
- public static void main(String[]arsgs)
- {
- String myName="xixifeng.com";
- String myName3="xixifeng";
- String myName4=".com";
- String myName5=myName3+myName4;
- String myName6="xixifeng.com";
- if(myName==myName5)
- {
- System.out.println("myName==myName5");
- }
- else
- {
- System.out.println("myName="+myName);
- System.out.println("myName5="+myName5);
- System.out.println("myName!=myName5");
- }
- //經運行打印出: myName!=myName5
- if(myName==myName6)
- {
- System.out.println("myName==myName6");
- }
- else
- {
- System.out.println("myName!=myName6");
- }
- //經運行得出: myName!=myName5,myName==myName6
- //myName,myName5(myName5的值是由myName3+myName4得到的),myName6 這三個對象的值是相等的, 爲什麼 它們之間用==進行運算的結果是 myName!=myName5,myName==myName6呢?
- //原因在於==運算符
- //顯然==參與String運算中不是用來比較值的,而是用來比較對象是否相等的.
- //那麼在String運算中,通過什麼方法來比較它們的值是否相等呢,java 提供了equals()方法 ,主要用於比較對象的值是否相等
- //示例如下:
- //myName==myName5 是false (不是同一個對象)
- if(myName.equals(myName5))
- {
- System.out.println("myName.equals(myName5) 比較的結果是true !");
- }
- else
- {
- System.out.println("myName.equals(myName5) 比較的結果是false !");
- }
- //經運行輸出:myName.equals(myName5) 比較的結果是true ! 在由於myName與myName5不是同一個對象,充分說明:
- //equals()方法[是用來比較對象的值是否相等]
- //再拋出疑問:是不是兩個對象的哈希值相等就說明這兩個對象相等呢?
- //(由上述測試myName==myName5 得出false ①表明myName與myName5不是同一個對象)
- System.out.println(myName.hashCode());
- System.out.println(myName5.hashCode());
- //經測試 ②myName與myName5的哈希值相等
- //由①,② 得出: 兩個對象的hashCode值相等,不能表明其對象也相等.
- //拋出疑問: 怎樣使myName與myName5的對象相等呢?
- //引入intern()方法
- myName5=myName5.intern();
- if(myName==myName5)
- {
- System.out.println("(myName==myName5) 得true");
- }
- else
- {
- System.out.println("(myName==myName5) 得false");
- }
- //經運行打印出: (myName==myName5) 得true
- //結論: intern()方法能使兩個(對象不相等而值相等的)對象變得相等
- //myName5.intern();的意思,可以解釋爲: myName5在內存中查找對象嫁給自己,條件是,該對象要與自己的值相等. 找到了,就指定該對象.
- //myName5找到對象,並認定,就不必再創建對象了,所以說這樣做,可以節約內存資源.
- //拋出疑問: 什麼樣的對象建議使用intern()呢?
- // myName="xixifeng.com" myName6="xixifeng.com", myName與myName6的對象是相等的,上述已經證實.
- // 所以說,對象在直接賦予同樣的值的時候沒有必要用intern().
- //myName="xixifeng.com" myName5=myName3+myName4,它們的值相等,但是對象不相等,上述已經證實.
- //所以說, 對象在間接賦予(有可能與已有對象)同樣的值的時候,建議用一下intern()方法,從而可公用內存中存在的對象.
- //==參與int型運算中,也營造類似的比較
- int i=8;
- int j=3;
- int k=5;
- int m=j+k;
- int n=8;
- if(i==m)
- {
- System.out.println("i="+i);
- System.out.println("m="+m);
- System.out.println("i==m");
- }
- else
- {
- System.out.println("i!=m");
- }
- if(i==n)
- {
- System.out.println("... ... ... ...");
- System.out.println("i="+i);
- System.out.println("n="+n);
- System.out.println("i==n");
- }
- else
- {
- System.out.println("i!=n");
- }
- //經運行得出i=m(m的值由j+k得到),i=n
- //i,m,n的值都相等 , 由於i==m 得出true i==n得出true
- //所以可以得出結論: ==參與非對象類型運算時,是用來比較常量的值是否相等
- }
- }
綜上所屬,得出如下結論:
1) ==運算符參與對象類型運算時是用來比較對象是否想得的.
2) ==運算符參與非對象類型運算時是用來比較值是否相等的.
3) equals()方法用於比較兩個對象的值是否相等
4) 兩個對象的hashCode()值相等,並不代表其對象也相等 , java中兩個對象值相同,hashCode可以不同。
5) intern()方法能使兩個(對象不相等而值相等的)對象變得相等,從而可以公用內存已有的對象,這樣做可以節約內存資源.
6) 對象在間接賦予(有可能與已有對象)同樣的值的時候,建議用一下intern()方法,從而可公用內存中存在的對象.
(7)如果根據 equals(Object) 方法,兩個對象是相等的,那麼對這兩個對象中的每個對象調用 hashCode 方法都必須生成相同的整數結果,注:這裏說的equals(Object) 方法是指Object類中未被子類重寫過的equals方法。
hashcode和hashMap