Set 接口基本介绍

Set接口是Collection接口的一个子接口,其主要特点如下:

  1. 不允许重复元素:Set接口的实现类不会包含重复的元素。更正式地说,不包含任何一对使得e1.equals(e2)成立的元素e1e2,并且最多只能有一个null元素。当尝试添加重复元素时,添加操作将被忽略。

  2. 无序性:Set接口取出元素的顺序和添加元素的顺序不一致(但是每次取出的顺序是固定的),即无法通过索引访问Set中的元素。

Set接口的常用实现类有HashSetTreeSetLinkedHashSet。可以使用迭代器和增强 for 循环遍历元素,但是不能使用普通 for 循环(不能使用索引)。下面的代码以其实现类HashSet演示Set接口的特点。

public class TestSet() {
public static void main(String[] args) {
Set set = new HashSet();
set.add("Phoebe");
set.add("Monica");
set.add("Phoebe"); // 重复
set.add("Ross");
set.add("Chandler");
set.add("Rachel");
set.add(null);
set.add(null); // 再次添加 null
// 10 次输出结果均为:set=[Phoebe, null, Rachel, Ross, Chandler, Monica]
// 重复的 Phoebe 和 null 都只输出了一个,
// 取出顺序和添加顺序不一致但每次取出顺序都是相同的。
for (int i = 0; i < 10; i++) {
System.out.println("set=" + set);
}
}
}

注意:如果Set集合的元素是可变对象时,必须要小心。如果以影响equals()方法比较结果的方式修改Set中的元素的值,集合的行为是未指定的。这种情况的特例是Set不能将自身作为元素。以下以一个简单的 Person 类来测试修改HashSet中元素的值使得两个元素equals()方法比较结果相同时的情况。

public class Person {
private String name; public Person() {
} public Person(String name) {
this.name = name;
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} @Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Person person = (Person) o;
return name.equals(person.name);
} @Override
public int hashCode() {
return Objects.hash(name);
} @Override
public String toString() {
return "Person{" +
"name='" + name + '\'' +
'}';
}
}
public class TestModifyValue() {
public static void main(String[] args) {
Set set = new HashSet(); // 创建 3 个 Person 实例,其中 rose1.equals(rose2) 成立
Person jack = new Person("Jack");
Person rose1 = new Person("Rose");
Person rose2 = new Person("Rose");
// 将其添加到 set 中
set.add(jack);
set.add(rose1);
set.add(rose2); // 可以看到只添加成功一个姓名为 Rose 的 Person 实例,其应为 rose1。
System.out.println("set = " + set); // set = [Person{name='Rose'}, Person{name='Jack'}] // 将 set 添加到自身中,未添加成功
set.addAll(set);
System.out.println("set = " + set); // set = [Person{name='Rose'}, Person{name='Jack'}] // 将 rose1 的 name 属性修改为 Jack
rose1.setName("Jack");
System.out.println(rose1.equals(jack)); // true
// 可以看到此时 set 集合中仍有两个对象,其 equals() 方法比较结果相同。
System.out.println("set = " + set); // set = [Person{name='Jack'}, Person{name='Jack'}]
}
}

Set 接口常用方法

Set接口和List接口一样,也是Collection接口的子接口,因此常用方法和Collection接口一样。但需要注意由于Set接口不包含重复元素,所以addAll()方法的参数也是Set时,addAll操作会有效地修改该集合,使其值为两个集合的并集

public class SetAddAll() {
public static void main(String[] args) {
Set set = new HashSet();
set.add("Phoebe");
set.add("Monica");
set.add("Ross");
System.out.println("set = " + set); // set = [Phoebe, Ross, Monica] Set set1 = new HashSet();
set1.add("Phoebe");
set.add("Chandler"); set.addAll(set1);
System.out.println("set = " + set); // set = [Phoebe, Ross, Chandler, Monica]
}
}

Set 接口遍历元素方式

Set接口遍历元素的方式和Collection接口的一样,可以使用迭代器和增强 for 循环来遍历元素,但不能通过索引的方式来遍历元素。

public class SetThroughElements() {
public static void main(String[] args) {
Set set = new HashSet();
set.add("Phoebe");
set.add("Monica");
set.add("John"); System.out.println("---使用迭代器---");
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
Object obj = iterator.next();
System.out.println("obj = " + obj);
} System.out.println("---使用增强 for---");
for (Object o :set) {
System.out.println("o = " + o);
} // 不能使用普通 for 循环,因为 Set 不支持索引
}
}

Set 接口及其常用方法的更多相关文章

  1. java中集合类中Collection接口中的Map接口的常用方法熟悉

    1:Map接口提供了将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.Map接口中同样提供了集合的常用方法. 2:由于Map集合中的元素是通过key,value,进行存储的,要 ...

  2. java中集合类中Collection接口中的Set接口的常用方法熟悉

    1:Set集合由Set接口和Set接口的实现类组成,Set接口继承了Collection接口,因为包含Collection接口的所有方法. 2:由于Set接口中不允许存在重复值,因此可以使用Set集合 ...

  3. java中集合类中Collection接口中的List接口的常用方法熟悉

    1:集合类,在java语言中的java.util包提供了一些集合类,这些集合类又被称作容器. 2:区别集合类和数组.(1)数组的长度是固定的,集合的长度是可变的.(2)数组是用来存放基本数据类型的,集 ...

  4. 集合概述及Collection接口的常用方法

    java集合像是一种容器,可以动态的把多个对象的引用放到容器中 java的集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组 package com.aff.coll; imp ...

  5. JAVAEE_Servlet_14_HttpServletRequest接口以及常用方法(一)

    HttpServletRequest接口 * javax.servlet.http.HttpServletRequest 接口 * 继承关系 HttpServletRequest---继承---> ...

  6. Collection接口的常用方法

    [添加功能] boolean add(Object obj); //添加一个元素. boolean addAll(Collection c); //添加一个集合的元素(在后面追加). [删除功能] v ...

  7. Python 接口自动化常用方法封装

    #!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...

  8. Java集合框架的四个接口

    接口 [四个接口  collection  list  set  map 的区别] collection 存储不唯一的无序的数据 list 存储有序的不唯一的数据 set   存储无序的唯一的数据 m ...

  9. Java集合框架之四大接口、常用实现类

    Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...

  10. java内部类、接口、集合框架、泛型、工具类、实现类

    .t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...

随机推荐

  1. IIC总线协议—读写EEPROM

    IIC总线协议-读写EEPROM 1.I2C简介 I2C 通讯协议(Inter-Integrated Circuit)是由Phiilps公司开发的,由于它引脚少,硬件实现简单,可扩展性强,不需要USA ...

  2. Generative Pre-trained Transformer(GPT)模型技术初探

    一.Transformer模型 2017年,Google在论文 Attention is All you need 中提出了 Transformer 模型,其使用 Self-Attention 结构取 ...

  3. 论文解读(PAWS)《Semi-Supervised Learning of Visual Features by Non-Parametrically Predicting View Assignments with Support Samples》

    论文信息 论文标题:Semi-Supervised Learning of Visual Features by Non-Parametrically Predicting View Assignme ...

  4. 从源码角度分析ScheduleMaster的节点管理流程

    ScheduleMaster是一个开源的分布式任务调度系统,它基于.NET Core 3.1平台构建,支持跨平台多节点部署运行. 项目主页:https://github.com/hey-hoho/Sc ...

  5. day03-商家查询缓存02

    功能02-商铺查询缓存02 知识补充 (1)缓存穿透 https://blog.csdn.net/qq_45637260/article/details/125866738 缓存穿透(cache pe ...

  6. RTP分包模式(H264/H265)

    在rfc6184-h264文档5.4章节有详细说明.以及rfc7798-h265文档4.2章节中也有部分介绍. 一.NALU Header ● H264 NALU Header(1 byte)结构图如 ...

  7. Python学习——Juptyer Notebook快捷键的使用

    1. 运行当前Cell:Ctrl + Enter 2. 运行当前Cell并在其下方插入一个新的Cell:Alt + Enter 3. 运行当前Cell并选中其下方的Cell:Shift + Enter ...

  8. GPT护理机器人 - 让护士的工作变简单

    引子 书接上文<GPT接入企微应用 - 让工作快乐起来>,我把GPT接入了企微应用,不少同事都开始尝试起来了.有的浅尝辄止,有的刨根问底,五花八门,无所不有.这里摘抄几份: "帮 ...

  9. 2023 Hubei Provincial Collegiate Programming Contest题解 C F H I J K M

    补题链接:https://codeforces.com/gym/104337 原文链接:https://www.eriktse.com/algorithm/1136.html M. Different ...

  10. MySQL百万数据深度分页优化思路分析

    业务场景 一般在项目开发中会有很多的统计数据需要进行上报分析,一般在分析过后会在后台展示出来给运营和产品进行分页查看,最常见的一种就是根据日期进行筛选.这种统计数据随着时间的推移数据量会慢慢的变大,达 ...