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));
    }
}
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

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

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能

    fsync mysql_使用O_DIRECT_NO_FSYNC来提升MySQL性能这篇文章很短,但很有价值~MySQL下InnoDB存储引擎有个innodb_flush_method只读参数,用户设置InnoDB的数据和redo日志文件flush行为。definesthemethodusedtoflushdatatoInnoDBdatafilesandlogfiles,whichcanaffectI/Othroughput.这是一个对性能和数据可…

  • WERTC-在Ubuntu中搭建ICE服务器

    WERTC-在Ubuntu中搭建ICE服务器1.ICE服务器介绍最近一段时间在做关于webrtc语音视频通话,网上免费的公开的STUN服务器可以用于测试,使用起来响应时间非常的慢,用起来不爽。作为一个有情怀的技术人员的我,就需要自己搭建了coturn服务器,现在分享给大家。前提先介绍一下ICE服务器,ICE服务器包含了STUN和TURN两部分,实际上我们就需要TURN服务器就可以进行P2P穿墙。coturn服务器是在turnserver上增加了部分高级特性(感谢项目作者,为我们提供了很好的环境)。coturn支持cp,udp,

  • 移动端HTML5开发心得「建议收藏」

    移动端HTML5开发心得「建议收藏」1,iOS里固定中有输入或者textarea,用户在里面输入文字,触发键盘,固定容器会客显示,而不是是连续悬浮   解决办法:http: //dwz.cn/CrwNz2,移动端点击时间300ms的延迟   解决办法:zepto.js或者百度touch.js或者是fastclick.js3,zepto的触摸问题:swipe事件在小米1等低端手机不支持基本不用zepto…

  • Mp4文件和3gp文件的区别「建议收藏」

    Mp4文件和3gp文件的区别「建议收藏」相同:3GP/MP4都是文件容器。不同:3GP是通信公司制定的规范主要用在手机上这种移动通讯设备上,所以对文件内包含的音视频编码格式定义的非常死.这样手机只要支持固定的几种codec就可以放3g

  • 华为面试内幕[通俗易懂]

    华为面试内幕[通俗易懂]华为面试内幕–写给想进华为的毕业生的话华为公司的面试过程分为5个环节:一面(技术)、二面(集体)、三面(性格测试)、四面(英语)、五面(综合)。通关者方可录用。这个流程表面上设计挺严谨的,还是某个著名公司设计的流程。但实际上华为

  • 股票开店理论+T+0滚动操盘法

    股票开店理论+T+0滚动操盘法

发表回复

您的电子邮箱地址不会被公开。

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