01.HashMap源码学习整理思维导图

01.HashMap源码学习整理思维导图

蚂蚁课堂

参考学习视频资料: http://www.mayikt.com/

/** * 基于数组实现HashMap * * @author zx * @date 2021年05月05日 13:37 */
public class ArrayHashMap<K, V> {
   
    //先不考虑扩容 HashMap 初始容量为16. ;
    // 第一次;当存放的值 16*0.75 =12(容量 * 0.75) 进行扩容,扩容后得到的容量大小为: 16<<1 = 32;
    //第二次: 当存放的值32*0.75 = 25 进行扩容 ,扩容大小 32 << 1 = 64
    private final Entry[] entries = new Entry[1000];

    /** * 添加元素 * * @param k key值 * @param v value值 */
    public void add(K k, V v) {
   
        int index = hash(k);
        Entry oldEntry = entries[index];
        if (oldEntry == null) {
   
            entries[index] = new Entry<>(k, v);
        } else {
   
            if (index == 0) {
   
                entries[index] = new Entry<>(k, v);
            }
            oldEntry.next = new Entry<>(k, v);
        }
    }

    /** * 根据key值获取对应的value * * @param k key值 * @return 返回对应key的value值 */
    public V get(K k) {
   
        int index = hash(k);
        for (Entry oldEntry = entries[index]; oldEntry != null; oldEntry = oldEntry.next) {
   
            //hashcode相同,我们需要比较内容值
            if ((k == null && oldEntry.key == null) || oldEntry.key.equals(k)) {
   
                return (V) oldEntry.value;
            }
        }
        return null;
    }

    /** * 遍历Map */
    public void list() {
   
        if (entries == null) {
   
            System.out.println("集合中没有存放元素,不能为遍历");
        }
        for (Entry entry : entries) {
   
            if (entry != null) {
   
                Entry temp = entry.next;
                while (temp != null) {
   
                    System.out.println(temp.key + "---" + temp.value);
                    temp = temp.next;
                }
                System.out.println(entry.key + "---" + entry.value);
            }
        }
    }


    /** * 计算hash值 * * @param key key值 * @return hash值 */
    static int hash(Object key) {
   
        int h;
        return (key == null) ? 0 : (h = key.hashCode()) ^ (h >>> 16);
    }


    private static class Entry<K, V> {
   
        K key;
        V value;
        Entry<K, V> next;

        public Entry(K key, V value) {
   
            this.key = key;
            this.value = value;
        }

        @Override
        public String toString() {
   
            return "Entry{" +
                    "key=" + key +
                    ", value=" + value +
                    '}';
        }
    }

    public static void main(String[] args) {
   
        ArrayHashMap<Object, Object> map = new ArrayHashMap<>();
        map.add(null, "null value");
        map.add(null, "null value2");
        map.add("a", "a is hashcode 97");
        map.add(97, "97 is hashcode 97");
        map.add(98, "98 is hashcode 98");
        map.add("b", "b is hashcode 98");
        System.out.println("------------------");
        map.list();
        System.out.println("------------------");
        System.out.println(map.get(null));
        System.out.println(map.get("a"));
        System.out.println(map.get(97));
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/100717.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • floyed详解[通俗易懂]

    floyed详解[通俗易懂]显然Floyed算法是一个简短而好理解的算法,这里指的好理解是因为Floyed的代码长度不大,实在没理解都可以背下来,所以说是好理解,实际上是真的好理解吗?我们来看看最基础的FloyedFloyed是什么?自然是用来求多源最短路的啦,时间效率是O(n^3),有人会问那我不对每个点做一遍SPFA或dijkstra堆优化,时间效率是O(n^2logn)那不是快很多?实际上因为Floyed

    2022年6月16日
    22
  • linux中的清屏命令_shell清屏

    linux中的清屏命令_shell清屏DOS时代,列出目录的命令是dir,清屏的命令是cls。在Linux中类似的命令分别为ls和clear,如果不习惯,我们可以用别名来使用相同的命令:[blackrose@localhost~]$aliasdir=’ls-l'[blackrose@localhost~]$dir总用量36drwxr-xr-x.2blackroseblackrose40962月131…

    2022年10月23日
    0
  • Python获取时间戳_Python中文当前时间

    Python获取时间戳_Python中文当前时间原博文2019-01-0410:42−#!/usr/bin/python#-*-coding:UTF-8-*-importtime;#引入time模块ticks=time.time()print(“当前时间戳为:”,ticks)输出:当前时间戳为:1459994552.51&nbsp…相关推荐2019-12-0610:29−1.获取当前时间的时间…

    2022年10月2日
    0
  • redflag linux7.0 grub引导终极原创

    redflag linux7.0 grub引导终极原创很多同志在安装redflag时,安装引导时选了将引导安装在根分区而不是MBR分区,所以开机时还是只能进入XP系统而不能进入Linux系统其实要解决这个问题,引导进入redflag很简单,只要在xp下的C盘中找到menu.ls这个文件,用记事本找开,在其中添加title红旗Linux桌面7root(hd0,8)kernel/boot/vmlinuz-2.6….

    2022年8月20日
    4
  • 如何激活成功教程SQLyog 企业版,无限期试用[通俗易懂]

    如何激活成功教程SQLyog 企业版,无限期试用[通俗易懂]如何激活成功教程SQLyog企业版,无限期试用SQLyog是一个功能强大,界面简洁大方的MysqlGUI客户端。截止到这篇博客日期2009-08-15,sqlyog8.13已经释出。其通用版是免费的版本——已经是同类软件的佼佼者了但其打开、关闭软件提示画面,软件界面里灰色的不可用企业功能这是让人心里痒痒!网上也有不少的激活成功教程版,先不管其是否真的完美激活成功教程,这使用激活成功教程的软件总是叫人底气

    2022年9月23日
    0
  • 高德定位SDK_高德地图api使用教程

    高德定位SDK_高德地图api使用教程1.LocationManagerProxy获取当前Context创建一个LocationManagerProxy变量mAMapLocManager=LocationManagerProx

    2022年8月1日
    9

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号