Java基本知识
1. Hash碰撞冲突
默认hashCode()调用是native本地方法,它的默认实现与对象地址有关,没有实际意义。对象hash前提是实现hashcode与equals方法。hashcode方法作用是保证对象返回唯一的hash值。但hash算法并不完美,有可能两个不同的原始值在经过哈希运算后得到相同的结果,这就是hash碰撞。
2、解决碰撞
- 开放定址法 (当发生地址冲突时,根据某种方法继续探测哈希表中的其他存储单元,直到找到空位置为止)
- 链地址法(在hashMap中将多个原数据不相同而哈希相同的以链表方式存储起来)
3、equals 与 ==
- equals默认实现就是 地址比较(==),但在实际业务中,我们需要根据实现业务来判断两个对象是否相同。
- == ,地址比较。
4、hashCode作用
hashCode作用是来获取哈希码,也可称为散列码。实际返回值是int型数据。用于确定对象在哈希表的位置。所有类都有hashCode方法,但hashCode只有在创建某个类的散列表的时候才有用,因为哈希表的位置是通过hashCode来确认对象的。Java中常用的哈希表有:HashMap、HashSet、HashTable。所以如果一个对象一定不会在哈希表中使用,那么是没有必要复写hashCode方法的。但如果使用了但没有重写hashCode,有可能出现不一样的结果。同时如果两个对象的equals相等,hashCode一定相等,反之不一定。
5、重写要求
- a==b 那么 a.eqauls(b) = true必须相等 且 a.hashCode() == b.hashCode() 必须相等 ;
- a.equals(b) , 那么 a== b 不一定,且a.hashCode() == b.hashCode() 必须相等 ;
- a.hashCode() == b.hashCode() ,那么 a.equlas(b) 不一定相等 ,且 a == b 也不一定;