java中的Map接口以及实现类

一.Map接口概述

Map接口:双列数据,存储key-value对的数据。

1.HashMap作为Map的主要实现类,线程不安全的,效率高,可以存储null的key和value。

HashMap底层:数组和链表(jdk7)数组,链表和红黑树(jdk8)

HashMap的内部类:Node

static class Node<k,v> implements Map.Entry<k,v>{

        final int hash;
        final k key;
        v value;
        Node<k,v> next;
}

HashMap源码中的重要的常量:

                                                 DEFAULT_INITIAL_CAPACITY:HashMap的默认容量,16

                                                 MAXIMUM_CAPACITY:HashMap的最大支持量,0.75

                                                 DEFAULT_LOAD_FACTOR:HashMap的默认加载因子

                                                 TREEIFY_THRESHOLD:Bucket中链表长度大于该默认值,转化为红黑树,8

                                                  UNTREEIFY_THREHOLD:Bucket中红黑树存储的Node小于该默认值,转化为链表

                                                  MIN_TREEIFY_CAPACITY:桶中的Node被树化时最小的Hash表容量,64

                                                  table:存储元素的数组,总是2的N次幂

                                                  entrySet:存储具体元素的集

                                                  size:HashMap中存储的键值对的数量

                                                  modCount:HashMap扩容和结构改变的次数

                                                  threshold:扩容的临界值,等于容量加填充因子,12

                                                 loadFactor:填充因子

2.LinkedHashMap:是HashMap的子类,保证在遍历map元素时,可以按照添加的顺序实现遍历,对于频繁的遍历操作,它的执                                  行效率高于HashMap.

                       原因:在原有的HashMap底层结构的基础上,添加了一对指针,指向前一个和后一个元素。

LinkedHashMap中的内部类:Entry

static class Entry<k,v> extends HashMap.Node<k,v>{
        Entry<k,v> before,after;//能够记录添加元素的先后顺序
        Entry(int hash,k key,v value,Node<k,v> next){
           super(hash,key,value,next);
}
}

3.TreeMap:保证按照添加的key-value对进行排序,实现排序遍历,此时考虑key的自然排序或者定制排序。底层使用红黑树

                    向TreeMap中添加key-value对,要求key必须是由同一个类创建的对象,因为是按照key进行排序的。

4.Hashtable作为古老的实现类,线程安全,效率低,不可以存储null的key和value。底层都使用哈希表结构,查询速度快。

5.Properties:是Hashtable的子类,常用来处理配置文件。key和value都是String类型的。存取数据时,建议使用setProperty(String key,String value)和getProperty(String key)

Properties pros = new Properties();
pros.load(new FileInputStream("jdbc.properties"));
String user = pros.getProperty("user");
System.out.println(user);

二.Map结构的理解

Map中的key:是无序的,不可重复的,使用Set存储所有的key  --->key所在的类要重写equals()和hashCode()(以HashMap为例)

Map中的value:是无序的,  可重复的,使用Collection存储所有的value。 --->value

所在的类要重写equals()

一个键值对:key-value构成了一个Entry对象。

Map中的Entry:是无序的,不可重复的,使用Set存储所有的Entry。

三.Map接口的常用方法

  • 添加,删除,修改操作

Object put(Object key,Object value):将指定key-value添加到(或修改)当前map对象中

void putAll(Map m):将m中的所有key-value对存放到当前map中

Object remove(Object key):移除指定key的key-value对,并返回value

void clear():清空当前map中的所有数据

 Map map = new LinkedHashMap();
        map.put(123,"AA");
        map.put("12","BB");
        map.put(3,"CC");
        map.put(6,4);
        System.out.println(map);
        Map map1 = new LinkedHashMap();
        map1.put(8,"CC");
        map1.put(9,0);
        map.putAll(map1);
        System.out.println(map);
       Object value =  map.remove("CC");
        System.out.println(map);
        System.out.println(value);
        map1.clear();
        System.out.println(map1.size());
  • 元素查询的操作

Object get(Object key):获取当前集合的元素

boolean containsKey(Object key):是否包含指定的key

boolean containsValue(Object value):是否包含指定的value

int size():返回map中key-value对的个数

boolean IsEmpty():判断当前map是否为空

boolean equals(Object obj):判断当前map和参数对象obj是否相等

 Map map2 = new HashMap();
        map2.put(123,"AA");
        map2.put("12","BB");
        map2.put(3,"CC");
        map2.put(6,4);
        Object obj = map2.get(6);
        System.out.println(obj);
        boolean isExist = map2.containsKey("12");
        System.out.println(isExist);
       System.out.println( map2.containsValue(4));
       boolean bool = map2.equals(map);
       System.out.println(bool);
  • 元视图操作的方法

Set keySet():返回所有key构成的Set集合

Collection values():返回所有value构成的Collection集合

Set entrySet():返回所有key-value对构成的Set集合

 Map map3 = new HashMap();
        map3.put(123,"AA");
        map3.put("12","BB");
        map3.put(3,"CC");
        map3.put(6,4);
       //遍历key值:keySet()
        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        //遍历所有的value
        Collection val = map3.values();
        for (Object ob : val){
            System.out.println(ob);
        }
        //遍历键值对
        Set se = map3.entrySet();
        Iterator iterator1 = set.iterator();
        while (iterator1.hasNext()){
            Object o = iterator1.next();
            Map.Entry entry = (Map.Entry)o;//se集合中的元素都是entry
            System.out.println(entry.getKey() +"dsdd" +entry.getValue() );
        }

猜你喜欢

转载自blog.csdn.net/weixin_44022886/article/details/90115979
今日推荐