zoukankan      html  css  js  c++  java
  • JAVA中hashmap的分析

    http://blog.csdn.net/luanlouis/article/details/41576373?utm_source=tuicool&utm_medium=referral 学习到了java中hashmap的内部原理,非常不错的文章,非常感谢作者的奉献.以下为主要内容摘录.

    java/scala/c# 语言之中,class 都会含有hashcode,equals之类的方法,这是为什么?
    数组和链表的区别是什么?在编程开发中应该如何使用?
    在HashMap内部,采用了数组+链表的形式来组织键值对Entry<Key,Value>。
    HashMap内部维护了一个Entry[] table 数组,当我们使用 new HashMap()创建一个HashMap时,Entry[] table 的默认长度为16。Entry[] table的长度又被称为这个HashMap的容量(capacity);
    对于Entry[] table的每一个元素而言,或为null,或为由若干个Entry<Key,Value>组成的链表。HashMap中Entry<Key,Value>的数目被称为HashMap的大小(size);
    Entry[] table中的某一个元素及其对应的Entry<Key,Value>又被称为桶(bucket);    
    HashMap内部实现原理是什么?有关hashcode,它是使用数组加链表的数据结构的一个经典使用.
    Entry<key,value> ,bucket,loadfactor
    size>capacity*loadfactor(0.75) then capacity*2
    为了提高HashMap的性能:
    1.在使用HashMap的过程中,你比较明确它要容纳多少Entry<Key,Value>,你应该在创建HashMap的时候直接指定它的容量;
    2. 如果你确定HashMap的使用的过程中,大小会非常大,那么你应该控制好 加载因子的大小,尽量将它设置得大些。避免Entry[] table过大,而利用率觉很低。
    HashMap在确定Key是否在HashMap中存在的要求有两个:
    1. Key值是否相等;
    2. hashcode是否相等;
    所以我们在定义类时,如果重写了equals()方法,但是hashcode却没有保证相等,就会导致当使用该类实例作为Key值放入HashMap中,会出现HashMap“工作异常”的问题,会出现你不希望的情况。
    1. HashMap是线程不安全的,如果想使用线程安全的,可以使用Hashtable;它提供的功能和Hashmap基本一致。HashMap实际上是一个Hashtable的轻量级实现;
    2. 允许以Key为null的形式存储<null,Value>键值对;
    3. HashMap的查找效率非常高,因为它使用Hash表对进行查找,可直接定位到Key值所在的桶中;
    4. 使用HashMap时,要注意HashMap容量和加载因子的关系,这将直接影响到HashMap的性能问题。加载因子过小,会提高HashMap的查找效率,但同时也消耗了大量的内存空间,加载因子过大,节省了空间,但是会导致HashMap的查找效率降低。
                   

  • 相关阅读:
    CCF_ 201403-2_窗口
    CCF_201503-2_数字排序
    [loj3346]交换城市
    [cf516E]Drazil and His Happy Friends
    [cf505E]Mr. Kitayuta vs. Bamboos
    [loj3343]超现实树
    [loj3331]选课
    [loj3342]制作菜品
    [loj3156]回家路线
    [loj3339]美食家
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/6865650.html
Copyright © 2011-2022 走看看