java-se-集合之Set

Set:
    特点1:无序,存储的元素顺序与添加顺序无关
    特点2:不可重复(使用元素的equals()方法判定是否重复),
    特点3:能存储null元素,只能存储一次
    
    Hash算法机制:
            Set集合在添加查看元素时,当集合中的元素过多时,就会进行多次比较,效率变低,为了提高效率,在设计元素类型时,提供hash算法,用于返回对象的一个int值,在内存中开辟了很多小的区域,用于存储一定范围返回值的对象。当添加或查看元素时,先计算此元素的返回值,然后在相应的区域中遍历查找,如果在这个区域没有找到对象,说明可以添加这个对象;如果有,查看两个对象的equals的返回值,返回true,不能添加;返回false,可以添加,添加至对应的链表结构中(尽可能避免发生)
    
    HashCode方法:
        Object是引用类型的父类,提供了hashCode()方法和equals()方法,因此在定义类型时一般重写hashCode()和equasl()
    重写HashCode方法:
        重写规则:尽可能让所有的成员变量都参与运算,尽可能避免出现hash值碰撞
        重写的必要性:
            (1)如果重写了equals(),有必要重写hashCode方法
            (2)如果equals()返回true,hashCode返回值有必要相同
            (3)如果equals()返回false,hashCode返回值不一定相同(不同可提高检索效率)
    
    Set集合的遍历
        因为set集合是无序的,无下标,因此不能使用经典for循环,可以使用迭代器原理
        (1)调用集合的Iterator()获取迭代器
        (2)使用foreach循环
    
    Set集合的元素
        不能轻易修改参与hash值算法的成员变量,否则容易引起内存溢出
        原因:成员变量修改后,会出现新的hash值,但是存储位置还在原hash值的位置上,因此操作时找不到具体的存储位置
    
    子类:
        HashSet:通过实现hash算法的一种数据结构,无序、不重复
        LinkedHashSet:通过实现hash算法的一种数据结构,通过链表来维持顺序,顺序与添加顺序一致
        TreeSet:使用二叉树的一种数据结构,顺序与自然排序有关系,支持定制排序

猜你喜欢

转载自blog.csdn.net/qq_38741415/article/details/82630507