Set集合
Set集合存储过程:
Hashset底层实际上是一个 HashMap, HashMap底层采用了哈希表数据结构。
哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表。每个单向链表都有一个独一无二的hash值,代表数组的下标。在某个单向链表中的每一个节点上的hash值是相等的,hash值实际上是key调用 hashcode方法,在通过” hash function”转换成的值。
3.如何向哈希表中添加元素:
先调用被存储的key的hashcode方法,经过某个算法得出hash值,如果在这个哈希表中不存在这个hash值,则直接加入元素。如果该hash值已经存在,继续调用key之间的equals方法,如果 equals方法返回 false,则将该元素添加。如果equals方法返回true,则放弃添加该元素。
- 示例代码01:
// 创建HashSet集合
Set h = new HashSet();
// 添加元素
h.add(120);
h.add(4000);
h.add(3);
h.add(76);
h.add(76);
// 遍历
Iterator i = h.iterator();
while (i.hasNext()) {
System.out.println(i.next());
System.out.println("h集合中元素个数有:"+h.size());
}
- 深入Hashset数组
示例代码02:
public static void main(String[] args) {
// 创建一个HashSet集合
Set employee = new HashSet();
Employee e1 = new Employee("200","Jack");
Employee e2 = new Employee("200","Jack");
Employee e3 = new Employee("256","KED");
Employee e6 = new Employee("256","ABC");
System.out.println(e3.hashCode()); // ---> 3839054
System.out.println(e6.hashCode()); // ---> 3839054
// e3与e6对象添加到HashSet中去,调用hashCode方法返回结果一样,HashSet会进一步调用equals
// 方法来进行比较是否相同,如果相同则放弃添加,如果不相同则添加。
Employee e4 = new Employee("308","Array");
Employee e5 = new Employee("10","Monk");
// 添加元素
// 因为以上添加的两个对象重复但是调用hashCode()方法不一样,不符合业务逻辑,
// 所以需要重写hashCode方法。
employee.add(e1);
employee.add(e2);
employee.add(e3);
employee.add(e4);
employee.add(e5);
employee.add(e6);
}
// 根据现实的业务逻辑得知:该公司的员工编号是:1000-9999
class Employee {
// 编号
String no;
// 姓名
String name;
// 构造函数
public Employee(String no, String name) {
this.no = no;
this.name = name;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Employee employee = (Employee) o;
return Objects.equals(no, employee.no) && Objects.equals(name, employee.name);
}
@Override
public int hashCode() {
return Objects.hash(no, name);
}
}