Java集合——9.使用Set
Java的Set集合
Set集合的特性和常用方法
Set最显著的特点就是元素不可重复,这一特性使其常被用于去重操作。常用方法如下:
boolean add(E e):向集合中添加元素,若元素已存在则返回falseboolean remove(Object e):从集合中删除元素,若元素不存在则返回falseboolean contains(Object e):判断集合中是否包含指定元素int size():返回集合中元素的数量
Set与Map的关系
从本质上来说,Set可以看作是只存储key而不存储value的Map。因此,放入Set的元素需要像Map的key一样,正确实现equals()和hashCode()方法,否则无法保证去重功能的正确性。
以最常用的HashSet为例,HashSet仅仅是对HashMap的一个简单封装,它的核心代码如下:
public class HashSet<E> implements Set<E> {
// 持有一个HashMap:
private HashMap<E, Object> map = new HashMap<>();
// 放入HashMap的value:
private static final Object PRESENT = new Object();
public boolean add(E e) {
return map.put(e, PRESENT) == null;
}
public boolean contains(Object o) {
return map.containsKey(o);
}
public boolean remove(Object o) {
return map.remove(o) == PRESENT;
}
}
常用的Set实现类
1. HashSet
HashSet是最常用的Set实现类,它具有以下特点:
- 基于哈希表实现
- 元素无序(遍历顺序与添加顺序无关)
- 查找、添加、删除操作效率高(时间复杂度为O(1))
2. TreeSet
TreeSet实现了SortedSet接口,它的特点是:
- 元素是有序的(按照自然顺序或自定义顺序)
- 基于红黑树实现
- 查找、添加、删除操作时间复杂度为O(log n)
使用TreeSet时,元素需要满足以下条件之一:
- 实现
Comparable接口,重写compareTo()方法 - 创建
TreeSet时传入Comparator对象
下面是TreeSet的简单示例:
import java.util.*;
public class TreeSetDemo {
public static void main(String[] args) {
Set<String> set = new TreeSet<>();
set.add("orange");
set.add("apple");
set.add("banana");
// 遍历输出时会按字母顺序排列
for (String s : set) {
System.out.println(s); // 输出apple, banana, orange
}
}
}
总结
Set用于存储不重复的元素,常用方法包括add()、remove()、contains()和size()HashSet基于哈希表实现,元素无序但性能优异TreeSet基于红黑树实现,元素有序但性能稍逊- 放入
Set的元素必须正确实现equals()和hashCode()方法 Set非常适合用于去重操作和需要判断元素是否存在的场景
Java集合——9.使用Set的更多相关文章
- Java集合专题总结(1):HashMap 和 HashTable 源码学习和面试总结
2017年的秋招彻底结束了,感觉Java上面的最常见的集合相关的问题就是hash--系列和一些常用并发集合和队列,堆等结合算法一起考察,不完全统计,本人经历:先后百度.唯品会.58同城.新浪微博.趣分 ...
- Scala集合和Java集合对应转换关系
作者:Syn良子 出处:http://www.cnblogs.com/cssdongl 转载请注明出处 用Scala编码的时候,经常会遇到scala集合和Java集合互相转换的case,特意mark一 ...
- java集合你了解多少?
用了java集合这么久,还没有系统的研究过java的集合结构,今天亲自画了下类图,总算有所收获. 一.所有集合都实现了Iterable接口. Iterable接口中包含一个抽象方法:Iterator& ...
- 深入java集合学习1-集合框架浅析
前言 集合是一种数据结构,在编程中是非常重要的.好的程序就是好的数据结构+好的算法.java中为我们实现了曾经在大学学过的数据结构与算法中提到的一些数据结构.如顺序表,链表,栈和堆等.Java 集合框 ...
- Java集合框架List,Map,Set等全面介绍
Java集合框架的基本接口/类层次结构: java.util.Collection [I]+--java.util.List [I] +--java.util.ArrayList [C] +- ...
- Java集合框架练习-计算表达式的值
最近在看<算法>这本书,正好看到一个计算表达式的问题,于是就打算写一下,也正好熟悉一下Java集合框架的使用,大致测试了一下,没啥问题. import java.util.*; /* * ...
- 【集合框架】Java集合框架综述
一.前言 现笔者打算做关于Java集合框架的教程,具体是打算分析Java源码,因为平时在写程序的过程中用Java集合特别频繁,但是对于里面一些具体的原理还没有进行很好的梳理,所以拟从源码的角度去熟悉梳 ...
- Java 集合框架
Java集合框架大致可以分为五个部分:List列表,Set集合.Map映射.迭代器.工具类 List 接口通常表示一个列表(数组.队列.链表 栈),其中的元素 可以重复 的是:ArrayList 和L ...
- Java集合概述
容器,是用来装东西的,在Java里,东西就是对象,而装对象并不是把真正的对象放进去,而是指保存对象的引用.要注意对象的引用和对象的关系,下面的例子说明了对象和对象引用的关系. String str = ...
- 深入java集合系列文章
搞懂java的相关集合实现原理,对技术上有很大的提高,网上有一系列文章对java中的集合做了深入的分析, 先转载记录下 深入Java集合学习系列 Java 集合系列目录(Category) HashM ...
随机推荐
- odoo14里面给所有模型添加方法
给所有的model都添加一个方法, 即所有的model都能调用[类似于create.write.unlink.read]. 方式一: from odoo import api, fields, mod ...
- 一文速通Python并行计算:11 Python多进程编程-进程之间的数据安全传输-基于队列和管道
一文速通 Python 并行计算:11 Python 多进程编程-进程之间的数据安全传输-基于队列和管道 摘要: Python 多进程中,Queue 和 Pipe 提供进程间安全通信.Queue 依赖 ...
- Java11 ThreadLocal的remove()方法源码分析
1. ThreadLocal实现原理 本文参考的java 版本是11. 在讲述ThreadLocal实现原理之前,我先来简单地介绍一下什么是ThreadLocal.ThreadLocal提供线程本地变 ...
- RabbitMQ单机&可能遇到的问题
1.Deployments 1 kind: Deployment 2 apiVersion: apps/v1 3 metadata: 4 name: rabbitmq-deployment 5 spe ...
- Java集合源码--ArrayList的可视化操作过程
关于ArrayList的元素插入.检索.修改.删除.扩容等可视化操作过程 还有关于ArrayList的迭代器.线程安全和时间复杂度 1. 底层数据结构 基于动态数组实现,内部维护一个Object[]数 ...
- GStreamer开发笔记(五):gstreamer创建组件、管道和总线实现简单的播放器
前言 前面是自动构建管道.本篇实例化每个元素并将它们链接在一起来手动构建一个管道. 本篇创建管道分为:创建组件,连接组件,获取总线,阻塞提取需要的消息并处理. Demo 管道图 ...
- KOL合作流程混乱?这11款工具让管理效率翻倍(附选型指南)
在内容营销成为品牌增长关键战场的今天,KOL(Key Opinion Leader,关键意见领袖)已不再只是"投广告"的对象,而是内容共创.品牌心智渗透.用户转化的核心资源.然而, ...
- 你了解CAS吗?有什么问题吗?如何解决?
什么是CAS? CAS全称Compare And Swap,比较与交换,是乐观锁的主要实现方式.CAS在不使用锁的情况下实现多线程之间的变量同步.ReentrantLock内部的AQS和原子类内部都使 ...
- 如何用 FastAPI 和 RBAC 打造坚不可摧的安全堡垒?
扫描二维码 关注或者微信搜一搜:编程智域 前端至全栈交流与成长 发现1000+提升效率与开发的AI工具和实用程序:https://tools.cmdragon.cn/ 一.FastAPI 安全认证与 ...
- Fortran77教程
Fortran77 教程