Java Set接口,HashSet集合

1、Set接口

java.util.Set接口 extends Collection接口
Set接口特点:
1、不允许存储重复的元素
2、没有索引,没有带索引的方法,也不能使用普通的for循环遍历

2、HashSet集合

java.util.HashSet集合 implements Set接口
HashSet特点:
1、不允许存储重复的元素
2、没有索引,没有带索引的方法,也不能使用普通的for循环遍历
3、是一个无序的集合,存储元素和取出元素的顺序有可能不一致。
4、底层是一个哈希表结构(查询的速度非常的快)

3、哈希值(HashCode)

哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来的地址,不是数据实际存储的物理地址)在Object类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
hashCode方法源码:
public native int hashCode();
native代表该方法调用的是本地操作系统的方法

4、哈希表

HashSet集合存储数据的结构(哈希表)
jdk1.8版本之前:哈希表 = 数组 + 链表
jdk1.8版本之后: 哈希表 = 数组 + 链表;哈希表 = 数组 + 红黑树(提高查询的速度)
哈希表特点:速度快
两个元素不同,但是哈希值相同,被称作哈希冲突。

5、HashSet存储自定义类型元素

要求:同名同年龄的人只能存储一次
定义类:

public class Person {
    
    
    private String name;
    private int age;

    public Person() {
    
    
    }
    public Person(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;
        Person person = (Person) o;
        return age == person.age &&
                Objects.equals(name, person.name);
    }

    @Override
    public int hashCode() {
    
    
        return Objects.hash(name, age);
    }

    @Override
    public String toString() {
    
    
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public String getName() {
    
    
        return name;
    }

    public void setName(String name) {
    
    
        this.name = name;
    }

    public int getAge() {
    
    
        return age;
    }

    public void setAge(int age) {
    
    
        this.age = age;
    }
}

实现类:

public class Demo04HashSetSavePerson {
    
    
    public static void main(String[] args) {
    
    
        //创建HashSet集合存储Person
        HashSet<Person> set = new HashSet<>();
        Person p1 = new Person("王雷",26);
        Person p2 = new Person("王雷",26);
        Person p3 = new Person("王雷",19);
        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println(set);
        //[Person{name='王雷', age=26}, Person{name='王雷', age=19}]

    }
}

6、LinkedHashSet集合

java.util.linkedHashSet集合 extends HashSet集合
特点:
底层是一个哈希表(数组 + 链表/红黑树)+ 链表:多了一条链表(记录元素的存储顺序),保证元素有序。
举例:

public class Demo04LinkedHashSet {
    
    
    public static void main(String[] args) {
    
    
        HashSet<String> set = new HashSet<>();
        set.add("www");
        set.add("abc");
        set.add("abc");
        set.add("illness");
        System.out.println(set); //[abc, www, illness] 无序,不允许重复

        LinkedHashSet<String> set2 = new LinkedHashSet<>();
        set2.add("www");
        set2.add("abc");
        set2.add("abc");
        set2.add("illness");
        System.out.println(set2);  //[www, abc, illness] 有序,不允许重复

    }
}

猜你喜欢

转载自blog.csdn.net/Gaoju12138/article/details/109444286