博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java集合框架-HashSet与HashMap
阅读量:5230 次
发布时间:2019-06-14

本文共 2147 字,大约阅读时间需要 7 分钟。

首先来看一下实例化一个HashSet时候,那么底层做了那些事情呢?

/**     * Constructs a new, empty set; the backing HashMap instance has     * default initial capacity (16) and load factor (0.75).     */    public HashSet() {    map = new HashMap
(); }

原来Set的底层实现是一个HashMap,接下来看一下add方法的实现

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

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

 private static final Object PRESENT = new Object();

实际上,调用的是map的put方法,这时我们发现我们添加的元素作为map的key,而value则是一个静态的Object类型的常量,而这个常量我们用不到

好了,那么接下来我们有必要研究一下HashMap的底层实现

/**     * Constructs an empty HashMap with the default initial capacity     * (16) and the default load factor (0.75).     */    public HashMap() {        this.loadFactor = DEFAULT_LOAD_FACTOR;        threshold = (int)(DEFAULT_INITIAL_CAPACITY * DEFAULT_LOAD_FACTOR);        table = new Entry[DEFAULT_INITIAL_CAPACITY];        init();    }

我们发现原来HashMap的底层实际上是一个Entry类型的数组,我们向HashMap中所放置的对象实际上是存储在该数组当中

当向map中添加数据时

public V put(K key, V value) {        if (key == null)            return putForNullKey(value);        int hash = hash(key.hashCode());        int i = indexFor(hash, table.length);        for (Entry
e = table[i]; e != null; e = e.next) { Object k; if (e.hash == hash && ((k = e.key) == key || key.equals(k))) { V oldValue = e.value; e.value = value; e.recordAccess(this); return oldValue; } } modCount++; addEntry(hash, key, value, i); return null; }
void addEntry(int hash, K key, V value, int bucketIndex) {    Entry
e = table[bucketIndex]; table[bucketIndex] = new Entry
(hash, key, value, e); if (size++ >= threshold) resize(2 * table.length);}

当向HashMap中put一对键值时,它会根据key的hashCode值计算出一个位置,该位置就是此对象准备往数组中存放的位置。

 如果该位置没有对象存在,就将此对象直接放进数组当中;如果该位置已经有对象存在了,则顺着此存在的对象的链开始寻找(Entry类有一个Entry类型的next成员变量,指向了该对象的下一个对象),如果此链上有对象的话,再去使用equals方法进行比较,如果对此链上的某个对象的equals方法比较为false,则将该对象放到数组当中,然后将数组中该位置以前存在的那个对象链接到此对象的后面。

原理图如下:

 

转载于:https://www.cnblogs.com/nanjingwangbo/p/7309554.html

你可能感兴趣的文章
Visual Studio文件属性
查看>>
PowerDesigner EnterpriseArchitect 16 Evaluation Software Download
查看>>
音频采样
查看>>
基于Tomcat7、Java、WebSocket的服务器推送技术之聊天室
查看>>
链表之循环链表
查看>>
软件工程 小型 方案集锦
查看>>
linux - mysql - 卸载:使用rpm方式安装的mysql
查看>>
微卡口摄像机
查看>>
HttpStatus各种状态
查看>>
Coded UI
查看>>
国王游戏
查看>>
Messenger 深入
查看>>
Hiho 1014 题目
查看>>
第三次冲刺
查看>>
20个Flutter实例视频教程-第07节: 毛玻璃效果制作
查看>>
(转) 淘淘商城系列——使用FastDFS-Client客户端进行上传图片的测试
查看>>
将正整数转换为二进制数
查看>>
《软件需求十步走》阅读笔记4
查看>>
Implement strStr()
查看>>
PowerPoint 2010 中的新增幻灯片放映功能
查看>>