哈希表就是一种以键-值(key-indexed)存储数据的结构,只要输入待查找的值即key,即可查到其对应的值。
哈希的思路就是,如果所有的键hashCode都是整数,那么久可以使用一个简单数组来实现:将键作为索引,值即为其对应的值,这样就可以快速访问任意键的值。
简单的计算方法
hashcode%数组长度=【0,数组的长度-1】。
它提供了一组键值的映射。其中存储的每个数据对象都有一个响应的键key,键决定了值对象在Map中的存储位置。键应该是唯一的,不允许重复,每个key只能映射一个value。
Map接口的定义
public interface Mpa<K,V>
定义map对象时需要指定key和value对应的类型,必须是复杂类型,不能使用int。 map接口中有一个内部接口为Entry:interface Entry<K,V> 封装所存储的key-value对数据
interface Entry<K,V> {
K getKey(); 因为key决定数据的存放位置,一旦存储成功则key不允许修改
V getValue(); 针对value提供get/set方法
V setValue(V value);
//存储的数据应该是可以进行等值判断的,key不允许重复
boolean equals(Object o);
int hashCode();
}
结论:每个Entry对象中封装了一个key和value
另外Entry接口中通过静态方法提供了一组比较器的默认实现。
用于规范其中存放数据的规则,map中所存放的数据将给封装为一个一个的Entry,一个key/value对 对应一个Entry对象。
Map接口中常见方法
Object put(Object key,Object value):用来存放一个键-值对 Map中,如果出现key值冲突则后盖前。允许key值和value值为null,但是key值为null只能有一个,value值为null没有个数限制。
size():int 用于获取集合中的元素个数
Object remove(Object key): 根据key(键),移除键值对,并将值返回
boolean containsKey(Object key) :判断Map中是否存在某键key
clea(): 清空当前Map中的元素。
**boolean containsValue(Object value)**判断Map中是否存在某值value
另外Map提供了3种视图,分别是key所组成的set、value所组成的collection、key-value的Entry集合Set。
public Set keySet() :返回所有的键key,并使用Set容器存放,获取key值后就可以通过get方法获取key对应的值vlaue。
public Collection values(): 返回所有的值 Value ,并使用Collection存放。
public Set entrySet(): 返回一个实现Map.Entry 接口的元素 Set
1.通过key遍历整个map集合
Set<String> set = map.keySet();
for(String temp:set){
Integer val = map.get(temp);
System.out.println(temp+val);
}
2.获取所有的value,但是注意不能通过value直接获取key。
Collection<Integer> vals = map.values();
for(Integer temp:vals)
System.out.println(temp);
Set<Entry<String,Integer>> set2 = map.entrySet();
for(Entry<String,Integer> temp:set2)
System.out.println(temp.getKey()+temp.getValue());
3.forEach 和Lambda 表达式实现输出
Map map =new HashMap() ;
map.forEach((key,value)->{
System.out.println(key+value);
});
HashMap
类定义
public class HashMap<K,V> extends AbstractMap<K,V>
implements Map<K,V>, Cloneable,Serializable {
相关的常量值
static final int DEFAULT_INITIAL_CAPACITY=-1<<4; //aka 16 默认初始化容积
static final int MAXIMUM_CAPACITY =1<<30; //最大容积值
static final float DEFAULT_LOAD_FACTOR=0.75f; //默认的负载因子
具体的内部数据存储方式
static class Node<K,V> implements Map.Entry<K,V>{
final int hash;
final K key;
V value;
Node<K,V> next;
静态内部类用于实现Entry,HashMap中存放的key/value对就被封装为Node对象 。其中key就是存放的键值,用于决定具体的存放位置;value是具体存放的数据,hash就是当前Node对象的hash值,next用于指向下一个Node节点(单向链表)
具体存储数据的实现采用的是单向链