java keysetview,Set——你真的了解吗?

JAVA 基础 :Set——你真的了解吗?

简述

Set 继承于 Collection ,是一种集合。有元素无序、值不重复、不允许空值得特性。主要有HashSet、TreeSet两种实现方式。由于Set主要基于Map实现,所以特点也由Map决定。

d76a04786000

Set 结构图

例如 HashSet ,调用 HashSet 的无参构造函数,HashSet 会使用默认的 HashMap ,初始化 Size 为16,扩张系数为0.75

HashSet

d76a04786000

官方文档

d76a04786000

官方文档翻译

d76a04786000

构造方法官方文档

d76a04786000

构造方法官方文档翻译

d76a04786000

HashSet 结构图

查看 HashSet 源码会发现主要数据操作都间接调用 HashMap 的数据操作,从 add() 方法可以看出 HashSet 的值其实为 HashMap 的 Key,而 Value 是一个关键字为 final 类型为 Object 的 PRESENT ,遍历的 HashSet 的值其实是遍历 HashMap 的 KeyEntry .

HashSet 源码

public class HashSet

extends AbstractSet

implements Set, Cloneable, java.io.Serializable

{

static final long serialVersionUID = -5024744406713321676L;

private transient HashMap map;

// Dummy value to associate with an Object in the backing Map

private static final Object PRESENT = new Object();

/**

* Constructs a new, empty set; the backing HashMap instance has

* default initial capacity (16) and load factor (0.75).

*/

public HashSet() {

map = new HashMap<>();

}

/**

* Constructs a new set containing the elements in the specified

* collection. The HashMap is created with default load factor

* (0.75) and an initial capacity sufficient to contain the elements in

* the specified collection.

*

* @param c the collection whose elements are to be placed into this set

* @throws NullPointerException if the specified collection is null

*/

public HashSet(Collection extends E> c) {

map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));

addAll(c);

}

/**

* Constructs a new, empty set; the backing HashMap instance has

* the specified initial capacity and the specified load factor.

*

* @param initialCapacity the initial capacity of the hash map

* @param loadFactor the load factor of the hash map

* @throws IllegalArgumentException if the initial capacity is less

* than zero, or if the load factor is nonpositive

*/

public HashSet(int initialCapacity, float loadFactor) {

map = new HashMap<>(initialCapacity, loadFactor);

}

/**

* Constructs a new, empty set; the backing HashMap instance has

* the specified initial capacity and default load factor (0.75).

*

* @param initialCapacity the initial capacity of the hash table

* @throws IllegalArgumentException if the initial capacity is less

* than zero

*/

public HashSet(int initialCapacity) {

map = new HashMap<>(initialCapacity);

}

/**

* Constructs a new, empty linked hash set. (This package private

* constructor is only used by LinkedHashSet.) The backing

* HashMap instance is a LinkedHashMap with the specified initial

* capacity and the specified load factor.

*

* @param initialCapacity the initial capacity of the hash map

* @param loadFactor the load factor of the hash map

* @param dummy ignored (distinguishes this

* constructor from other int, float constructor.)

* @throws IllegalArgumentException if the initial capacity is less

* than zero, or if the load factor is nonpositive

*/

HashSet(int initialCapacity, float loadFactor, boolean dummy) {

map = new LinkedHashMap<>(initialCapacity, loadFactor);

}

/**

* Returns an iterator over the elements in this set. The elements

* are returned in no particular order.

*

* @return an Iterator over the elements in this set

* @see ConcurrentModificationException

*/

public Iterator iterator() {

return map.keySet().iterator();

}

/**

* Returns the number of elements in this set (its cardinality).

*

* @return the number of elements in this set (its cardinality)

*/

public int size() {

return map.size();

}

/**

* Returns true if this set contains no elements.

*

* @return true if this set contains no elements

*/

public boolean isEmpty() {

return map.isEmpty();

}

/**

* Returns true if this set contains the specified element.

* More formally, returns true if and only if this set

* contains an element e such that

* (o==null ? e==null : o.equals(e)).

*

* @param o element whose presence in this set is to be tested

* @return true if this set contains the specified element

*/

public boolean contains(Object o) {

return map.containsKey(o);

}

/**

* Adds the specified element to this set if it is not already present.

* More formally, adds the specified element e to this set if

* this set contains no element e2 such that

* (e==null ? e2==null : e.equals(e2)).

* If this set already contains the element, the call leaves the set

* unchanged and returns false.

*

* @param e element to be added to this set

* @return true if this set did not already contain the specified

* element

*/

public boolean add(E e) {

return map.put(e, PRESENT)==null;

}

/**

* Removes the specified element from this set if it is present.

* More formally, removes an element e such that

* (o==null ? e==null : o.equals(e)),

* if this set contains such an element. Returns true if

* this set contained the element (or equivalently, if this set

* changed as a result of the call). (This set will not contain the

* element once the call returns.)

*

* @param o object to be removed from this set, if present

* @return true if the set contained the specified element

*/

public boolean remove(Object o) {

return map.remove(o)==PRESENT;

}

/**

* Removes all of the elements from this set.

* The set will be empty after this call returns.

*/

public void clear() {

map.clear();

}

/**

* Returns a shallow copy of this HashSet instance: the elements

* themselves are not cloned.

*

* @return a shallow copy of this set

*/

@SuppressWarnings("unchecked")

public Object clone() {

try {

HashSet newSet = (HashSet) super.clone();

newSet.map = (HashMap) map.clone();

return newSet;

} catch (CloneNotSupportedException e) {

throw new InternalError(e);

}

}

/**

* Save the state of this HashSet instance to a stream (that is,

* serialize it).

*

* @serialData The capacity of the backing HashMap instance

* (int), and its load factor (float) are emitted, followed by

* the size of the set (the number of elements it contains)

* (int), followed by all of its elements (each an Object) in

* no particular order.

*/

private void writeObject(java.io.ObjectOutputStream s)

throws java.io.IOException {

// Write out any hidden serialization magic

s.defaultWriteObject();

// Write out HashMap capacity and load factor

s.writeInt(map.capacity());

s.writeFloat(map.loadFactor());

// Write out size

s.writeInt(map.size());

// Write out all elements in the proper order.

for (E e : map.keySet())

s.writeObject(e);

}

/**

* Reconstitute the HashSet instance from a stream (that is,

* deserialize it).

*/

private void readObject(java.io.ObjectInputStream s)

throws java.io.IOException, ClassNotFoundException {

// Read in any hidden serialization magic

s.defaultReadObject();

// Read capacity and verify non-negative.

int capacity = s.readInt();

if (capacity < 0) {

throw new InvalidObjectException("Illegal capacity: " +

capacity);

}

// Read load factor and verify positive and non NaN.

float loadFactor = s.readFloat();

if (loadFactor <= 0 || Float.isNaN(loadFactor)) {

throw new InvalidObjectException("Illegal load factor: " +

loadFactor);

}

// Read size and verify non-negative.

int size = s.readInt();

if (size < 0) {

throw new InvalidObjectException("Illegal size: " +

size);

}

// Set the capacity according to the size and load factor ensuring that

// the HashMap is at least 25% full but clamping to maximum capacity.

capacity = (int) Math.min(size * Math.min(1 / loadFactor, 4.0f),

HashMap.MAXIMUM_CAPACITY);

// Create backing HashMap

map = (((HashSet>)this) instanceof LinkedHashSet ?

new LinkedHashMap(capacity, loadFactor) :

new HashMap(capacity, loadFactor));

// Read in all elements in the proper order.

for (int i=0; i

@SuppressWarnings("unchecked")

E e = (E) s.readObject();

map.put(e, PRESENT);

}

}

/**

* Creates a late-binding

* and fail-fast {@link Spliterator} over the elements in this

* set.

*

*

The {@code Spliterator} reports {@link Spliterator#SIZED} and

* {@link Spliterator#DISTINCT}. Overriding implementations should document

* the reporting of additional characteristic values.

*

* @return a {@code Spliterator} over the elements in this set

* @since 1.8

*/

public Spliterator spliterator() {

return new HashMap.KeySpliterator(map, 0, -1, 0, 0);

}

}

TreeSet

TreeSet 和 HashSet 实现类似,间接调用内部的 TreeMap ,都是利用红黑树算法实现;TreeSet 会根据其元素的自然顺序对元素进行排序,元素依然是唯一的不可重复,元素不可为 null .

d76a04786000

TreeSet 结构图

LinkedHashSet

介于 HashSet 与 TreeSet 之间,在 HashSet 的基础上增加了一个记录插入顺序的双链表。线程不安全有序不重复集合,基于 LinkedHashMap 实现,是 HashMap 与双向链表结合实现的,利用双向链表记录插入顺序,以保证迭代输出的有序性。

d76a04786000

LinkedHashSet 结构图

ConcurrentSkipListSet

线程安全的有序不重复集合,适用于高并发场景;与 TreeSet 对比,相同点是都是有序集合,不同点有两方面,第一 TreeSet 是非线程安全的,第二 ConcurrentSkipListSet 是基于 ConcurrentSkipListMap 通过跳表数据结构实现而 TreeSet 是基于 TreeMap 通过红黑树算法实现。

d76a04786000

ConcurrentSkipListSet 结构图

CopyOnWriteArraySet

线程安全的无序不重复集合,适用于高并发场景;与 HashSet 对比,相同点是都是无序集合,不同点有有两个,第一 HashSet 是非线程安全的,第二 CopyOnWriteArraySet 是基于 CopyOnWriteArrayList 通过动态数组数据结构实现而 HashSet 是基于 HashMap 通过散列表数据结构实现。

d76a04786000

CopyOnWriteArraySet 结构图

EnumSet

Set针对枚举类型的接口实现类;通过位向量实现;EnumSet 中所有元素都必须是指定的枚举类型或枚举值,由 EnumSet 创建时指定,集合元素为有序、不重复、非 null ,元素的顺序与枚举类元素顺序相同;

d76a04786000

EnumSet 结构图

JobStateReasons

d76a04786000

JobStateReasons 结构图

ConcurrentHashMap.KeySetView

d76a04786000

KeySetView 结构图

如有写的不对的地方请大家指正,万分感谢,相互学习,相互交流

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309994.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Minimizing Difference CodeForces - 1244E(贪心题)

题目题意官方题解&#xff1a;百度翻译思路ac代码题意 给出一列数&#xff0c;至多n个操作使其中的数1或-1&#xff0c;要求得到最小的差值&#xff08;最大值-最小值&#xff09;&#xff1b; You are given a sequence a1_{1}1​,a2_{2}2​,…,an_{n}n​ consisting of nn …

[设计模式]依赖倒转原则

代码如下: #include <iostream> #include <string>using namespace std;//银行工作人员 class BankWorker { public:void saveService(){cout << "办理存款业务" << endl;}void payService(){cout << "办理支付业务" <&…

使用 Docker 搭建 PostgreSQL 12 主从环境

环境准备&#xff1a;一台安装了Docker的Linux服务器。为了简化演示环境&#xff0c;这里只用一台服务器来演示&#xff0c;通过不同端口来区分。01—创建一个docker bridge 网路用于测试docker network create --subnet172.18.0.0/24 dockernetwork docker network ls设置了网…

Paint the Tree CodeForces - 1244D(看似是树,其实是条链)

目录题目官方题解&#xff1a;百度翻译题解ac代码题目 给多组两顶点连接&#xff0c;得到的图任意三个顶点都是不同的颜色&#xff0c;&#xff0c;给出各顶点染三种颜色的花费&#xff0c;问各店如何染&#xff0c;满足条件情况下&#xff0c;使得花费最少&#xff1b; You …

[设计模式]简单工厂模式

简单工厂模式优点: 1.客户端和具体实现解耦 2.对于某些对象的创建过程比较复杂的情况&#xff0c;我们不用考虑这些。 简单工厂模式缺点: 1.简单工厂模式&#xff0c;增加新的功能是通过修改源代码实现&#xff0c;不符合开闭原则。 2.这个工厂(类)职责过重&#xff0c;这个…

什么前浪后浪,我们只不过是时代大潮中的一朵小浪花

这是头哥侃码的第198篇原创上周的五四青年节&#xff0c;我的朋友圈被一个短视频刷屏了&#xff0c;不知道你的朋友圈有没有被刷到&#xff1f;这个短视频来自小破站B站的一则宣传视频《后浪》。我是B站的老用户&#xff0c;所以在看完视频后&#xff0c;我特地跑到B站看了下&a…

java上GUI表格按钮,java GUI表格实例

1 package javademo;2 import java.awt.*;3 import javax.swing.*;4 import java.awt.event.*;5 public class table3{6 JFrame framenew JFrame("表格实例");7 Object [][]date {{"李明",45,"计算机"},{8 "小王",32,"数学"…

[设计模式]工厂方法模式

工厂方法模式缺点: 1.类的个数成倍增加&#xff0c;导致类越来越多&#xff0c;增加维护成本。 2.增加了系统的抽象性和理解难度。 (判断生产什么&#xff0c;又变成让客户端来判断了&#xff0c;简单工厂模式是由工厂判断) 工厂方法模式优点: 1.符合开闭原则。 简单工厂模式…

Asp.Net Boilerplate微服务实战(二)架构解析

这一章节&#xff0c;我来介绍一下Asp.Net Boilerplate框架在微服务开发中所用到的技术及其大体的组织架构。由于本系列仅讨论ABP框架在微服务架构下的应用方案&#xff0c;不涉及具体的业务逻辑&#xff0c;所以在文中&#xff0c;不讨论服务拆分方案等细节&#xff0c;也未采…

c#: 协变和逆变深度解析

环境&#xff1a;window 10.netcore 3.1vs2019 16.5.1一、为什么要有协变&#xff1f;首先看下面的代码&#xff1a;还有下面的&#xff1a;其实上面报错的是同一个问题&#xff0c;就是你无法用List<Fruit>指向List<Apple>&#xff01;我们的疑问在于&#xff0c;…

[设计模式]抽象工厂模式

抽象工厂模式针对的是产品族&#xff0c;而不是产品等级结构。 产品族:同一产地或者同一产商&#xff0c;功能不同。 产品等级:功能相同&#xff0c;产地或者厂商不同。 代码如下: #include <iostream> using namespace std;class AbstractApple { public:virtual vo…

.net core HttpClient 使用之掉坑解析(一)

一、前言在我们开发当中经常需要向特定URL地址发送Http请求操作&#xff0c;在.net core 中对httpClient使用不当会造成灾难性的问题&#xff0c;这篇文章主要来分享.net core中通过IHttpClientFactory 工厂来使用HttpClient的正确打开方式。二、HttpClient使用中的那些坑2.1 错…

linux常用命令 java,Java工程在Linux常用命令

Java Web工程 在Linux下操作常用命令cd ../ 退出当前目录,前往父文件夹cd ezoffice 进入ezoffice文件夹ls 查看目录ps -ef|grep java 查看JAVA进程ps -aux |grep tomcat 查看tomcat进程 的进程号kill -9 12222 杀死ID为12222进程nohup ./startup.sh & 执行startup.sh&…

[设计模式]单例模式(懒汉式,饿汉式)

实现单例步骤: 1.构造函数私有化。 2.增加静态私有的当前类的指针变量。 3.提供静态对外接口&#xff0c;可以让用户获得单例对象。 单例 分为&#xff1a; 1.懒汉式 2.饿汉式 懒汉式 代码如下: class Singleton_lazy { public:static Singleton_lazy *getInstance(){if (pS…

我擦!没想到你们都是这样 “劝退” 员工的!

前几天&#xff0c;我的一个好哥们在微信上跟我吐槽&#xff0c;说这波疫情对经济的影响实在太大了。他说在往年&#xff0c;这个时候跳槽应该开始冒头了&#xff0c;而今年从春节到现在&#xff0c;除了少数几个被裁员之外&#xff0c;200多人的技术团队几乎就没一个主动提离职…

[设计模式]代理模式

代理模式: 为其他对象提供一种代理以控制对这个对象的访问。 在某些情况下&#xff0c;一个对象不适合或者不能直接引用另一个对象&#xff0c;而代理对象可以在客户端和目标对象之间起到中介的作业。 代码如下: #include <iostream> using namespace std;//共有接口 …

IO 模型知多少 | 代码篇

引言之前的一篇介绍IO 模型的文章IO 模型知多少 -- 理论篇比较偏理论&#xff0c;很多同学反应不是很好理解。这一篇咱们换一个角度&#xff0c;从代码角度来分析一下。socket 编程基础开始之前&#xff0c;我们先来梳理一下&#xff0c;需要提前了解的几个概念&#xff1a;soc…

[设计模式]外观模式

外观模式:为一组具有类似功能的类群&#xff0c;比如类库&#xff0c;子系统等等&#xff0c;提供一个一致的简单的界面。 代码如下: #include <iostream> using namespace std;class Television { public:void on(){cout << "Tv on" << endl;}v…

Keywords Search HDU - 2222(AC自动机模板)

题意&#xff1a; 给定 n个长度不超过 50的由小写英文字母组成的单词准备查询&#xff0c;以及一篇文章&#xff0c;问&#xff1a;文中出现了多少个待查询的单词。多组数据。 题目&#xff1a; In the modern time, Search engine came into the life of everybody like Go…

介绍一个基于 .NET 的船的新 PHP SDK + Runtime: PeachPie

前言这几天想基于 .NET Core 搞一个自己的博客网站&#xff0c;于是在网上搜刮各种博客引擎&#xff0c;找到了这些候选&#xff1a;Blogifier、Miniblog 以及 edi 写的 Moonglade。Blogifier&#xff1a;这是前端是个 Angular SPA 应用&#xff0c;不利于 SEO&#xff0c;同时…