• HashMap深入学习


    1.HashMap的数据结构:hash表.实现的方法:链表法.即数组+链表.

                Entry[],默认的数组长度:16.数组中存放的是Entry.属性有key,value.next.hash

                是线程不安全的.可Map map=Collections.synchronizedMap(new HashMap());

                获得一个线程安全的map(一般不用)

      static class Entry<K,V> implements Map.Entry<K,V> {
           final K key;
            V value;
            Entry<K,V> next;
            int hash;

            /**
             * Creates new entry.
             */
            Entry(int h, K k, V v, Entry<K,V> n) {
                value = v;
                next = n;
                key = k;
                hash = h;
            }

    2.HashMap的存储:

          根据hash值确定存储位置.判断此位置上是否存在相同的hashcode和相同的key.都相同,新值覆盖旧值.

          hashcode相同,key不同则产生hash冲突.将新的,key,value.存入数组.next指向原来的地址.

          取这个值的时候需要遍历这个链表(降低查询效率)

          减小负载因子可以大大避免hash冲突,提高查询性能.但浪费内存空间

          默认负载因子0.75.数组长度16.即当map存储的个数大于16*0.75时.通过resize()方法去扩容为16的二倍,

          重新创建一个长度为32的数组.并将原来的数组元素重新hash.分配到新的Entry[]数组中.这个过程比较耗费性能.可根据数据大小特点,初始化数组长度.数组长度最好是2的n次幂.hash冲突的概率减小.即使不是,在扩容的时候自动扩容至2的n次幂

          hashtable中使用hashcode对length取模,取模用到除法运算,效率低

          hashMap中使用h&(length-1)实现均匀的散列

    3.hashMap的使用:

          若自定义的类作为key需要重写hashcode,equal方法

  • 相关阅读:
    linux ubuntu 现在显示的是ubuntu login
    stop-hbase.sh出现stopping hbasecat:/tmp/hbase-root-master.pid:No such file or directory
    hbase shell出现ERROR:Can't get master address from Zookeeper;znode data==null
    HADOOP:WARN util.NativeCodeLoader: Unable to load native-hadoop library for your platform... using builtin-java classes where applicable
    当Hadoop 启动节点Datanode失败解决
    数据挖掘步骤
    参加kaggle比赛
    招聘
    前端简历
    js和CSS3炫酷3D相册展示
  • 原文地址:https://www.cnblogs.com/2nao/p/6426907.html
Copyright © 2020-2023  润新知