Set接口及实现类

1. 概述

在这里插入图片描述
Set接口中元素无序,并且都会以某种规则保证存入的元素不出现重复

特点

  1. 不允许存储重复的元素
  2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
  3. Set集合取出元素的方式可以采用:迭代器、增强for。普通for不行!

Set集合有多个子类,这里我们介绍其中的HashSetLinkedHashSet这两个集合。

2. HashSet集合

在这里插入图片描述
java.util.HashSetSet接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。java.util.HashSet底层的实现其实是一个java.util.HashMap支持.

优点

  • 具有良好的存取和查找性能:HashSet是根据对象的哈希值来确定元素在集合中的存储位置。
  • 元素唯一性:依赖于:hashCodeequals方法。

特点

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

代码:

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

public class Demo01Set {
    public static void main(String[] args) {
        Set<Integer> set = new HashSet<>();
        set.add(1);
        set.add(2);
        set.add(3);
        set.add(1);
        // 使用迭代器遍历set集合【不能用for循环,因为没有索引】
        Iterator<Integer> it = set.iterator();
        while(it.hasNext()) {
            Integer n = it.next();
            System.out.println(n);  // 123
        }
        System.out.println("=========================");
        // 增强for遍历集合
        for (Integer i : set) {  // set.for
            System.out.println(i);
        }
    }
}

结果:

根据结果我们发现数字1只存储了一个,也就是说重复的元素set集合不存储。

1
2
3
=========================
1
2
3

3. HashSet存储自定义类型元素

若想在HashSet集合中存放自定义的对象,那么想要保证其唯一,就必须重写hashCode和equals方法建立属于当前对象的比较方式。

必须重写hashCode和equals方法

创建自定义Person类

import java.util.Objects;

public class Person {
    private String name;
    private int 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);
    }

    //省略getterandsetter方法和构造器
}

测试类

public class Demo03HashSetSavePerson {
    public static void main(String[] args) {
        // 创建HashSet集合存储Person
        HashSet<Person> set = new HashSet<>();
      
        Person p1 = new Person("小明",18);  
        Person p2 = new Person("小明",18); 
        Person p3 = new Person("小明",19);

        System.out.println(p1.hashCode()); 
        System.out.println(p2.hashCode());  
        System.out.println("=================");

        System.out.println(p1 == p2);
        System.out.println(p1.equals(p2));  // 重写equals之前比较的是地址值
        System.out.println("=================");

        set.add(p1);
        set.add(p2);
        set.add(p3);
        System.out.println(set);
        // 遍历
        for (Person p : set) {
            System.out.println(p);
        }
    }
}

结果:

  • 未重写:
1355531311
1967205423
42121758
=================
false
false
=================
com.luis.demo03.Set.Person@50cbc42f
com.luis.demo03.Set.Person@282ba1e
com.luis.demo03.Set.Person@75412c2f
  • 重写后:
23458772
23458772
23458773
=================
false
true
=================
com.luis.demo03.Set.Person@165f3d5
com.luis.demo03.Set.Person@165f3d4

4. LinkedHashSet集合

在HashSet下面有一个子类java.util.LinkedHashSet,它是**链表和哈希表(数组+链表/红黑树)**组合的一个数据存储结构。可保证集合元素的有序。

演示代码如下:

import java.util.HashSet;
import java.util.LinkedHashSet;

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("itcast");

        System.out.println(set);  // [abc, www, itcast] 无序的,不允许重复
        System.out.println("==============");

        LinkedHashSet<String> linked = new LinkedHashSet<>();
        linked.add("www");
        linked.add("abc");
        linked.add("abc");
        linked.add("itcast");

        System.out.println(linked);  // [www, abc, itcast]  有序的,不允许重复
    }
}

结果:

[abc, www, itcast]
==================
[www, abc, itcast]
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 的 Collection 接口是一个顶层接口,它是 List、Set 和 Queue 接口的父接口。它定义了一些通用的方法,可以应用于所有集合,如添加、删除、遍历等操作。下面是 Collection 接口的主要方法: - boolean add(E e):将指定的元素添加到集合,如果添加成功则返回 true,否则返回 false。 - boolean remove(Object o):从集合删除指定的元素,如果删除成功则返回 true,否则返回 false。 - boolean contains(Object o):判断集合是否包含指定的元素,如果包含则返回 true,否则返回 false。 - boolean isEmpty():判断集合是否为空,如果为空则返回 true,否则返回 false。 - int size():返回集合元素的个数。 - void clear():清空集合的所有元素。 - Object[] toArray():将集合转换为数组。返回包含集合所有元素的数组。 Java 常用的 Collection 实现有 ArrayList、LinkedList、HashSet、TreeSet、HashMap 和 TreeMap 等。其 ArrayList、LinkedList 和 HashSet 是最常用的三种实现。 - ArrayList:基于动态数组实现,支持随机访问和快速插入、删除操作。 - LinkedList:基于双向链表实现,支持在任意位置插入、删除元素,但访问元素时需要遍历整个链表,效率较低。 - HashSet:基于哈希表实现无序集合,不允许重复元素。 - TreeSet:基于红黑树实现,有序集合,不允许重复元素。 - HashMap:基于哈希表实现无序键值对,key 不允许重复。 - TreeMap:基于红黑树实现,有序键值对,key 不允许重复。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值