zoukankan      html  css  js  c++  java
  • Java中HashMap的底层实现原理

      之所以总结这篇博客,是因为在华为技术面的时候被问到了这个问题,当时大脑一片空白,开始鹅叫,然后说了个不太了解。。。

    Java中的hashcode和equals

      1.关于hashcode

        1.hashcode的存在主要是用于查找的快捷性,如Hashtable,HashMap等,hashcode是用来在散列存储结构中确定对象的存储地址的

        2.如果两个对象相同,就是适用于equals方法,那么这两个对象的hashcode一定要相同

        3.如果对象的equals方法被重写,那么对象的hashcode也尽量重写,并且产生hashcode使用的对象,一定要和equals方法中使用的一致,否则就会违反上面提到的第二点

        4.两个对象的hashcode相同,并不一定表示两个对象就相同,也就是不一定适用于equals方法,只能够说明这两个对象在散列存储结构中,如hashtable,他们就是存放在同一个篮子里

      2.关于equals

        ==用于比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true,而在比较引用时,如果引用指向内存中的同一对象,结果为true。

        equals()作为方法,实现对象的比较。由于==运算符不允许我们进行覆盖,也就是说它限制了我们的表达,因此我们复写equals,达到比较对象内容是否相同的目的,这些是==运算符做不到的。

    HashMap的实现原理

      1.HashMap概述

        HashMap是基于哈希表的Map接口的非同步实现,此实现提供所有可选的映射操作。并允许使用null值和null键,此类不保证映射的顺序,特别是它不保证该顺序恒久不变。

        在java编程语言中,最基本的结构就是两种,一个是数组,另外一个是模拟指针(引用),所有的数据结构都可以用这两个基本结构来构造的,HashMap也不例外,HashMap实际上是一个链表散列的数据结构,     即数组和链表的结合体。

    /**              HashMap java源码
     * The table, resized as necessary. Length MUST Always be a power of two.
     */
    transient Entry[] table;
    
    static class Entry<K,V> implements Map.Entry<K,V> {
        final K key;
        V value;
        Entry<K,V> next;
        final int hash;
        ……
    }
  • 相关阅读:
    Azure存储账户的日志分析方法
    导出zabbix监控数据
    centos7下kubernetes(18。kubernetes-健康检查)
    centos7下kubernetes(17。kubernetes-回滚)
    unity接入安卓SDK,与安卓相互通信
    (转)坐标 旋转 计算
    矩阵运算试验
    photonServer学习之连接数据库
    C#委托链
    git命令大全
  • 原文地址:https://www.cnblogs.com/1996yrb/p/12858099.html
Copyright © 2011-2022 走看看