HashMap:
构造方法:
HashMap的构造方法
前三种构造方法:
创建一个新的为空的HashMap
容量:集合中当前可存储的元素个数的最大值,在使用第二和第三种构造方法时,指定的初始容量应当为2的n次方数,像64,128,1024等,如果不是,HashMap会找到比这个数大且最接近的2的n次方作为集合的初始容量
负载因子:当集合中的元素个数达到了 当前容量*负载因子 时,对集合进行一次扩容
扩容:
每次扩容扩大到原来的两倍,方式是创建一个新的数组,然后再把原数组的元素拷贝过去。所以在知道所需的容量的大致范围或具体数量,建议使用第二种指定初始容量的构造方法。
第四种构造方法:
传入一个HashMap,拷贝到一个新的HashMap中。
常用方法:
添加
HashMap添加元素的方法
put(K,V) : 如果Key不存在,执行添加操作;如果key存在,则替换value
putIfAbsent(K,V) : 如果Key不存在,执行添加操作;如果key存在,则不做任何操作
putAll(Map map) : 把指定Map中的所有元素添加到当前的Map集合中来(注:这里的一个元素指的是一个Key - Value,Key存在与否的情况做和put()方法相同的操作)
查找
判断是否存在指定的Key
判断是否存在指定的Value
判断集合是否为空(是否不包含任何元素)
判断集合是否为NULL(有没有创建该集合)
map == null
删除
根据Key来删除Key - Value
第一种:删除后返回原本Key对应的Value值,可以是null;如果没有,也会返回null
第二种:删除指定的Key - Value,删除成功则返回true,反之返回false
删除所有的元素
获取当前集合长度
三种遍历方式
方法一:
通过keySet()方法,获取所有key的集合,再使用迭代器Iterator迭代每一个key,最后通过get(key)方法,来获取对应的value
Set keys = map.keySet();
Iterator iterator = keys.iterator();
while(iterator.hasNext()){//如果还有下一个key存在
Object key = iterator.next();//获取下一个key
Object val = map.get(key);//通过key获取value
}
方法二:
通过values()方法,获取所有value的集合(Collection,是List和Set的父接口,该类型下又iterator迭代器,可以用来迭代),通过iterator迭代出所有的value
Collection values = mao.values();
Iterator iterator = values.iterator();
while(iterator.hasNext()){
Object value = iterator.next();
}
方法三:
通过entrySet()方法,得到一个Entry对象的集合,使用Set种的迭代器,迭代每一个Entry对象,再针对每一个Entry对象,通过getKey()和getValue()方法,来分别获取对应的key和value
Set entrySet = map.entrySet();
Iterator iterator = entrySet.iterartor();
while(iterator.hasNext()){
Map.Entry entry = (map.Entry)iterator.next();//Entry是Map的内部类,这里创建一个Entry的指针接受迭代器返回的Entry对象
Object key = entry.getKey();
Object value = entry.getValue();
}
注意点
在选择上推荐使用第三种迭代方式,性能更高查询速度更快还方便,既能直接获取Key也能直接获取Value。
为什么没有使用forEach循环而使用iterator迭代器?
因为forEach是编译器提供的”语法糖”(在其他地方见过这个名称,forEach跟自动拆箱装箱类似,本质是对一段代码的简写,编译器在遇到时会自动进行代码的转译)的包装底层,在遍历集合类型数据时,是要求集合实现了Iterator接口的,个人看法,如果熟练,还是直接使用Iterator。