搜索
写经验 领红包
 > 知识

集合篇啥意思(java集合hashset用法)

导语:集合篇-HashMap(JAVA)

前言

HashMap是实现Map接口的hash表,以key-value形式存储数据,并且key/value都是可以存储null值,而且是无序的。在jdk文档介绍中就有这么一句话。

使用案例

源码分析

1、new HashMap<>()

//加在一起因子//static final float DEFAULT_LOAD_FACTOR = 0.75f;public HashMap() {    this.loadFactor = DEFAULT_LOAD_FACTOR; // all other fields defaulted}

2、java.util.HashMap34;rawtypesunchecked&get

public V get(Object key) {    Node<K,V> e;    return (e = getNode(hash(key), key)) == null ? null : e.value;}
final Node<K,V> getNode(int hash, Object key) {    Node<K,V>[] tab; Node<K,V> first, e; int n; K k;    if ((tab = table) != null && (n = tab.length) > 0 &&        (first = tab[(n - 1) & hash]) != null) {      //key-hash出来的值对应的下标有三种情况      //1、单节点;2、链表、3、红黑树        if (first.hash == hash && // always check first node            ((k = first.key) == key || (key != null && key.equals(k))))          //如果找到value相等的,直接返回            return first;      //这种情况就是存在链表或者红黑树        if ((e = first.next) != null) {          //如果是树节点类型的则直接找树            if (first instanceof TreeNode)                return ((TreeNode<K,V>)first).getTreeNode(hash, key);            //这里是找链表的            do {                if (e.hash == hash &&                    ((k = e.key) == key || (key != null && key.equals(k))))                    return e;            } while ((e = e.next) != null);        }    }    return null;}
final TreeNode<K,V> getTreeNode(int h, Object k) {    return ((parent != null) ? root() : this).find(h, k, null);}
final TreeNode<K,V> find(int h, Object k, Class<?> kc) {    TreeNode<K,V> p = this;    do {        int ph, dir; K pk;        TreeNode<K,V> pl = p.left, pr = p.right, q;        if ((ph = p.hash) > h)            p = pl;        else if (ph < h)            p = pr;        else if ((pk = p.key) == k || (k != null && k.equals(pk)))            return p;        else if (pl == null)            p = pr;        else if (pr == null)            p = pl;        else if ((kc != null ||                  (kc = comparableClassFor(k)) != null) &&                 (dir = compareComparables(kc, k, pk)) != 0)            p = (dir < 0) ? pl : pr;        else if ((q = pr.find(h, k, kc)) != null)            return q;        else            p = pl;    } while (p != null);    return null;}

总结

从上面HashMap的put方法和get方法中可以知道,HashMap的底层实现是数组+链表+红黑树,下面的图我只是简单的画一下。再者就是红色树的形成过程可以参考一下TreeMap那篇文章。

喜欢这样做源码解析的同学,可以点赞、关注+收藏,后期还会推出其他框架源码分析。

如果有补充的地方,留言区见

免责声明:本站部份内容由优秀作者和原创用户编辑投稿,本站仅提供存储服务,不拥有所有权,不承担法律责任。若涉嫌侵权/违法的,请反馈,一经查实立刻删除内容。本文内容由快快网络小滢创作整理编辑!