andorid中面试汇总宝典---hashmap原理

来源:互联网 发布:短信轰炸软件免费版 编辑:程序博客网 时间:2024/06/18 04:13

    前一段由于换工作,CSDN文档分享写的也比较少,从今天开始我会把这段时间面试中遇到的比较重要,或者是必须要掌握的知识给大家一一汇总,并进行逐个讲解,由于知识比较多,会持续更新,有需要了解的可以持续关注我的博客。

    第一个比较重要的常常会问到的一个问题就是关于,hashmap的原理,hashmap如何扩容,以及和其他map的比较,接下来会根据这些问题具体讲解。

首先要讲的是hashmap的原理。

    hashmap是基于哈希表的Map接口的非同步实现,主要是有数组和链表组成,允许使用null值和null键,并不保证顺序。

hashmap创建时底层实质是一个数组结构,数组中的每一项又是一个链表结构。简单地说,HashMap在底层将 key-value当成一个整体进行处理,这个整体就是一个 Entry对象。HashMap底层采用一个 Entry[]数组来保存所有的 key-value对,当需要存储一个 Entry对象时,会根据hash算法来决定其在数组中的存储位置,在根据equals方法决定其在该数组位置上的链表中的存储位置;当需要取出一个Entry时,也会根据hash算法找到其在数组中的存储位置,再根据equals方法从该位置上的链表中取出该Entry

    hashmap如何扩容,hanshmap扩容是自动扩容的,不是我们通过设置的,是通过risize()方法来

voidresize(intnewCapacity) {

   Entry[] oldTable = table;

   intoldCapacity = oldTable.length;

   if(oldCapacity == MAXIMUM_CAPACITY) {

       threshold = Integer.MAX_VALUE;

       return;

   }

   Entry[] newTable =newEntry[newCapacity];

   transfer(newTable);

   table = newTable;

   threshold = (int) (newCapacity * loadFactor);

}


其实就是新建一个大的数组,把原来的数据重新添加进去。什么时候才会触发resize方法呢?当当前元素的数量达到数组总size的loadFactor(默认0.75)时候,会调用resize方法,将数组扩大为原来大小的2倍;
  最后说一下,hashmap和hashtable 以及hashset的区别
一:HashMap与HashTable的区别 
   1.hashmap是非同步,而hashtable是同步的线程安全的。
   2.HashTable不允许null值(key和value都不可以) ,HashMap允许null值(key和value都可以)。
3.hashmap是用Iterator进行遍历的,而hashtable是用Enumeration来进行遍历。
4.HashTable中hash数组默认大小是11,增加的方式是 old*2+1。HashMap中hash数组的默认大小是16,而且一定是2的指数
二HashMap与HashSet的区别,在网上看到一个网友的总结很到位就把区别用图的形式展出