哈希值
哈希值:是JDK根据对象的地址或者字符串或者数字算出来的int类型的数值。
Object类中有一个方法可以获取对象的哈希值
- public int hashCode():返回对象的哈希码值。
对象的哈希值特点:
- 同一个对象多次调用hashCode()方法返回的哈希值是相同的。
- 默认情况下,不同对象的哈希值是不同的。重写hashCode()方法,可以实现让不同对象的哈希值相同。
HadhSet集合概述和特点
HashSet集合特点:
- 底层数据结构是哈希表
- 对集合的迭代顺序不作任何保证,也就是说不保证存储和取出的元素顺序一致。
- 没有带索引的方法,所以不能使用普通for循环遍历,但可以使用for each。
- 由于是Set集合,所以是不包含重复元素的集合。
练习:存储字符串并遍历
import java.util.HashSet;
public class HashSetDemo {
public static void main(String[] args){
HashSet<String> hs=new HashSet<>();
hs.add("java");
hs.add("python");
hs.add("golang");
hs.add("one piece");
for(String s:hs){
System.out.println(s);
}
}
}
?由结果可知,输出的顺序和存放顺序不一样。
HashSet方法保证元素唯一性(参考视频)
?
哈希表
哈希表:
- JDK8之前,底层采用数组+链表实现,可以说是一个元素为链表的数组。
- JDK8以后,在长度比较长的时候,底层实现了优化。
?先算出每个对象的哈希值,根据哈希值算出对象的存储位置,然后看存储位置有没有对象,没有对象就放进去,有对象就遍历该位置上所有的对象,看是否哈希值一样,如果哈希值不一样,就放进去,如果哈希值一样,就用equals()方法判断元素内容是否一样,如果不一样就放进去,一样就不存储。
P243中讲到了HashSet存储学生对象时,如何去除重复对象的问题,即在学生类中重写hashCode和equals方法。
|