[Javaベース]--hashcode、equals、compareTo、compareメソッドの意義と役割
5448 ワード
一、hashcodeとequalsは同時にクラスで書き直さなければならない(equalsメソッドとhashCodeメソッドを常に論理的に一致させる)
二、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クラス
新しいテストクラス:TestClass.java
三、CompareTo単独使用方法
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
新しいテストクラス: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
}