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的查找效率降低。
                   

  • 相关阅读:
    设计模式(二):命令模式实例
    设计模式(一):简单工厂实例
    vue中使用base64进行加解密
    vue跨域问题解决(生产环境)
    彩色图像的直方图绘制及灰度图像均衡化
    MySql中添加用户,新建数据库,用户授权,删除用户,修改密码
    python办公入门2:开发准备工作
    python办公入门1:概述
    python菜鸟教程学习9:函数
    python菜鸟教程学习8:迭代器与生成器
  • 原文地址:https://www.cnblogs.com/huaxiaoyao/p/6865650.html
Copyright © 2011-2022 走看看