Java Map集合

Map双列数据,存储key-value数据 类似于函数y=f(x)
HashMap:作为Map的主要实现类,线程不安全的,效率高,可以存储null的key-value。
LinkedHashMap:保证在遍历的时候,可以按照添加的顺序遍历出来。原因:在原有的HashMap底层上添加了一对前后指针,分别指向前一个元素与后一个元素,对于频繁的遍历操作,此类Map效率高于HashMap
TreeMap:保证按照添加的key-value元素进行排序,实现排序遍历(按照key进行自然排序或定制排序)
HashTable:作为古老的实现类,线程是安全的,效率低,不能存储null的key-value
Properties:常用来处理配置文件。key-value都是String类型

面试题:
1.HashMap的底层实现原理?(以jdk7为例说明)
HashMap map = new HashMap();
在实例化之后,底层创建了长度是16的一维数组Entry[] table
map.put(key1,value1);
首先,调用key1所在类的hashCode()计算key1的哈希值,此哈希值经过某种算法计算之后,得到存放在Entry数组中的下标位置
情况一:如果该位置上的数据为空,则直接添加到这个位置,key1-value1添加成功。
如果该位置上已经存在数据,(意味着该位置上可能存在一个或多个数据(以链表的形式存放),此时比较key1与该位置上一个或多个数据的哈希值:
情况二:如果该位置上数据的哈希值与key1的哈希值都不相同,则此时key1-value1添加成功
情况三:如果该位置上某一个数据key2-value2的哈希值与key1的哈希值相同,则继续调用key1所在类的equals方法继续进行比较,若equals()返回false(意味着key1与该数据只是哈希值相同,key值并不相同)则此时添加成功;若equals()返回ture(意味着key1不仅与该数据哈希值相同,而且key值也相同,因为key是不可重复的)那么将会用value1去替换value2
补充:关于情况一,情况二:此时key1-value1和原来的数据以链表的方式存储,在不断添加的过程中,会涉及到扩容问题,默认的扩容方式是扩容为原来的2倍,并将原有的数据复制过来

jdk8相比jdk7在底层实现方面的不同:
1.new HashMap():在底层没有创建一个长度为16的Entry[]数组
2.jdk8底层的数组数 Node[] 而非 Entry[]
3.当第一次调用put方法的时候,底层才会创建长度为16的数组
4.jdk7底层数据结构为数组+链表。jdk8底层数据结构为数据+链表+红黑树,当数组的某一个索引位置上的元素以链表形式存在的数据个数超过8且当前数组的长度大于64时,该索引位置上的所有数据将转换为红黑树存储。

@Test
    public void test01(){
        Map map = new HashMap();
        map.put("kangkang","康康");
        map.put("kkang","康康");
        map.put("kangk","康康");
        map.put("kk","康康");

        //遍历key集 keySet()
        Set set = map.keySet();
        Iterator iterator = set.iterator();
        while (iterator.hasNext()){
            System.out.println(iterator.next());
        }
        System.out.println("-------------");

        //遍历value集 values()
        Collection values = map.values();
        Iterator iterator1 = values.iterator();
        while (iterator1.hasNext()){
            System.out.println(iterator1.next());
        }
        System.out.println("-------------");

        //遍历key-value集 entrySet()
        Set entrySet = map.entrySet();
        Iterator iterator2 = entrySet.iterator();
        while (iterator2.hasNext()){
            Object next = iterator2.next();
            Map.Entry entry = (Map.Entry) next; //可将遍历出来的key-value对强转成Entry数组
            System.out.println(entry.getKey()+"->"+entry.getValue()); //然后可以分离取得key与value
        }
    }

运行结果如下所示:

kk
kangkang
kangk
kkang
-------------
康康
康康
康康
康康
-------------
kk->康康
kangkang->康康
kangk->康康
kkang->康康
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值