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)成员内部类的实例化: 外部类名.内部类 ...
随机推荐
- 内网搭建DNS服务器
DNS:Domain Name Service,域名解析服务 监听端口:udp/53,tcp/53 应用程序:bind 根域:. 一级域: 组织域:.com, .org, .net, .mil, .e ...
- JS引擎(2):Java平台上JavaScript引擎—Rhino/Nashorn概述
可以后端开发的 javascript引擎有 Chrome V8 基于C++ java的Rhino引擎(JDK6被植入),Java8 被替换为Nashorn Rhino和Nashorn都是用Java实现 ...
- systemctl 命令设置开机自启动失败
哈喽大家好,我是咸鱼.今天跟大家分享一个关于 Linux 服务(service)相关的案例 案例现象 我在 3 月 31日的时候发表了一篇<shell 脚本之一键部署安装 Nginx> ...
- LeeCode 二叉树问题(三)
二叉树的应用问题 LeeCode 222: 完全二叉树的节点个数 题目描述 给你一棵 完全二叉树 的根节点 root,求出该树的节点个数. 完全二叉树的定义 除最底层节点可能没填满外,其余每层节点树都 ...
- day25:7个魔术方法&5个关于类的魔术属性
目录 1.__del__(析构方法) 2.魔术方法:__str__ 3.魔术方法:__repr__ 4.魔术方法:__call__ 5.魔术方法:__bool__ 6.魔术方法:__add__& ...
- 部署:mysql搭建多主一从源复制环境
问题描述:搭建过一主多从的环境,由于数据库数据一致性要求高,有些情景会搭建一主多从的架构,搭建多主一从的模式,相对来说适合数据整合,将多个业务的库整合到一起,方便做查询,也可以当做一个监控其他主库数据 ...
- TiDB在科捷物流神州金库核心系统的应用与实践
导读:在经过了近半年的测试验证和迁移准备之后,神州金库3.0核心系统 WMS 正式从 MySQL 迁移到了分布式 HTAP 数据库 TiDB,上线后不久即经历了第一次双11的考验,TiDB的性能和稳定 ...
- Spring源码系列:核心概念解析
前言 本文旨在为读者解析Spring源码中的关键类,以便读者在深入阅读源码时,能够了解关键类的作用和用途.在阅读Spring源码时,经常会遇到一些不熟悉的概念,了解关键类的作用可以帮助读者更好地理解这 ...
- 前端获取后端设置的自定义头,前端获取不到后端设置的response headers
需要后端设置 Access-Control-Expose-Headers 例如:后端在返回头中设置 user-name: 张三 但是前端直接response.headers['user-name']是 ...
- oss/obs对象存储上传图片,在浏览器输入地址却是下载图片。不能直接在浏览器上查看。
1.问题oss/obs对象存储上传图片获取链接地址后,在浏览器输入地址却是下载.不能直接在浏览器上面浏览图片信息.2.解决上传文件的时候需要设置:content-type类型,需要指示浏览器这是什么类 ...