`

Java中Object的使用:重载equals、hashCode及实现compareTo (转)

    博客分类:
  • j2se
 
阅读更多

这里主要介绍Java中使用Hashtable、Arrays.sort时候如果键值涉及到对象、类时候的处理办法:

1. 重载equals():java中默认的对象的equals是当指向同一内存地址时才为true;如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法。

2.重载hashCode():只有当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode,原因:就HashMap来说,好比HashMap就是一个大内存块,里面有很多小内存块,小内存块里面是一系列的对象,可以利用hashCode来查找小内存块hashCode%size(小内存块数量),所以当equal相等时,hashCode必须相等,而且如果是object对象,必须重载hashCode和equal方法。

3. 实现接口Comparable:当需要调用sort()之类的函数要用到对象的比较的基本操作时候,就需要对Object的compareTo(Object arg0)进行实现。

4. binarySearch使用注意:由于Arrays.binarySearch(Object array[],Object key)中没有给定查找数组的范围,据我估计可能是0到length-1,因而数组最好是都能填满对象,如果部分为空(数组开的过大)则会出错。而且搜索前要调用sort函数排序一下。因为数组长度和对象个数相同,所以sort(Object [])也不用给定范围而全部排序。

 

下面是一个简单的例子:

public class TermPOS implements Comparable{
    public String term;
    public String pos;
    public TermPOS(String a,String b)
    {
        term = a;
        pos = b;
    }
    //用于调用Arrays.sort(Object[])时的自定义大小,此时类后加上implements Comparable
    public int compareTo(Object arg0) {
        // TODO 自动生成方法存根
        if(this.term.compareTo(((TermPOS)arg0).term) != 0)
            return this.term.compareTo(((TermPOS)arg0).term);
        return this.pos.compareTo(((TermPOS)arg0).pos);
    }
    
    //当类需要放在HashTable、HashMap、HashSet等等hash结构的集合时才会重载hashCode
    //http://hi.baidu.com/bluedream348/blog/item/23d10e5466e639d0b645ae92.html
    public int hashCode()
    {
        return term.hashCode()*pos.hashCode();
    }
    //如果你现在需要利用对象里面的值来判断是否相等,则重载equal方法
    public boolean equals(Object obj)
    {
        if(term.compareTo(((TermPOS)obj).term) != 0)return false;
        if(pos.compareTo(((TermPOS)obj).pos) != 0)return false;
        return true;
    }

    public static void testHashtable()
    {
        Hashtable<TermPOS,Integer> t = new Hashtable<TermPOS,Integer>();
        TermPOS x = new TermPOS("a","b");
        t.put(new TermPOS("a","b"), 2);
        if(t.get(x) == null)System.out.println("wrong!"); //当去掉hashCode的重写后就输出这个
        else System.out.println(t.get(x));
        System.out.println(x.equals(new TermPOS("a","b")));
    } 
    public static void testSort()
    {
        TermPOS tp[] = new TermPOS[3];
        tp[0] = new TermPOS("b","c");
        tp[1] = new TermPOS("a","c");
        tp[2] = new TermPOS("a","b");
        Arrays.sort(tp,0,3);
        for(int i = 0;i < 3;i ++)
            System.out.println(tp[i].term+"\t"+tp[i].pos);
    }
    /**
     * @param args
     * @throws IOException 
     */
    public static void main(String[] args) throws IOException {
        // TODO 自动生成方法存根
        testHashtable();
        testSort();
    }
}

分享到:
评论

相关推荐

    java常用类的使用方法.pdf

    Java常用类的使用方法 Java语言中提供了多种常用类,例如Integer类、Float类、Double类、Character类、String类、StringTokenizer类、StringBuffer类、Random类等,这些类提供了许多实用的方法,以便开发者更方便地...

    java面试宝典

    - **原因:** Java中的char类型使用Unicode编码,一个char占2个字节,足够存放一个中文字符。 **8. 实现接口与继承类的最大区别?** - **接口:** 只能包含抽象方法和默认方法,提供一种标准的行为模式。 - **继承:*...

    java内容集合

    ### Java内容集合知识点详解 #### 1. `length()` 方法在不同上下文中的应用 - **`String` 类中的 `length()` 方法**:用于获取字符串的长度,即字符串中字符的数量。 - **数组的 `length` 属性**:用于获取数组的...

    JavaSE笔试问答题.docx

    1. 当Class实现Cloneable和Comparable接口时,需要实现`clone()`和`compareTo(Object obj)`方法。`clone()`用于创建当前对象的一个副本,而`compareTo()`用于比较两个对象的顺序,通常用于排序操作。 2. 这个方法是...

Global site tag (gtag.js) - Google Analytics