在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. Java 多线程入门

    进程与线程 在学习Java多线程之前,先简单复习一下进程与线程的知识. 进程:进程是系统进行资源分配和调度的基本单位,可以将进程理解为一个正在执行的程序,比如一款游戏. 线程:线程是程序执行的最小单位 ...

  2. TCP/IP读书笔记(4) IPv4和IPv6 路由选择

    TCP/IP读书笔记(4) IPv4和IPv6 路由选择 网络层是位于链路层之上,TCP/IP模型中网络层的核心协议是IP协议(Internet protocol). 目前主流的IP协议是IPv4(I ...

  3. JavaScript split()函数

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  4. Srtuts2实现登录界面(不连接数据库)报错(三)

    二月 28, 2014 11:41:20 下午 org.apache.catalina.core.AprLifecycleListener init 严重: An incompatible versi ...

  5. 将搜狗词库(.scel格式)转化为txt格式

    参考:http://blog.csdn.net/zhangzhenhu/article/details/7014271 #!/usr/bin/python # -*- coding: utf-8 -* ...

  6. Invalid property 'url' of bean class [com.mchange.v2.c3p0.ComboPooledDataSource]

    1.错误描述 INFO:2015-05-01 13:13:05[localhost-startStop-1] - Initializing c3p0-0.9.2.1 [built 20-March-2 ...

  7. 学习笔记:webpack深入与实践(一)

    一.webpack基本介绍 webpack 是一个现代 JavaScript 应用程序的静态模块打包器(module bundler). 四个核心概念: 入口(entry):指示 webpack 应该 ...

  8. “玲珑杯”ACM比赛 Round #4 B Best couple

    一眼的KM,但是建图的时候记得不用的点设为0,点少的一边补齐,这个非常重要,因为KM追求完全匹配,如果无法完全匹配会非常慢 #include<bits/stdc++.h> using na ...

  9. Tea HDU - 5881

    Tea is good. Tea is life. Tea is everything. The balance of tea is a journey of pursuing balance of ...

  10. Go基础之--操作Mysql(三)

    事务是数据库的一个非常重要的特性,尤其对于银行,支付系统,等等.database/sql提供了事务处理的功能.通过Tx对象实现.db.Begin会创建tx对象,后者的Exec和Query执行事务的数据 ...