欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java在重载中使用Object的问题

程序员文章站 2022-01-23 10:23:46
目录在重载中使用object在开发中遇到了两个方法不是说先匹配类型相同的吗?解决办法object的使用:重载equals、hashcode及实现compareto下面是一个简单的例子在重载中使用obj...

在重载中使用object

java中调用重载方法都是先匹配同类型参数的方法,如没有才会向上转型去匹配参数。

例:

public void remove(int i) {
    ...
}
public void remove(object object) {
    ...
}
    int i = 0;
    integer it = 0;
    remove(i); //调用了 remove(int i) 方法
    remove(it); //调用了 remove(object object) 方法

在开发中遇到了两个方法

public boolean lset(list<object> value) {
    ...
}
public boolean lset(object) {
    ...
}

调用时:

    list<integer> list = new arraylist<>();
    list.add(1);
    list.add(2);
    lset(list);  //调用了lset(object)

调用了lset(object) 而不是lset(list<object> value)

不是说先匹配类型相同的吗?

注意重载方法中的参数list<object> value list指定了泛型object,但调用时传入的是list<integer>此时并不算同一种类型。

解决办法

//使用?通配符 或 直接不指定泛型
public boolean lset(list<?> value) {
    ...
}

object的使用:重载equals、hashcode及实现compareto

这里主要介绍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
    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();
    }
}

以上为个人经验,希望能给大家一个参考,也希望大家多多支持。