• Java第十七天,Set接口


    Set接口

    1.特点

    (1)不包含重复元素。

    (2)没有索引。

    (3)继承自Collection接口,所以Collection接口中的所有方法都适用于Set接口。

    2.解析

    (1)为什么不能包含重复元素?

    Set接口的add方法会调用hashCode()方法得到哈希值,然后查看该哈希值是否对应着多个元素(哈希冲突),如果不存在哈希冲突,则添加成功;如果存在哈希冲突,则会调用equals方法判断该元素是否与哈希冲突元素相同。如果相同的话,添加失败;如果不同的话,添加成功。

    执行上面判断的前提是:元素所属的类得重写hashCode和equals方法。因为不是所有的元素都是字符串。言外之意就是说,如果想用HashSet集合存储自定义数据类型,必须重写hashCode和equals方法,以保证哈希表的特性——不包含重复元素。

    HashSet集合

    1.特有特点

    (1)实现不同步(多线程)。

    (2)实现Set接口,所以Set接口的方法适用于HashSet集合。

    (3)无序。即存储和取出同一元素的顺序有可能不一致。

    (4)底层是一个哈希表结构,所以查询的速度非常快。

    2.遍历方法

    (1)迭代器

    (2)增强 for 语句

    3.哈希值

    (1)哈希值是一个十进制的整数,由系统随即给出(是对象的逻辑地址,不是物理地址)。

    (2)Object类中的 hashCode() 方法就是返回对象的哈希值。

    (3)String类重写了Object的hashCode()方法。哈希值相同的对象不唯一(两个元素不同,哈希值相同叫做哈希冲突)。

    4.HashSet集合存储数据的结构——哈希表

    (1)

    jdk 1.8 版本之前:

    哈希表 = 数组 + 链表

    jdk 1.8 版本以后:

    哈希表 = 数组 + 红黑树(提高查询速度)

    哈希表的特点就是查询速度快。

    (2)

    数组结构把元素进行了分组(哈希值相同的元素是一组),如果一组相同的元素超过8位,则会将链表结构转成红黑树结构。

    (3)用HashSet存储自定义类型。

    Stu类:

    package com.lanyue.day16;
    
    import java.util.Objects;
    
    public class Stu {
    
        public String name;
        public int age;
    
        public Stu(String name, int age) {
            this.name = name;
            this.age = age;
        }
    
        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (o == null || getClass() != o.getClass()) return false;
            Stu stu = (Stu) o;
            return age == stu.age &&
                    Objects.equals(name, stu.name);
        }
    
        @Override
        public int hashCode() {
            return Objects.hash(name, age);
        }
    }
    

    运行类:

    package com.lanyue.day16;
    
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class SetLearn {
    
        public static void main(String[] args) {
    
            HashSet<Stu> stus = new HashSet<>();
            Stu one = new Stu("小红",12);
            Stu two = new Stu("小红",12);
    
            stus.add(one);
            stus.add(two);
    
            Iterator<Stu> it = stus.iterator();
            while(it.hasNext()){
    
                Stu stu = it.next();
                System.out.println(stu.age + "" + stu.name);
            }
        }
    }
    

    程序运行图:

    LinkedHashSet集合

    1.概念

    该集合为HashSet集合的继承,所以方法基本与前者相同。不同之处是,LinkedHashSet集合具有可预知的迭代顺序,即迭代顺序是按照元素插入Set接口的顺序进行的。

    该集合多了一条链表,多的这条链表就是用来存储元素存放顺序的,保证了元素的有序性。

    2.特点

    (1)有序。

    (2)不允许重复。

  • 相关阅读:
    注册表编程初步
    内层位移换算到外层
    运算符重载
    按右手定则求已经知三点的法向量
    链接错误 2001、2019
    UML规则笔记
    关于动态链接库、静态链接库
    05 nfs、rsync、inotify综合案例
    rsync本地同步
    05 NFS基础知识
  • 原文地址:https://www.cnblogs.com/viplanyue/p/12700532.html
Copyright © 2020-2023  润新知