玩命加载中 . . .

Set集合(42)


Set集合

Set集合存储过程:

  1. Hashset底层实际上是一个 HashMap, HashMap底层采用了哈希表数据结构。

  2. 哈希表又叫做散列表,哈希表底层是一个数组,这个数组中每一个元素是一个单向链表。每个单向链表都有一个独一无二的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());
        }
  1. 深入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);
    }
}

文章作者: 小靳同学
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 小靳同学 !
评论
 上一篇
TreeSet集合(43) TreeSet集合(43)
TreeSet集合 TreeSet特点:无需不可重复但是可以按照元素的大写进行排序 示例代码01: // 创建TressSe
2021-09-28
下一篇 
List集合(41) List集合(41)
List集合list集合的特点: 有序性可重复,有序,存进去什么顺序,取出来还是这个顺序取出。 示例代码01: List
2021-09-25
  目录