Set 接口及其常用方法
Set 接口基本介绍
Set接口是Collection接口的一个子接口,其主要特点如下:
不允许重复元素:
Set接口的实现类不会包含重复的元素。更正式地说,不包含任何一对使得e1.equals(e2)成立的元素e1和e2,并且最多只能有一个null元素。当尝试添加重复元素时,添加操作将被忽略。无序性:
Set接口取出元素的顺序和添加元素的顺序不一致(但是每次取出的顺序是固定的),即无法通过索引访问Set中的元素。
Set接口的常用实现类有HashSet、TreeSet和LinkedHashSet。可以使用迭代器和增强 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 接口及其常用方法的更多相关文章
- java中集合类中Collection接口中的Map接口的常用方法熟悉
1:Map接口提供了将键映射到值的对象.一个映射不能包含重复的键:每个键最多只能映射到一个值.Map接口中同样提供了集合的常用方法. 2:由于Map集合中的元素是通过key,value,进行存储的,要 ...
- java中集合类中Collection接口中的Set接口的常用方法熟悉
1:Set集合由Set接口和Set接口的实现类组成,Set接口继承了Collection接口,因为包含Collection接口的所有方法. 2:由于Set接口中不允许存在重复值,因此可以使用Set集合 ...
- java中集合类中Collection接口中的List接口的常用方法熟悉
1:集合类,在java语言中的java.util包提供了一些集合类,这些集合类又被称作容器. 2:区别集合类和数组.(1)数组的长度是固定的,集合的长度是可变的.(2)数组是用来存放基本数据类型的,集 ...
- 集合概述及Collection接口的常用方法
java集合像是一种容器,可以动态的把多个对象的引用放到容器中 java的集合类可以用于存储数量不等的多个对象,还可以用于保存具有映射关系的关联数组 package com.aff.coll; imp ...
- JAVAEE_Servlet_14_HttpServletRequest接口以及常用方法(一)
HttpServletRequest接口 * javax.servlet.http.HttpServletRequest 接口 * 继承关系 HttpServletRequest---继承---> ...
- Collection接口的常用方法
[添加功能] boolean add(Object obj); //添加一个元素. boolean addAll(Collection c); //添加一个集合的元素(在后面追加). [删除功能] v ...
- Python 接口自动化常用方法封装
#!/usr/bin/env python # -*- coding:utf-8 -*- # ************************************* # @Time : 2019/ ...
- Java集合框架的四个接口
接口 [四个接口 collection list set map 的区别] collection 存储不唯一的无序的数据 list 存储有序的不唯一的数据 set 存储无序的唯一的数据 m ...
- Java集合框架之四大接口、常用实现类
Java集合框架 <Java集合框架的四大接口> Collection:存储无序的.不唯一的数据:其下有List和Set两大接口. List:存储有序的.不唯一的数据: Set:存储无序的 ...
- java内部类、接口、集合框架、泛型、工具类、实现类
.t1 { background-color: #ff8080; width: 1100px; height: 40px } 一.内部类 1.成员内部类. (1)成员内部类的实例化: 外部类名.内部类 ...
随机推荐
- proprety详解
property() 函数和@property修饰符. 第一种方法,使用property() 函数: class Person: def __init__(self): self.__name= No ...
- 简单的cs修改器
目录 各个函数解析 main() GetPid() 无限子弹 无限血 无限金币 Patch() 无僵直 稳定射击 Depatch1 手枪连发 Depatch 源代码部分 各个函数解析 这是我根据b站上 ...
- 用Abp实现两步验证(Two-Factor Authentication,2FA)登录(二):Vue网页端开发
@ 目录 发送验证码 登录 退出登录 界面控件 获取用户信息功能 项目地址 前端代码的框架采用vue.js + elementUI 这套较为简单的方式实现,以及typescript语法更方便阅读. 首 ...
- classmethod和staticmethod装饰器
""" 两个装饰器 @classmethod 把一个对象绑定的方法,修改成为一个类方法 1.在方法中仍然可以引用类中的静态变量 2.可以不用实例化对象,就直接使用类名在外 ...
- 从零开始配置深度学习环境:CUDA+Anaconda+Pytorch+TensorFlow
本文适用于电脑有GPU(显卡)的同学,没有的话直接安装cpu版是简单的.CUDA是系统调用GPU所必须的,所以教程从安装CUDA开始. CUDA安装 CUDA是加速深度学习计算的工具,诞生于NVIDI ...
- vue3.0
https://www.yuque.com/gdnnth/vue-v3 http://www.liulongbin.top:8085/#/ https://www.yuque.com/woniuppp ...
- rfc7234之http缓存
声明:本人原创文章,详细内容已发布在我的微信个人技术公众号---网络技术修炼,公众号总结普及网络基础知识,包括基础原理.网络方案.开发经验和问题定位案例等,欢迎关注. 缓存概念 缓存处理请求步骤 缓存 ...
- ET–异步协程使用–TimerComponent篇
之前可能也有群友写过一些关于ET框架中TimerComponent的使用教程,我这里写下关于TimerComponent的常规使用跟一些不常规使用的方法以及一些情况下需要使用到的不同的函数. 先来看看 ...
- 2020-08-21:网络IO模型有哪些?
福哥答案2020-08-21: 福哥口诀法:阻非复信异(阻塞.非阻塞.多路复用.信号驱动.异步) [知乎答案](https://www.zhihu.com/question/416128059)操作系 ...
- 2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量。
2021-03-20:给定一个二维数组matrix,其中的值不是0就是1,返回全部由1组成的子矩形数量. 福大大 答案2021-03-20: 按行遍历二维数组,构造直方图. 单调栈,大压小.有代码. ...