集合

框架关系图:

Collection接口下面有三个子接口:List、Set、Queue。此篇是关于Set<E>的简单学习总结。

补充:HashTable父类是Dictionary,不是AbstractMap。

Set:

Set里存放的对象是无序,不能重复的,集合中的对象不按特定的方式排序,只是简单地把对象加入集合中(可以存空元素)。常见的子类:HashSet、TreeSet、LinkedHashSet。

1、HashSet(无序,不可重复):

底层实际上是一个无序,不可重复的HashMap,源代码如下:

  1. private transient HashMap<E,Object> map;
  2. /**
  3. * Constructs a new, empty set; the backing <tt>HashMap</tt> instance has
  4. * default initial capacity (16) and load factor (0.75).
  5. *(默认初始容量是16,加载因子是0.75,元素个数超过16*0.75就扩容)
  6. */
  7. public HashSet() {
  8. map = new HashMap<>();
  9. }
  10. public HashSet(Collection<? extends E> c) {
  11. map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
  12. addAll(c);
  13. }

因为Set的无序,不可重复,所以常用来去重。

  1. public static void main(String[] args) {
  2. Set<String> hash = new HashSet<String>();
  3. hash.add("C");
  4. hash.add("A");
  5. hash.add("A");
  6. hash.add("D");
  7. hash.add("B");
  8. hash.add("B");
  9. hash.add("D");
  10. hash.add("C");
  11. Iterator it = hash.iterator();
  12. while (it.hasNext()) {
  13. System.out.println(it.next());
  14. }
  15. }

注意:当HashSet调用add(Object o)时,会把参数当为key,默认一个对象最为value:

  1. private static final Object PRESENT = new Object();
  2. public boolean add(E e) {
  3. return map.put(e, PRESENT)==null;
  4. }

2、LinkedHashSet(有序,不可重复):

LinkedHashSet继承HashSet,默认初始容量:16,加载因子:0.75。其实LinkedHashSet就是双向链状的HashSet,因为是链状,所以实现了有序性,但是不可重复。

  1. public static void main(String[] args) {
  2. Set<String> linked = new LinkedHashSet<String>();
  3. linked.add("A");
  4. linked.add("A");
  5. linked.add("C");
  6. linked.add("B");
  7. linked.add("D");
  8. linked.add("A");
  9. linked.add("B");
  10. Iterator it = linked.iterator();
  11. while (it.hasNext()) {
  12. System.out.println(it.next());
  13. }
  14. }

3、TreeSet(有序,不可重复):

TreeSet底层是TreeMap:

  1. public class TreeSet<E> extends AbstractSet<E> implements NavigableSet<E>, Cloneable, java.io.Serializable{
  2.  
  3. private transient NavigableMap<E,Object> m;
  4.  
  5. private static final Object PRESENT = new Object();
  6.  
  7. TreeSet(NavigableMap<E,Object> m) {
  8. this.m = m;
  9. }
  10.  
  11. public TreeSet() {
  12. this(new TreeMap<E,Object>());
  13. }

TreeSet中有个Compare比较器,会对数据进行排序:

  1. public static void main(String[] args) {
  2. Set<String> tree = new TreeSet<>();
  3. tree.add("A");
  4. tree.add("C");
  5. tree.add("A");
  6. tree.add("D");
  7. tree.add("B");
  8. Iterator<String> it = tree.iterator();
  9. while(it.hasNext()){
  10. System.out.println(it.next());
  11. }
  12. }

数据结构(集合)学习之Set的更多相关文章

  1. 数据结构(集合)学习之Map(一)

    集合 框架关系图: 补充:HashTable父类是Dictionary,不是AbstractMap. Map: Map(接口)和Collection都属于集合,但是Map不是Collection的子类 ...

  2. 数据结构(集合)学习之Queue

    集合 框架关系图: Collection接口下面有三个子接口:List.Set.Queue.此篇是关于Queue<E>的简单学习总结. 补充:HashTable父类是Dictionary, ...

  3. 数据结构(集合)学习之List

    集合 框架关系图: Collection接口下面有三个子接口:List.Set.Queue.此篇是关于List<E>的简单学习总结. 补充:HashTable父类是Dictionary,不 ...

  4. 数据结构(集合)学习之Map(二)

    集合 框架关系图 补充:HashTable父类是Dictionary,不是AbstractMap. 一:HashMap中的链循环: 一般来说HashMap中的链循环会发生在多线程操作时(虽然HashM ...

  5. 数据结构(集合)学习之Collection和Iterator

    集合 1.集合与数组 数组(可以存储基本数据类型)是用来存现对象的一种容器,但是数组的长度固定,不适合在对象数量未知的情况下使用. 集合(只能存储对象,对象类型可以不一样)的长度可变,可在多数情况下使 ...

  6. 2019/3/4 java集合学习(二)

    java集合学习(二) 在学完ArrayList 和 LinkedList之后,基本已经掌握了最基本的java常用数据结构,但是为了提高程序的效率,还有很多种特点各异的数据结构等着我们去运用,类如可以 ...

  7. 2019/3/2周末 java集合学习(一)

    Java集合学习(一) ArraysList ArraysList集合就像C++中的vector容器,它可以不考虑其容器的长度,就像一个大染缸一 样,无穷无尽的丢进去也没问题.Java的数据结构和C有 ...

  8. 转:深入Java集合学习系列:HashSet的实现原理

    0.参考文献 深入Java集合学习系列:HashSet的实现原理 1.HashSet概述: HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set 的迭代顺序:特 ...

  9. ------------------java collection 集合学习 ----小白学习笔记,,有错,请指出谢谢

    <!doctype html>java对象集合学习记录 figure:first-child { margin-top: -20px; } #write ol, #write ul { p ...

随机推荐

  1. 数学建模之优劣解距法(TOPSIS)

    优劣解距法简称TOPSIS,是一种综合评价方法,利用原始数据反映各评价方案之间的差距 优劣解距法的步骤通常为: 先将原始数据针具做正向化处理,得到正向化矩阵 再对正向化矩阵标准化处理以消除各指标纲量的 ...

  2. 仅主机、NAT、桥接模式

    三种模式区别: 桥接模式 :通过主机映射一个ip给虚拟机,只要主机可以访问外网.虚拟机也可以访问,两机可以相互通信. NAT模式:主机和虚拟机在同一个地址,原则上两者不能相互通信,但是通过修改NAT配 ...

  3. 1、OSI参考模型

    网络的层次模型:Core layer (核心层):高速转发,不建议做策略  Distribution layer (分布层,汇聚层):基于策略连接(路由控制,安全策略)Access layer (接入 ...

  4. 低功耗设计技术--Multi VDD--Level shifter

    本文转自:自己的微信公众号<集成电路设计及EDA教程> 前面的推文中我们分别介绍了低功耗设计中的Multi-VDD技术以及门控电源技术.在实际的低功耗设计中,门控电源技术中也常常结合Mul ...

  5. Codeforces_851

    A.分三种情况. #include<bits/stdc++.h> using namespace std; int n,k,t; int main() { ios::sync_with_s ...

  6. 第3章 JDK并发包(四)

    3.2.5 自定义线程创建:ThreadFactory 线程池的主要作用是为了线程复用,也就是避免了线程的频繁创建. ThreadFactory是一个接口,它只有一个方法,用来创建线程: Thread ...

  7. 搭建 Kubernetes 集群

    1.节点规划 master节点:192.168.188.135 node   节点:(node1)192.168.188.136,(node2)192.168.188.137 2.禁用SELinux ...

  8. one-hot编码(pytorch实现)

    n = 5 #类别数 indices = torch.randint(0, n, size=(15,15)) #生成数组元素0~5的二维数组(15*15) one_hot = torch.nn.fun ...

  9. Python Namespace - 命名空间

    命名空间 命名空间 namespace 对 python 来说是一个非常核心的概念,整个 python 虚拟机运行的机制与 namespace 概念有这非常紧密的联系. 从'赋值'说起, python ...

  10. cdh集群hive升级,数据不丢失

    1.下载hive-1.2.1安装包 http://archive.apache.org/dist/hive/hive-1.2.1/apache-hive-1.2.1-bin.tar.gz 2.将安装包 ...