[Javaベース]--hashcode、equals、compareTo、compareメソッドの意義と役割

5448 ワード

一、hashcodeとequalsは同時にクラスで書き直さなければならない(equalsメソッドとhashCodeメソッドを常に論理的に一致させる)
import java.util.HashMap;
 class Dog {
private String name;
private Integer age;
public Dog(){}
public Dog(String name, Integer age) {
this.name = name;
this.age = age;
}
         //  hashCode  ,  hash (hash         )
//          ,                。        。 
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((age == null) ? 0 : age.hashCode());
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
//  equals  
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Dog other = (Dog) obj;
if (age == null) {
if (other.age != null)
return false;
} else if (!age.equals(other.age))
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
 }
public class HashCodeAndEqualsInfo{
/**
*   
*       ,    equals        true,      hashcode     ;
*                            equals        false,      hashcode      ;
*   
*                hashcode   ,  equals          false;
*                hashcode   ,  equals         
* 
*/
public static  void  main(String args[]){
/**
*  HashSet、HashMap  HashTable     ,       String  ,      hashCode equals  
*/
Dog dog = new Dog("Marry", 22);
        System.out.println("hashCode:"+dog.hashCode());
             
        HashMap hashMap = new HashMap();
        hashMap.put(dog, 36);
         //      hashCode  equals  ,    null   36;
        /**       hashCode  ,     name age         hash  :33311724
         *      hashCode equals  ,       :74115696
         */
        System.out.println("  :"+hashMap.get(new Dog("Marry", 22)));
}
}

 
二、compareTo方法とcompareの意義と作用
1、普通のクラスでソートを実現するには、Comparableインタフェースを実現し、CompareTo()メソッドを書き換える必要があります. 
2.compareTo(Object o)メソッドはjava.lang.Comparableインタフェースのメソッドで、クラスのオブジェクトをソートする必要がある場合、
このクラスはComparableインタフェースを実装する必要があります.
public int compareTo(T o)メソッドを書き換える必要があります.たとえば、MapReduceのMap関数とReduce関数で処理されるもの、
キー値のペアをkeyに従ってソートする必要があります.
したがって、keyはWritableComparableインタフェースを実現し、このインタフェースはシーケンス化と逆シーケンス化の両方に使用することができる.
WritableComparableインタフェース(シーケンス化および逆シーケンス化用)は、WritableインタフェースとComparableインタフェースの組合せである.
3.compare(Object o 1,Object o 2)の方法はjavaである.util.Comparatorインタフェースの方法で、実際には比較対象のcomparareTo(Object)を使用します.
例:
新しいCat.JAvaクラス
package com.util.compare;
public class Cat implements Comparable{
    int id;               //id
    String name; //name
    public Cat(int id,String name){
        this.id = id;
        this.name = name;
    }
    public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
   /**
     *   compareTo  
     */
    @Override
    public int compareTo(Object o) {
        if(this ==o){
            return 0;            
        }
        else if (o!=null && o instanceof Cat) {   
        Cat u = (Cat) o; 
            if(id<=u.id){
                return -1;
            }else{
            return 1;
        }
    }else{
        return -1;
    }
}
}

 
新しいテストクラス:TestClass.java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class TestClass {
    //  Comparator,  Cat id Cat    
    private static final Comparator COMPARATOR = new Comparator() {
       public int compare(Cat o1, Cat o2) {
           return o1.compareTo(o2);//  Cat  compareTo               
      }
   };
    public static void main(String[] args) {
        ArrayList cat = new ArrayList();
        Cat c1 = new Cat(1,"xiaohei");
        Cat c2 = new Cat(2,"xiaohei");
         cat.add(c1);
         cat.add(c2);
        Collections.sort(cat, COMPARATOR);//       Comparator cat    

        //          :Arrays.sort(   );
        for(int i=0;i

三、CompareTo単独使用方法
@Test
    public void testCpm(){
    /**compareTo()       ,            (ASCII   ),
    *                   ,    ,         
    *                   ,                   ,
    *     ,                      ,          . 
    *   :compareTo          !
    *                    ascll    , str mes           ,
    *                           ( str6 mes6  )
    */
    String str="a"; String mes="b";
    String str2="abc"; String mes2="a";
    String str3="abdc"; String mes3="2d";
    String str4="abcde"; String mes4="ab";
    String str5="acd"; String mes5="2br";
    String str6="acd"; String mes6="acd";
    /**a ascll  97,1 ascll  49*/
    System.out.println("   :"+str.compareTo(mes));      //-1
    System.out.println("   :"+str2.compareTo(mes2)); //2
    System.out.println("   :"+str3.compareTo(mes3)); //47
    System.out.println("   :"+str4.compareTo(mes4)); //3
    System.out.println("   :"+str5.compareTo(mes5)); //47
    System.out.println("   :"+str6.compareTo(mes6)); //0
    }