Set实现类

1、HashSet。

1、基于HashCode来计算元素存储位置。

2、当存入的元素HashCode相同时,会调用equals方法进行确认,如果为true,则代表已经存在相同元素,则拒绝存入。

 

特点

1、基于HashMap实现,不允许元素重复。

2、允许存在null值,但只能有一个null值。

3、无序,因为会根据HasCode重新计算元素位置。

4、线程不安全。

5、实现了Set接口。

实例化HashSet对象

HashSet<String> hashSet = new HashSet<>();

添加元素

hashSet.add("苹果");
hashSet.add("橘子");
hashSet.add("香蕉");

删除元素

hashSet.remove("苹果");

清空元素

hashSet.clear();

遍历元素

        //1、foreach
        for (String str : hashSet) {
            System.out.println(str);
        }
        //2、Iterator迭代器
        Iterator<String> iterator = hashSet.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }

HashSet中的判断

System.out.println("判断集合是否包含元素:" + hashSet.contains("苹果"));
System.out.println("判断集合是否为空:" + hashSet.isEmpty());

 

创建一个User类

public class User implements Serializable {

    private String name;

    private int age;

    public User(String name, int age) {
        this.name = name;
        this.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;
    }

    @Override
    public String toString() {
        return "User{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
}
HashSet<User> userHashSet = new HashSet<>();
userHashSet.add(new User("小明", 18));
userHashSet.add(new User("小明", 18));
System.out.println("userHashSet:" + userHashSet);

输出结果:userHashSet:[User{name='小明', age=18}, User{name='小明', age=18}]

这时我们会发现他们的名称和年龄都是相同的,却还是添加成功了。原因是在使用equals方法比较时他们的地址引用是不同的,如果想要比较具体的值我们就需要去重写它的hashCode方法和equals方法。

 

 

@Override
    public int hashCode() {
        //因为String和Integer已经重写了HashCode,所以可以直接使用String的HashCode方法。
        int num1 = this.name.hashCode();
        int num2 = this.age.hashCode();
        return num1 + num2;
    }

    @Override
    public boolean equals(Object obj) {
        //比较是否是同一个对象
        if (this == obj) {
            return true;
        }
        //判断obj是否是User对象
        if (obj instanceof User) {
            User u = (User) obj;
            if (this.name == u.name && this.age == u.age) {
                return true;
            }
        }
        return false;
    }

再次运行,输出结果:userHashSet:[User{name='小明', age=18}]。remove方法也是一样。

2、TreeSet。

1、基于排序顺序实现元素不重复。

2、实现了SortedSet接口,对元素自动排序。

3、元素对象的类型必须实现Comparable接口,制定排序规则。

4、通过ComparTo方法判断元素是否重复。

特点

1、底层使用TreeMap保存元素。

2、线程不安全。可以使用下面的语句实现线程安全。
SortedSet s = Collections.synchronizedSortedSet(new TreeSet(...));

3、不允许null值。

4、底层使用红黑树结构。

5、fail-fast机制。

 

实例化TreeSet对象

TreeSet<String> treeSet = new TreeSet();

添加元素

        treeSet.add("1");
        treeSet.add("3");
        treeSet.add("2");
        treeSet.add("2");
        System.out.println(treeSet);
        //打印结果:[1, 2, 3]。
        // TreeSet底层实现了Set接口,所以不允许元素重复。
        // TreeSet底层实现了SortedSet接口,会自动进行排序。如果是数值类型则是按照从小到大的顺序排列。如果是字符类型会根据字典表进行排序。

删除元素

treeSet.remove("1");

清空元素

treeSet.clear();

遍历元素

        //1、使用foreach
        for (String str : treeSet) {
            System.out.println(str);
        }
        //使用迭代器Iterator
        Iterator iterator = treeSet.iterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.next());
        }
posted @ 2022-12-16 05:10  Amireux-126  阅读(107)  评论(0)    收藏  举报