HashMap的put原理是这样的:
  1、首先对key采用hashCode()方法进行散列化,是将key转换生成一个int值,相同的key肯定会生成相同的int值,并对该int值进行hash计算得到hash值。
  2、通过hash值得到Entry数组的下标,然后通过该下标,得到已经存入的数据,将已经存入的数据的key和hash进行比对,若相同证明是重复,则忽略。
  3、若不相同,则通过addentry()方法将数据存入该数组的下标中,同时存入的还有key、hash值。
  用一句话说来是,通过待存入的key的hash值计算出数组的下标,并根据该下标提取已经存入的值,将两者进行比对,若相同则忽略,不同则put进去。
  现在知道为什么Map中的key是性的原因了吧? 这与Map在put时兢兢业业检查的努力是分不开的。
  假设有一个key为1,value为"zhangSan",经过hash之后成为101,那么这个101作为数组的下标,然后将hash=101、key=1及value="zhangSan"的值封装成实体对象存放到该数组的101下标处。因为不同的key会产生不同的hash值,这也是为什么HashMap不排序的原因!
  get:
public V get(Object key)  {
if (key == null)
return getForNullKey();
int hash = hash(key.hashCode());
for (Entry<</SPAN>K,V> e = table[indexFor(hash, table.length)];
e != null;
e= e.next)  {
Object k;
if (e.hash == hash && ((k = e.key) == key || key.equals(k)))
return e.value;
}
return null;
}
  那么通过key提取值时,当然先要通过该key计算出hash值来,再通过这个hash值作为下标提取出对应的实体对象所容纳的value来。
  同时加了必要的判断来确保提取出正确的数值来。
  哈哈,在一个确定的城市里,领到了一个确定的门牌号,相比在茫茫人海中漫无目的的捞针,知道为何提取数据如何之快了吧!