这里主要介绍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();
}
}
分享到:
相关推荐
关于重写equals,hashcode以及compareTo方法!
本文介绍了Java语言不直接支持关联数组,可以使用任何对象作为一个索引的数组,但在根Object类中使用 hashCode()方法明确表示期望广泛使用HashMap。理想情况下基于散列的容器提供有效插入和有效检索;直接在对象模式...
equals()和hashcode()这两个方法都是从object类中继承过来的。当String 、Math、还有Integer、Double。。。。等这些封装类在使用equals()方法时,已经覆盖了object类的equals()方法.
Java重写equals同时需要重写hashCode的代码说明,以及如何重写hashCode方法,此代码演示按照effective java书籍说明的重写思路。代码中演示了使用集合存储对象,并且对象作为key,需重写equals和hashCode.
解析Java对象的equals()和hashCode()的使用
今天小编就为大家分享一篇关于关于Object中equals方法和hashCode方法判断的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
Object类是所有Java类的根类,它定义了一些常用的方法,例如equals()、hashCode()、toString()等。本案例代码将详细展示Object类的使用方法,并提供一些实际场景下的案例,以帮助开发者更好地理解和运用这些方法。 ...
Java中的equals()和hashCode()契约Java开发Java经验技巧共3页.pdf.zip
重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例重载equals方法示例
本文中详细的阐述了Java中经常遇到的equals、hashcode以及“==”号三者之间的区别
java代码-使用java解决实现Student类的equals重载函数的源代码 ——学习参考资料:仅用于个人学习使用!
NULL 博文链接:https://zpointer.iteye.com/blog/1058337
###Responsibilities### Aequum 库旨在通过使用在 POJO 类上编写equals 、 hashCode和compareTo方法时帮助删除一些样板。 请注意,此库依赖于 Java 8。 ###组件初始化指令###要使用此库,调用builder的方法Aequum...
更清楚的了解hashcode()和equals()方法。
Java 对Object类的认识和equals()方法和== 的对比
Java中的==与equals()实例方法Java中测试两个变量是否相等的方法有两个,一个是用==运算符,另一个就是object类提供的equals()方法。2
重写equals和hashcode方法,学习和进步
java中hashcode()和equals()的详解.docx