一、Set介绍

Set是集合体系中较为重要的接口,它具有单列存储的特点,即一次只能添加一个元素。它具有三大特点:
不可重复:当存入相同的数据时,重复的元素将会被自动去除,集合中不会有重复的值。
存取顺序不一致:存入数据的顺序与输出数据的顺序不一定一致。
没有带索引方法:无法使用普通for循环来遍历输出Set集合。
由于Set是一个接口,因此我们在创建Set对象时必须指定其实现类,其常用的实现类有HashSet和TreeSet。

接下来我们将结合代码来具体学习Set相关知识。

二、Set常用方法 Set应知应会

Set作为接口,它最常见的实现类是HashSet和TreeSet,作为接口它抽取了所有实现类的共有方法,所有实现Set接口的实现类均可使用这些方法。例如HashSet和TreeSet均可使用如下共有方法。

方法名说明
boolean add(E e)添加元素
boolean remove(Object o)从集合中移除指定的元素
void clear()清空集合中的元素
boolean contains(Object o)判断集合中是否存在指定的元素
boolean isEmpty()判断集合是否为空
int size()集合的长度,也就是集合中元素的个数

2.1 调用add()方法增添数据

具体实现类为HashSet的Set

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhaoliu");
        //普通输出
        System.out.println(set);
    }

运行结果:
在这里插入图片描述


具体实现类为TreeSet的Set

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为TreeSet
        Set<String> set=new TreeSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhaoliu");
        //普通输出
        System.out.println(set);
    }

运行结果:
在这里插入图片描述


2.2 调用remove()方法删除数据

接下来我们就以实现类为HashSet的Set来具体举例

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhaoliu");
        //调用remove()方法删除数据
        set.remove("zhangsan");
        //普通输出
        System.out.println(set);
    }

运行结果:
在这里插入图片描述


2.3 调用clear()方法清空数据

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhaoliu");
        //调用clear()方法清空数据
        set.clear();
        //普通输出
        System.out.println(set);
    }

运行结果:
在这里插入图片描述


2.4 调用contains()方法判断集合中是否存在指定的元素

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhaoliu");
        //调用contains()方法判断集合中是否存在指定的元素
        boolean aoao = set.contains("aoao");
        System.out.println(aoao);

        boolean aoAo = set.contains("AoAo");
        System.out.println(aoAo);
    }

运行结果:
在这里插入图片描述


2.5 调用isEmpty()方法判断集合是否为空

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhaoliu");
        //调用isEmpty()方法判断集合是否为空
        boolean empty = set.isEmpty();
        System.out.println(empty);

        //调用clear()方法清空集合数据
        set.clear();

        //调用isEmpty()方法判断集合是否为空
        boolean empty1 = set.isEmpty();
        System.out.println(empty1);
    }

运行结果:
在这里插入图片描述


2.6 调用size()方法获取集合的长度

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("zhangsan");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhaoliu");
        //调用size()方法获取集合的长度
        int size = set.size();
        System.out.println(size);
    }

运行结果:
在这里插入图片描述


三、Set不可重复特点

我们增添两个aoao和两个daidai数据

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("aoao");
        set.add("lisi");
        set.add("wangwu");
        set.add("daidai");
        //普通输出
        System.out.println(set);
    }

运行结果:(我们看到多余的aoao与daidai被筛掉了
在这里插入图片描述


四、Set存取顺序不一致

存取顺序不一致:输出的顺序与输入的顺序不一定一致,此即为存取顺序不一致,并不是一定不一致。

4.1 情况:输入顺序与输出顺序不一致

我们存入数据的顺序是aoao,daidai,bobo,lisi,wangwu,zhangsan

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aoao");
        set.add("daidai");
        set.add("bobo");
        set.add("lisi");
        set.add("wangwu");
        set.add("zhangsan");
        //普通输出
        System.out.println(set);
    }

运行结果:(我们看到输出的顺序是aoao,lisi,bobo,zhangsan,wangwu,daidai
在这里插入图片描述


4.2 情况:输入顺序与输出顺序一致

我们存入数据的顺序是aa,bb,cc,dd,ee,ff

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aa");
        set.add("bb");
        set.add("cc");
        set.add("dd");
        set.add("ee");
        set.add("ff");
        //普通输出
        System.out.println(set);
    }

运行结果:(我们看到输出的顺序是aa,bb,cc,dd,ee,ff
在这里插入图片描述


五、Set没有带索引的方法

因为Set没有带索引的方法,因此遍历Set集合时只能使用普通输出语句,forEach语句和Iterator迭代器

5.1 普通输出语句输出Set集合

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aa");
        set.add("bb");
        set.add("cc");
        set.add("dd");
        set.add("ee");
        set.add("ff");
        //普通输出
        System.out.println(set);
    }

运行结果:
在这里插入图片描述


5.2 forEach语句输出Set集合

public static void main(String[] args) {
        //创建一个数据类型为String的Set对象,并指明其实现类为HashSet
        Set<String> set=new HashSet<>();
        //调用add()方法增添数据
        set.add("aa");
        set.add("bb");
        set.add("cc");
        set.add("dd");
        set.add("ee");
        set.add("ff");
        //forEach语句输出Set集合
        //由于Set集合的数据类型为String,因此s的数据类型为String
        //其中s即为set的复用名,相当于set
        for (String s : set) {
            System.out.println(s);
        }
    }

运行结果:
在这里插入图片描述


当然我们也可以使用其他数据类型来创建Set对象,并用forEach()语句

public static void main(String[] args) {
        //创建一个数据类型为Character的Set对象,并指明其实现类为HashSet
        Set<Character> set=new HashSet<Character>();
        //调用add()方法增添数据
        set.add('a');
        set.add('b');
        set.add('v');
        set.add('d');
        set.add('e');
        set.add('z');
        //forEach语句输出Set集合
        //由于Set集合的数据类型为Character,因此c的数据类型为Character
        //其中c即为set的复用名,相当于set
        for (Character c : set) {
            System.out.println(c);
        }
    }

运行结果:
在这里插入图片描述


5.3 Iterator迭代器输出Set集合

public static void main(String[] args) {
        //创建一个数据类型为Character的Set对象,并指明其实现类为HashSet
        Set<Character> set=new HashSet<Character>();
        //调用add()方法增添数据
        set.add('a');
        set.add('b');
        set.add('v');
        set.add('d');
        set.add('e');
        set.add('z');
        //Iterator迭代器输出Set集合
        //由于Set的数据类型为Character,因此Iterator的数据类型也为Character
        Iterator<Character> iterator=set.iterator();
        //iterator.hasNext()的作用是判断当前位置是否存在元素,若存在元素则为true,否则为false
        while(iterator.hasNext()){
            //iterator.next()的作用是获取当前位置元素,之后指向下一个位置
            System.out.println(iterator.next());
        }
    }

运行结果:
在这里插入图片描述


OK!!!Set介绍结束!!!

Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐