java容器类3:set/HastSet/MapSet深入解读

介绍

Set:集合,是一个不包含重复数据的集合。(A collection that contains no duplicate elements. )

set中最多包含一个null元素,否者包含了两个相同的元素,不符合定义。

上一篇学习了Java中的容器类的一些基础接口,以及Collection接口三大分支中的List分支(ArrayList以及LinkedList)。这一篇文章将讲解Collection三大分支(List、Set、Queue)中的Set分支,以及衍生出来的子类。

java容器类分析:Collection,List,ArrayList,LinkedList深入解读

Set接口的总的集成关系如下图:

未命名文件 (2)


Set接口

public interface Set<E> extends Collection<E>

查看Set的源码可以发现,Set中的接口函数和Collection完全相同,并没有添加任何新的接口。只是子类在实现这些接口的时候需要考虑,Set中不能有重复的元素这一原则。接口中的函数及描述可查看上一篇博客。


AbstractSet抽象类

和AbstractList及AbstractCollection的作用相似,AbstractSet类作为一个抽象类,实现了Set接口中的部分函数,减少后续Set子类的实现工作。

public abstract class AbstractSet<E> extends AbstractCollection<E> implements Set<E>

具体该抽象类实现了Set中的如下几个接口:

复制代码

 public boolean equals(Object o) {if (o == this)return true;if (!(o instanceof Set))return false;Collection<?> c = (Collection<?>) o;if (c.size() != size())return false;try {

return containsAll(c);

        } catch (ClassCastException unused)   {return false;} catch (NullPointerException unused) {return false;}}

复制代码

hashCode():Set的hash值等于将Set中所有元素的hash值相加,这就保证了if(set1.equals(set2)) 那么set1.hashCode()== set2.hashCode()。

复制代码

public int hashCode() {int h = 0;Iterator<E> i = iterator();while (i.hasNext()) {E obj = i.next();if (obj != null)h += obj.hashCode();}return h;}

复制代码

removeAll(): 移除c与当前Set的交集,返回值代表是否有元素从当前Set中移除,交集为空返回false否则返回true。

复制代码

public boolean removeAll(Collection<?> c) {Objects.requireNonNull(c);boolean modified = false;if (size() > c.size()) {for (Iterator<?> i = c.iterator(); i.hasNext(); )modified |= remove(i.next());} else {for (Iterator<?> i = iterator(); i.hasNext(); ) {if (c.contains(i.next())) {i.remove();modified = true;}}}return modified;}

复制代码

 

SortedSet


public interface SortedSet<E> extends Set<E>

 

复制代码

public interface SortedSet<E> extends Set<E> {//经过某种排序的set       JDK1.7   java.util  Comparator<? super E> comparator();//返回对此 set中的元素进行排序的比较器  SortedSet<E> subSet(E fromElement, E toElement);//返回此 set的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。(  SortedSet<E> headSet(E toElement);//返回此 set 的部分视图,其元素严格小于 toElement  SortedSet<E> tailSet(E fromElement);//返回此 set的部分视图,其元素大于等于 fromElement  E first();//set中第一个元素  E last();//set中最后一个元素  
}

复制代码

NavigableSet

复制代码

public interface NavigableSet<E> extends SortedSet<E> {//扩展的 SortedSet,具有了搜索匹配元素方法          JDK1.7   java.util  E lower(E e);//返回此 set中小于给定元素的最大元素  E floor(E e);//返回此 set中小于等于给定元素的最大元素  E ceiling(E e);//返回此 set中大于等于给定元素的最小元素  E higher(E e);//返回此 set中大于给定元素的最小元素  E pollFirst();//获取并移除第一个元素  E pollLast();//获取并移除最后一个元素  Iterator<E> iterator();//以升序返回在此set的元素上进行迭代的迭代器  NavigableSet<E> descendingSet();//返回此 set中所包含元素的逆序视图  Iterator<E> descendingIterator();//以降序返回在此 set的元素上进行迭代的迭代器。效果等同于 descendingSet().iterator()。   //返回此 set 的部分视图,其元素范围从 fromElement 到 toElement  NavigableSet<E> subSet(E fromElement, boolean fromInclusive, E toElement, boolean toInclusive);//返回此 set的部分视图,其元素小于(或等于,如果 inclusive 为 true)toElement  NavigableSet<E> headSet(E toElement, boolean inclusive);//返回此 set的部分视图,其元素大于(或等于,如果 inclusive 为 true)fromElement  NavigableSet<E> tailSet(E fromElement, boolean inclusive);//返回此 set 的部分视图,其元素从 fromElement(包括)到 toElement(不包括)。  SortedSet<E> subSet(E fromElement, E toElement);//返回此 set的部分视图,其元素严格小于 toElement  SortedSet<E> headSet(E toElement);//返回此 set的部分视图,其元素大于等于 fromElement  SortedSet<E> tailSet(E fromElement);
}

复制代码

HashSet

public class HashSet<E> extends AbstractSet<E> implements Set<E>, Cloneable, java.io.Serializable

阅读HashSet的源码,其实很简单,就是在里面维护了一个 HashMap类型的成员变量,然后抽象出了几个增删改查的方法。需要深入了解的话可以阅读:java容器类2:Map及HashMap深入解读

这里有个疑问,HashMap是存放键值对的,而HashSet是存放一组数据的,为什么可以用HashMap保存set数据?

HashMap中的keySet()函数返回的就是一个 Set类型的数据(不能有重复的key值),所以HashSet将Set数组全部存放在HashMap的keySet中,value值全部用默认的一个Object类型的常量表示。

HashSet中的add()函数可以看出

public boolean add(E e) {return map.put(e, PRESENT)==null;}

TreeSet


TreeSet的继承关系如下,看上去还挺复杂

1088209-20170227105335251-1963872270

正如TreeSet继承自SortSet一样,TreeSet中存储了排序的数组(每个元素值不能有重复的元素)。

同HashSet实现方法相同,里面维护了一个map(NavigableMap类型)类型的成员变量,来保证所有数据是有序的。map里面的keySet字段可以保存TreeSet的所有值。

TreeSet中的方法都是基于NavigableMap的增删改查操作,这里不详细分析。

 

参考:

http://www.cnblogs.com/NeilZhang/p/8577991.html

梦想不是浮躁,而是沉淀和积累

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

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

相关文章

Bandit算法原理及Python实战

目录 1&#xff09;什么是Bandit算法 为选择而生。 Bandit算法与推荐系统 怎么选择Bandit算法&#xff1f; 2)常用Bandit算法 Thompson sampling算法 UCB算法 Epsilon-Greedy算法 Greedy算法 3&#xff09;Bandit算法Python实战 参考资料&#xff1a; 推荐系统里面有…

*【 POJ - 1007 】DNA Sorting(枚举,类似三元组找第二元问题)

题干&#xff1a; One measure of unsortedness in a sequence is the number of pairs of entries that are out of order with respect to each other. For instance, in the letter sequence DAABEC, this measure is 5, since D is greater than four letters to its righ…

ava容器类4:Queue深入解读

Collection的其它两大分支&#xff1a;List和Set在前面已近分析过&#xff0c;这篇来分析一下Queue的底层实现。 前三篇关于Java容器类的文章&#xff1a; java容器类1&#xff1a;Collection,List,ArrayList,LinkedList深入解读 java容器类2&#xff1a;Map及HashMap深入解…

Waymo离线点云序列3D物体检测网络 (3D Auto Labeling): Offboard 3D Object Detection from Point Cloud Sequences

本文介绍一篇Waymo基于点云序列的3D物体检测网络&#xff1a;3D Auto Labeling&#xff0c;论文已收录于CVPR 2021。 这里重点是理解本文提出的 Object-centric Auto Labeling。 论文链接为&#xff1a;https://arxiv.org/abs/2103.05073 2021-09-02补充&#xff1a;本文作者…

【OpenJ_Bailian - 2711 】 合唱队形(dp,枚举中间顶点)

题干&#xff1a; N位同学站成一排&#xff0c;音乐老师要请其中的(N-K)位同学出列&#xff0c;使得剩下的K位同学不交换位置就能排成合唱队形。 合唱队形是指这样的一种队形&#xff1a;设K位同学从左到右依次编号为1, 2, …, K&#xff0c;他们的身高分别为T1, T2, …, TK&…

Waymo自动驾驶数据集介绍与使用教程

本文将对Waymo自动驾驶数据集&#xff08;Waymo Open Dataset&#xff09;进行介绍。 论文链接为&#xff1a;https://arxiv.org/abs/1912.04838v7 项目链接为&#xff1a;https://github.com/waymo-research/waymo-open-dataset 数据集链接为&#xff1a;https://waymo.com…

Java 并发基础——线程安全性

线程安全&#xff1a;多个线程访问某个类时&#xff0c;不管运行时环境采用何种调度方式或者这些线程将如何交替执行&#xff0c;并且在主调代码中不需要任何额外的同步或协调&#xff0c;这个类都能表现出正确的行为&#xff0c;那么久称这个类是线程安全的。 在线程安全类中封…

详解一阶段3D物体检测网络 SE-SSD: Self-Ensembling Single-Stage Object Detector From Point Cloud

本文介绍一篇一阶段的3D物体检测网络&#xff1a;SE-SSD&#xff0c;论文已收录于 CVPR 2021。 这里重点是理解本文提出的 Consistency Loss 、Orientation-Aware Distance-IoU Loss、Shape-Aware Data Augmentation。 论文链接为&#xff1a;https://arxiv.org/pdf/2104.0980…

【POJ - 3744】Scout YYF I(概率dp,矩阵快速幂优化dp)

题干&#xff1a; 题目大意&#xff1a; 在一条不满地雷的路上&#xff08;无限长&#xff09;&#xff0c;你现在的起点在1处。在N个点处布有地雷&#xff0c;1<N<10。地雷点的可能坐标范围&#xff1a;[1,100000000]. 每次前进p的概率前进一步&#xff0c;1-p的概率…

详解3D点云分割网络 Cylindrical and Asymmetrical 3D Convolution Networksfor LiDAR Segmentation

本文介绍一篇3D点云分割网络&#xff1a;Cylinder3D&#xff0c;论文已收录于 CVPR 2021。 这里重点是理解本文提出的 Cylindrical Partition 和 Asymmetrical 3D Convolution Network。 论文链接为&#xff1a;https://arxiv.org/pdf/2011.10033.pdf 项目链接为&#xff1a;…

Java中泛型Class《T》、T与Class《?》

一.区别 单独的T 代表一个类型 &#xff0c;而 Class<T>代表这个类型所对应的类&#xff0c; Class<&#xff1f;>表示类型不确定的类 E - Element (在集合中使用&#xff0c;因为集合中存放的是元素)T - Type&#xff08;Java 类&#xff09;K - Key&#xff08;…

【CodeForces - 701D】As Fast As Possible(二分,模拟,数学公式)

题干&#xff1a; On vacations n pupils decided to go on excursion and gather all together. They need to overcome the path with the length l meters. Each of the pupils will go with the speed equal to v1. To get to the excursion quickly, it was decided to r…

自动驾驶3D物体检测研究综述 3D Object Detection for Autonomous Driving: A Survey

本文介绍一篇最新的自动驾驶3D物体检测研究综述&#xff08;2021年6月份发布&#xff09;&#xff0c;来源于中国人民大学&#xff0c;论文共26页&#xff0c;99篇参考文献。 论文链接为&#xff1a;https://arxiv.org/pdf/2106.10823.pdf 0. Abstract 自动驾驶被看作是避免人…

【CodeForces - 705C】Thor(模拟,STLset优化链表)

题干&#xff1a; Thor is getting used to the Earth. As a gift Loki gave him a smartphone. There are n applications on this phone. Thor is fascinated by this phone. He has only one minor issue: he cant count the number of unread notifications generated by …

Java中接口的多继承

我们知道Java的类只能继承一个类&#xff0c;但可以实现多个接口。但是你知道么&#xff1f;Java中的接口却可以继承多个接口。本文就来说一说Java中接口的多继承。 进入主题之前&#xff0c;先扩展一下。Java为什么只支持单继承呢&#xff1f; 我们不妨假设Java支持多继承&a…

详解基于IMU/GPS的行人定位: IMU/GPS Based Pedestrian Localization

本文介绍一篇使用 IMU/GPS 数据融合的行人定位论文&#xff0c;这里重点是理解本文提出的 Stop Detection 和 GPS Correction。 论文地址为&#xff1a;https://www.researchgate.net/publication/261452498_IMUGPS_based_pedestrian_localization 1. Introduction 低成本的 …

每次maven刷新jdk都要重新设置

pom.xml <java.version>17</java.version> 改为<java.version>1.8</java.version>

【CodeForces - 706D】Vasiliy's Multiset(01字典树)

题干&#xff1a; Author has gone out of the stories about Vasiliy, so here is just a formal task description. You are given q queries and a multiset A, initially containing only integer 0. There are three types of queries: " x" — add integer …

LaTeX常用数学符号总结

本文汇总了在使用LaTeX中常用的数学符号&#xff0c;相关下载资源为&#xff1a;139分钟学会Latex&#xff08;免积分下载&#xff09;。 文章目录1. 希腊字母2. 集合运算符3. 数学运算符4. 三角符号、指数符号、对数符号5. 积分、微分、偏微分6. 矩阵和行列式7. 基本函数、分段…

基本类型优先于装箱基本类型

基本类型与包装类型的主要区别在于以下三个方面&#xff1a; 1、基本类型只有值&#xff0c;而包装类型则具有与它们的值不同的同一性&#xff08;identity&#xff09;。这个同一性是指&#xff0c;两个引用是否指向同一个对象&#xff0c;如果指向同一个对象&#xff0c;则说…