Java在重载中使用Object的问题

网友投稿 229 2022-08-28


Java在重载中使用Object的问题

目录在重载中使用Object在开发中遇到了两个方法不是说先匹配类型相同的吗?解决办法Object的使用:重载equals、hashCode及实现compareTo下面是一个简单的例子

在重载中使用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 value) {

...

}

public boolean lSet(Object) {

...

}

调用时:

List list = new ArrayList<>();

list.add(1);

list.add(2);

lSet(list); //调用了lSet(Object)

调用了lSet(Object) 而不是lSet(List value)

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

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

解决办法

//使用?通配符 或 直接不指定泛型

public boolean lSet(List> value) {

...

}

Object的使用:重载equals、hashCode及实现compareTo

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

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 t = new Hashtable();

TermPOS x = new TermPOSyWrNN("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();

}

}


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:运行Pytest命令行的选项参数【个人觉得很有帮助的一些参数】(pytest运行方式)
下一篇:pytest测试框架之skip&skipif跳过测试用例(pytest使用)
相关文章

 发表评论

暂时没有评论,来抢沙发吧~