Map接口:键(key)值(value)对存储,是双列集合。
(键不可以重复,值可以重复)
Map接口有三个实现类:
1、HashMap (线程不安全,hash表+红黑树+链表结构)
2、TreeMap(底层红黑树实现)
3、Hashtable(线程安全)
HashMap常用方法
1、put方法向HashMap集合中添加元素
HashMapmap=new HashMap<>(); map.put("a", "a"); map.put("b", "a"); map.put("c", "a"); map.put("a", "ss");
底层数组用来定位元素位置,元素Hash值除以数组长度=位置,但有可能不同元素的不同的Hash值计算出的位置却是一样的,所以用链表来存储相同位置元素。
put方法具体过程:当向其中添加元素时,先用Key值计算出Hash值,通过hash算法计算出此元素在hash数组中的位置,如果这个位置上没有元素,则直接将其插入(Node),当我们在此插入值时,如果计算出的位置上已经有了元素,则直接向元素的下一位添加(此时是链式结构),当这个链表长度等于八时,链表自动转化为红黑树(当我们删减元素时,如果删到链表长度为6时,则红黑树自动有转换会链表),当哈希数组的长度被使用了0.75倍时,hash数组会进行2倍扩容(数组长度必须为2的倍数,相当于我们舍弃了一部分空间来换取了效率)。
注:当元素插入位置已有元素时,会有三种情况:
有重复元素(键),则只替换值即可。
链表,直接向后插入即可。
红黑树,直接添加即可。
要注意,以上的代码实现均是源码底层put方法已实现好的,我们只需了解清除原理即可。
2、其他常用方法:
//常用方法 map.remove("a");//由key值来删除整对 System.out.println(map.get("b"));//通过key来找value,返回的是value值 map.containsKey("b");//判断有没有这个键 map.containsValue("a");//判断有没有这个值 Setkset=map.keySet();//此方法返回的是这个HashMap的所有key,用set集合来存储,值不可以重复 Collection list=map.values();//返回这个的Map集合的值
总之,HashMap中的put方法值得我们去深思。
TreeMap:底层红黑树实现,key所在类必须实现Comparable接口,可以按照值自然顺序排序,
也是键值两列,其余与TreeSet类似。
HashTable:线程安全的,其中不能存储key为null的元素,底层也是hash结构,但他是线程安全的,在并发量较低的情况下使用。
Map集合的迭代问题:
增强for:
HashMapmap=new HashMap<>(); map.put("a", "a"); map.put("b", "a"); map.put("c", "a"); map.put("a", "ss"); //第一种遍历方式 遍历:指找到所有key和value Set set=map.keySet();//先获取所有键 for(String key:set){ System.out.println(key+"="+map.get(key));//通过键来找值 }
通过Entry类来遍历Map集合(建议使用):
map底层为了方便遍历,将键和值都存入了一个Entry对象中,并将多个Entry对象即多个元素放到一个Set集合中,当我们要使用时,直接调用Map中的entryset方法获得这个集合即可。
Set> entrySet=map.entrySet();//获得这个Entry集合 for(Map.Entry s:entrySet){ System.out.println(s.getKey()+"="+s.getValue()); }
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)