1.hash算法:是一种将任意长度消息压缩到某一固定长度的函数,主要应用于信息安全中的加密算法,hash值是将不同长度的信息转化成128位的编码。
2.HashMap:存键值对,系统根据哈希算法计算键值对的存储位置
Java集合实际上是多个引用变量的集合,这些引用变量指向实际的java对象。
HashMap < String , Double> map = new HashMap < String , Double>();
new出对象之后,每一个Java对象都有一个hashCode()方法,通过该方法获得HashCode值。
Map.Entry接口:每个接口都是一个键值对,存值的时候需要计算每个Entry的存储位置。当向HashMap中添加键值对时,由其 key 的 hashCode() 返回值决定该 key-value 对(就是 Entry 对象)的存储位置。当两个 Entry 对象的 key 的 hashCode() 返回值相同时,将由 key 通过 eqauls() 比较值决定是采用覆盖行为(返回 true),还是产生 Entry 链(返回 false)。
3.HashSet:系统采用Hash算法决定集合元素的存储位置

常见笔试面试题:
HashMap的实现采用了除留余数法形式的哈希函数和链地址法解决哈希地址冲突的方案
链表的结点设计如下:

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


next作为引用指向下一个记录。在HashMap中设计了一个Entry类型的数组用来存放Entry的实例即链表结点。
1.HashMap与Hashtable的区别:
HashMap可以接受null键值和值,而Hashtable则不能。
Hashtable是线程安全的,通过synchronized实现线程同步。而HashMap是非线程安全的,但是速度比Hashtable快
2.如果两个键的hashcode相同,你如何获取值对象
HashMap在链表中存储的是键值对,找到哈希地址位置之后,会调用keys.equals()方法去找到链表中正确的节点,最终找到要找的值对象
3.为什么String, Interger这样的wrapper类适合作为键?
String, Interger这样的wrapper类是final类型的,具有不可变性,而且已经重写了equals()和hashCode()方法了。其他的wrapper类也有这个特点。不可变性是必要的,因为为了要计算hashCode(),就要防止键值改变,如果键值在放入时和获取时返回不同的hashcode的话,那么就不能从HashMap中找到你想要的对象。
4.ConcurrentHashMap和Hashtable的区别
Hashtable和ConcurrentHashMap有什么分别呢?它们都可以用于多线程的环境,但是当Hashtable的大小增加到一定的时候,性能会急剧下降,因为迭代时需要被锁定很长的时间。因为ConcurrentHashMap引入了分割(segmentation),不论它变得多么大,仅仅需要锁定map的某个部分,而其它的线程不需要等到迭代完成才能访问map。简而言之,在迭代的过程中,ConcurrentHashMap仅仅锁定map的某个部分,而Hashtable则会锁定整个map。
5.HashMap的遍历
第一种:

Map map = new HashMap(); 
   Iterator iter = map.entrySet().iterator(); 
   while (iter.hasNext()) { 
   Map.Entry entry = (Map.Entry) iter.next(); 
   Object key = entry.getKey(); 
   Object val = entry.getValue(); 
   }


  效率高,以后一定要使用此种方式!
第二种:
 

Map map = new HashMap(); 
   Iterator iter = map.keySet().iterator(); 
   while (iter.hasNext()) { 
   Object key = iter.next(); 
   Object val = map.get(key); 
   }


  效率低,以后尽量少使用!
可是为什么第一种比第二种方法效率更高呢?
HashMap这两种遍历方法是分别对keyset及entryset来进行遍历,但是对于keySet其实是遍历了2次,一次是转为iterator,一次就从hashmap中取出key所对于的value。而entryset只是遍历了第一次,它把key和value都放到了entry中,即键值对,所以就快了。