今天来接触一下hashcode()这个方法,至于这么到这里来的 ——
hashcode()
上一篇有讲用数组的方式实现一个线性表,里面有一个排序的方法需要实现,但是我们只分析当数组存的元素是Interger时如何排序,当这个元素是其它类型就没办法使用'<','>'来做比较了,那么如何实现对它的比较呢。于是展开说说:
String类型可以有字符串类型,他们的比较方式可以是字典序。一位一位比较ASCII码,短的在前。但是长度过长比较起来很麻烦。
其他不规则的元素:例如自己设定的类对象要怎么比较呢?
可以看出数字比较非常方便,因此就给这些对象统一转化成数字编码,以这个数字编码进行比较排序。这个数字编码显然对象不一样的时候编码也必须互异。
这个数字编码有一套算法可以算出来,算法就是哈希算法,得出的数字编码就是哈希编码。
这个哈希算法不是固定的,你甚至可以自由的设置编码方式重写这个方法。
但至少要确保hashcode不重复。
- 看看String的hashcode()方法是怎么实现的
- 数组的hashcode()方法
- 自己写的类的hashcode()方法
- 根据不同的对象属性调用各自的hashcode()方法
这样每个对象都能得到一个hashcode,只需要对生成的hashcode做排序就行(yysy这个排序感觉也没啥意义,判等或许可以用)
判等用到的hashcode方法
判等用hashcode()不只是可以用,是简直太好用了!
不需要一个一个调用属性类型的判等方法,只需要重写hashcode方法,让hashcode根据属性生成,这样只要两个属性完全相等的对象hashcode就是相等的,判等直接通过hashcode判断就非常异常特别十分之方便。
public class User {
String id;
String name;
int age;
String phoneNum;
Test test;
Integer i;
int[] arr;
public User(){
}
public User(String id,String name,int age,String phoneNum,Test test,Integer i,int[] arr){
this.id = id;
this.name = name;
this.age = age;
this. phoneNum = phoneNum;
this.test = test;
this.i = i;
this.arr = arr;
}
//重写的equal方法,要写很多
@Override
public boolean equals(Object o) {
if(this == o) return true;
if((o == null) || (this.getClass() != o.getClass())) return false;
User user0 = (User) o;
if(this.arr.length != user0.arr.length) return false;
for(int i=0;i<this.arr.length;i++){
if(this.arr[i] != user0.arr[i]) return false;
}
return ( (this.id.equals(user0.id)) && (this.name.equals(user0.name)) && (this.age == user0.age) && (this.phoneNum.equals(user0.phoneNum)) && (this.test.equal(user0.test)) && (this.i.equals(user0.i)));
}
//重写的hashcode方法,很简单——但是设计一个不要重复编码的hashcode方法也需要巧思
@Override
public int hashCode() {
int result = Objects.hash(id, name, age, phoneNum, test, i);
result = 31 * result + Arrays.hashCode(arr);
return result;
}
}
hashcode在哪里也有过露面
检索算法
我接触过哈希这个说法最早是在检索算法,通过构造哈希函数设计基于哈希表的查找算法。还有为了节省空间设计的不同映射方式、解决哈希冲突的方法等等。
hashcode作为java对象的唯一表示
还有类似的编码做文件/对象的唯一表示
例如md5,sha等等,他们有量级的区别,设计方法也不尽相同,但是设计思路、目的类似。
有了这种编码,在网上下载文件的额时候就可以检测出你下载的文件是否是官方唯一正版,一个字不相同也不是同一份文件可能天差地别。
一个可以在线转码的网址: