在java集合中有一种集合Set(集),他有两个实现类,分别是HashSet,TreeSet。下面仔细分析HashSet源码。

看了HashSet的源码就会发现HashSet的底层实现是利用HashMap,所以对于HashSet的一些操作都是利用HasgMap的操作实现的。生命类一个HashMap成员变量,在构造方法中创建这个HashMap。

HashSet有多个重载的构造方法,最终都是创建HashMap,看第二个构造方法中包含两个参数,这里先简单说一下这个0.75是什么,这个0.75(负载因子)是传近HashMap的参数,HashMap都用到了这个负载因子,当创建一个HashMap时,他不会等到全部装满再扩容,当创建16个长度的HashMap时,在元素装到16*0.75=12个的时候就要扩容,后期在分析HashMap时会详细说明。

注意最后一个构造方法是创建了一个LinkedHashMap对象,但是底层也是调用了HashMap的构造方法

看他的遍历方法,由于HashSet是用HashMap实现存储的,所以对HashSet遍历就是对HashMap进行遍历,HashMap的遍历可以通过keySet()方法转换成Set集合再调用iterator()方法迭代遍历。

既然说HashSet使用HashMap实现的,HashMap是Map的存储使用键值对存储的,这里为什么只把HashMap的键转化成了Set,值呢?这里要说一下add()方法,利用HashMap的put方法实现添加元素,var1是值,后面PRESENT其实是一个空的Object数组,这个数组在类加载的时候ijiu已经创建好了,后期也没有去添加元素。利用HashMap实现HashSet,Map集合用键值对存储,Set集合只是存储普通的对象,不是以键值对形式存储,为了模拟,jdk创建了一个假的键值对,只存键,对于值呢,用一个空的Object数组代替,也就是这个键是真的,所有的值都是假的,一个空的数组。

剩下的其他常用的方法都是调用HashMap的方法

TreeSet的实现和HashSet的实现基本一致,也是调用TreeMap实现,在Terr的结构中都加入了比较器,在加入元素后为元素进行排序,所以我们在输出元素的时候总是有序的。

HashSet源码分析的更多相关文章

  1. 死磕 java集合之HashSet源码分析

    问题 (1)集合(Collection)和集合(Set)有什么区别? (2)HashSet怎么保证添加元素不重复? (3)HashSet是否允许null元素? (4)HashSet是有序的吗? (5) ...

  2. 【Java入门提高篇】Day26 Java容器类详解(八)HashSet源码分析

    前面花了好几篇的篇幅把HashMap里里外外说了个遍,大家可能对于源码分析篇已经讳莫如深了.别慌别慌,这一篇来说说集合框架里最偷懒的一个家伙——HashSet,为什么说它是最偷懒的呢,先留个悬念,看完 ...

  3. HashSet源码分析:JDK源码系列

    1.简介 继续分析源码,上一篇文章把HashMap的分析完毕.本文开始分析HashSet简单的介绍一下. HashSet是一个无重复元素集合,内部使用HashMap实现,所以HashMap的特征耶继承 ...

  4. java.util.HashSet源码分析

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

  5. JAVA的HashSet源码分析

    一.HashSet概述 HashSet实现Set接口,由哈希表(实际上是一个HashMap实例)支持.它不保证set的迭代顺序:特别是它不保证该顺序恒久不变.此类允许使用null元素. 二.HashS ...

  6. Java集合之HashSet源码分析

    概述 HashSet是基于HashMap来实现的, 底层采用HashMap的key来保存数据, 借此实现元素不重复, 因此HashSet的实现比较简单, 基本上的都是直接调用底层HashMap的相关方 ...

  7. HashSet源码分析 jdk1.6

    Set的特点:Set元素无顺序,且元素不可以重复. 1.定义 public class HashSet<E> extends AbstractSet<E> implements ...

  8. HashSet源码分析2

    package com.test1; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public ...

  9. HashSet源码分析1

    import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class SetTest { pu ...

随机推荐

  1. Ubuntu上搭建Hadoop环境(单机模式+伪分布模式)

    首先要了解一下Hadoop的运行模式: 单机模式(standalone)        单机模式是Hadoop的默认模式.当首次解压Hadoop的源码包时,Hadoop无法了解硬件安装环境,便保守地选 ...

  2. openstack-ocata-网络服务5

    一. 网络服务概述 Networking(neutron),允许创建.插入接口设备,这些设备由其他的OpenStack服务管理.插件式的实现可以容纳不同的网络设备和软件,为OpenStack架构与部署 ...

  3. 多线程编程学习笔记——异步调用WCF服务

    接上文 多线程编程学习笔记——使用异步IO 接上文 多线程编程学习笔记——编写一个异步的HTTP服务器和客户端 接上文 多线程编程学习笔记——异步操作数据库 本示例描述了如何创建一个WCF服务,并宿主 ...

  4. dedecms 使用自由列表实现首页列表分页

  5. freemarker.template.TemplateException:Error parsing including template

    1.错误描述 freemarker.template.TemplateException:Error parsing including template ftl/main.ftl:on line 6 ...

  6. http协议的补充二

    一,浏览器到服务器request 1.1,浏览器里面的内容 请求(浏览器->服务器) GET /day09/hello HTTP/1.1 Host: localhost:8080 User-Ag ...

  7. 利用SSH端口转发实现跨机器直接访问

    在实际项目测试中经常会遇到数据库操作,但是因为公司安全问题,访问数据库往往需要通过跳板机.但通过跳板机,测试效率大打折扣,因此通过使用SSH端口转发,从而达到跨机器直接访问数据库.实际项目中的应用会比 ...

  8. day9(Hash、字典)

    一.Hash 简介: Hash,一般被翻译成"散列",也有直接音译"哈希"的,就是把任意长度的输入,通过哈希算法,变换成固定长度的输出,输出的结果就叫做哈希值, ...

  9. numpy使用总结

    numpy是Python中常用的数据处理库的基础库,一般通过import numpy as np的方式导进 科学计算库numpy 在numpy中,主要的数据结构是ndarray,在numpy中称为数组 ...

  10. 戏说java多线程之CyclicBarrier(循环栅栏)的CyclicBarrier(int parties)构造方法

    CyclicBarrier是JDK 1.5 concurrent包出现的一个用于解决多条线程阻塞,当达到一定条件时一起放行的一个类.我们先来看这样一个简单的需求. 现在我有一个写入数据的类,继承Run ...