Set不同实现类的对比

132 阅读2分钟

1. Set接口中存储数据的特点

存储无序的、不可重复的数据

1.2 Set中常用方法

即为ColLection中声明的15个抽象方法。没有新增的方法

1.3 开发中的使用频率及场景

较List、Map来说,Set使用的频率比较少
常用来过滤重复数据

2. Set实现类

  • HashSet:主要实现类,底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储。
    • LinkedHashSet:是HashSet的子类,在现有的数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序。即我们可以按照添加元素的顺序实现追历。便于频繁的查询操作。
  • TreeSet:底层使用红黑树存储。可以按照添加的元素的指定的属性的大小顺序进行遍历。

3. Set中无序性、不可重复性的理解(以HashSet及其子类为例说明)

1. 无序性!= 随机性。
添加元素的顺序与遍历元素的顺序不一致,是不是就是无序性呢? No!
到底什么是无序性?   与添加的元素的位置有关,不像ArrayList一样是依次紧密排列的。
这里是根据添加的元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的,表现为无序性。

2. 不可重复性,添加到Set中的元素是不能相同的。
比较的标准,需要判断hashCode()得到的哈希值以及equals()得到的boolean型的结果。
**哈希值相同且equals()返回true,则认为元素是相同的**

4. 添加到HashSet/LinkedHashSet中元素的要求

要求元素所在的类要重写两个方法:equals() 和 hashCode()同时,要求equals() 和 hashcode()要保持一致性!

package com.my.package01;

public class compare implements Comparable {
    private String name;
    private int age;

    public compare() {
    }

    public compare(String name, int age) {
        this.name = name;
        this.age = age;
    }

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

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

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

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

    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;

        compare compare = (compare) o;

        if (age != compare.age) return false;
        return name != null ? name.equals(compare.name) : compare.name == null;
    }

    @Override
    public int hashCode() {
        int result = name != null ? name.hashCode() : 0;
        result = 31 * result + age;
        return result;
    }
}
package com.my.package01;

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

public class compare_Test {
    public static void main(String[] args) {
        Set set = new HashSet();
        compare c1 = new compare("tom",16);
        compare c2 = new compare("James",18);
        compare c3 = new compare("James",18);
        compare c4 = new compare("jerry",19);

        set.add(c1);
        set.add(c2);
        set.add(c3);
        set.add(c4);

        Iterator iterator = set.iterator();
        while(iterator.hasNext()){
            System.out.println(iterator.next());
        }
    }
}