在上节我们讲到equals()方法和hashCode()方法,如果真正搞懂这两个方法对我们学习HashMap是非常有作用的。 1.什么是散列集 我们知道链表和数组可以按照人们的意愿排列元素的次序。但是,如果想要查看某个指定的元素,却又忘记了它的位置,就需要访问所有元素,直到找到为止。如果集合中包含的元素很多,将会消耗很多时间。如果需要快速定位元素,可以使用另一种数据结构散列表(hash table)。散列表为每一个对象计算一个整数,这个整数就是我们在上节提到的散列码(hash code)。散列码是由对象的实例产生的一个整数。下图,我们看几个String类的实例产生的散列码:
字符串散列码“Lee”76268“lee”107020“eel”100300在Java中,散列表是用数组+链表实现的。每个列表成为桶(bucket)。要想查找表中对象的位置,就要先计算它的散列码,然后与桶的总数取余,所得到的结果就是保存这个元素的桶的索引。例如,如果某个对象的散列码为76282,并且有128个桶,对象应该保存在第108号桶中。如果在108号桶中没有其他的元素,则直接插入,此时如果在108号桶中存在元素,则以链表的的形式放在后面。 2.HashMap的简单用法
HashMap<Integer, String> map = new HashMap<Integer, String>(); //1.添加元素到集合 map.put(1,"jack"); map.put(2,"karrs"); map.put(7,"tom"); //2.获取元素 String val = map.get(2); //3.遍历map,这里使用其中一种方式,其他的方式读者可以百度查询 for(Map.Entry<Integer,String> entry:map.entrySet()){ System.out.println("Key:" + entry.getKey() + " Value:" + entry.getValue()); } //4.移除元素 map.remove(2); //5.清空集合 map.clear();3.HashMap使用注意事项
散列冲突:当两个对象的散列码对桶的总数取余后得到的值可能会一样,这种现象就叫做散列冲突。简而言之,就是A对象通过自己散列码取余取找桶的位置,发现该位置已经被B占用了。在HashMap中如果该位置被占用,就会以链表的形式插到后面。如果想要更多地控制列表的运行性能,就要指定初始的桶数。同时散列码需要散列随机合理的分布。如果散列表太满,就需要在散列(rehashed)。这时会创建一个桶数更多的表,并将这些元素插入到这个新表中,然后丢弃原来的表。装载因子(load factor):在HashMap中,装载因子默认是0.75,如果表中超过75%的位置已经填入元素,这个表就会用双倍的桶数自动地进行在散列。java集合–HashMap(三)