Map集合以及Collectuions工具类的使用


前言

  继之前我们对Collection接口的了解,我们今天继续学习另外一个集合接口Mao接口,Map接口主要是为了存储键值对,我们的日常使用中,免不了和Map打交道,那就让我们一起来了解下吧

一、Map集合

1.结构和特点

|----------Map:双列数据,存储键值对数据
   |------------HashMap:主要实现类,线程不安全,效率高,存储key和value
     |------------LinkedHashMap:保证遍历Map元素时,能够按照添加顺序遍历( 原因:在HashMap的结构基础上,添加了一对指针,指向前一个和后一个元素),对频繁的遍历操作效率要高于HashMap
   |------------TreeMap:按照添加的顺序进行排序,实现排序遍历
   |------------Hashtable:古老的实现类,线程安全,效率低,不能存储key和value
     |------------Properties:用来处理配置文件,key和value都是String类型

   Map的结构理解:

    Map中的key:无序的,不可重复的,使用Set存储 ----->key所在的类需要重写equals()和hashCode()
     Map中的value:无序的,可重复的,使用Collection存储 ------->value所在的类要重写equals()
     Map中的Entry是无序的,不可重复的,用Set存储

2.HashMap的底层实现原理

HashMap的底层实现原理:
以存储key1-value1为例,首先通过计算key1的哈希值来确定key1在Entry数组上的位置,如果key1的哈希值和原有的key的哈希值不相同时,添加成功
如果key1的哈希值与已存在的某一个key的哈希值相同时,调用key1所在类的equals(),如果返回flase,添加成功,返回true时,value1将替换原有的value;

当key1和原有的key的哈希值相同时,此时key1-value1和原来的数据通过链表的方式来存储

默认的扩容方式:扩容为原来的2倍,并将原来的数据复制过来

3. jdk8的底层与jdk7的底层的不同点

创建HashMap对象的时候,并没有创建一个长度为16的数组
jdk8底层的数组是node[],不是Entry[]
jdk8首次调用put方法时,会创建一个长度为16的数组
jdk7的的底层是数组加链表,jdk8的底层是数组+链表+红黑树,当数字的一个索引位置上的元素以链表的形式存储的个数>8且当前数组的长度>64时,此索引上的所有的数据改用红黑树来进行存储

4.常用方法(以HashMap为例)

  • Object put(Object key,Object value):将指定的key-value添加到Map中
  • void putAll(Map m):将m中所有的key-value添加到Map中
  • Object remove(Object key):删除指定的key-value
  • void clear():清空当前Map中的所有数据
  • Object get(Object key):获取指定key相应的value
  • boolean containsKey(Object key):是否包含指定的key
  • boolean containsKey(Object key):是否包含指定的value
  • int size():返回map中的键值对的个数
  • boolean isEmpty():判断当前map是否为空
  • boolean equals(Object obj):判断当前map和参数对象obj是否相等
  • Set keySet():返回所有的key组成的集合
  • COllection values():返回所有的values组成的集合
  • Set EntrySet():返回所有键值对组成的Set集合

代码如下(示例):

@Test
    public void test1(){
        Map map = new HashMap();
        Map map1 = new HashMap();
        map.put("a","Aa");
        map.put(123,"abc");
        map.put("b","Bb");
        System.out.println(map);
        System.out.println("**************");
        map1.put(1,"a");
        map1.put(2,"b");
        map1.put(3,"c");
        System.out.println(map1);
        System.out.println("**************");
        map.putAll(map1);
        map1.remove(2);
        System.out.println(map);
        System.out.println(map1);
        System.out.println("**************");
        System.out.println(map.get(123));
        System.out.println(map1.containsKey(3));
        System.out.println(map.size());
        System.out.println(map.isEmpty());
        System.out.println("**************");
        System.out.println(map.keySet());
        System.out.println(map1.values());
        System.out.println(map.entrySet());
    }

代码结果如下:

在这里插入图片描述

二、Collections工具类

Collections是一个操作Set、List、Map的工具类

1.常用方法

  • reverse(List):反转List中元素的顺序
  • shuffle(List):对List集合元素进行随机排序
  • sort(List):根据元素的自然排序对指定的List集合元素按升序排序
  • swap(List,int i,int j):将指定的List集合中的i处元素和j处元素进行交换
  • Object max(Collection):根据元素的自然顺序,返回最大的元素
  • Object max(Collection,Comparator):根据指定的顺序,返回最大的元素
  • Object min(Collection):根据元素的自然顺序,返回最小的元素
  • Object max(Collection,Comparator):根据指定的顺序,返回最小的元素
  • int frequency(Collection,Object):指定集合中指定元素出现的频率
  • void copy(List dest,List src):将src中的内容复制到dest中
  • boolean replaceAll(List list,Object oldObj,Object newObj):将list集合中的

2.代码示例

代码如下(示例):

@Test
    public void test1(){
        List list = new ArrayList();
        list.add(124);
        list.add(3421);
        list.add(2131);
        list.add(-1312);
        list.add(12);
        list.add(0);
        list.add(1234);
        System.out.println(list);
        System.out.println("**************");
        Collections.reverse(list);
        System.out.println(list);
        System.out.println("**************");
        Collections.shuffle(list);
        System.out.println(list);
        System.out.println("**************");
        Collections.sort(list);
        System.out.println(list);
        System.out.println("**************");
        Collections.swap(list,1,2);
        System.out.println(list);
        System.out.println("**************");
    }

代码结果如下:
在这里插入图片描述

代码如下(示例):

@Test
    public void test2(){
        List list = new ArrayList();
        list.add(1234);
        list.add(3421);
        list.add(2131);
        list.add(-1312);
        list.add(1234);
        list.add(0);
        list.add(1234);
        int frequency = Collections.frequency(list,1234);
        System.out.println(list);
        System.out.println(frequency);
        System.out.println("*********************");
        List dest = Arrays.asList(new Object[list.size()]);
        Collections.copy(dest,list);
        System.out.println(dest);
        System.out.println("*********************");
        Collections.replaceAll(list,1234,1111);
        System.out.println(list);
    }

代码结果如下:

在这里插入图片描述

Collections工具类还有一些以synchronized开头的方法,来是的线程和集合之间的联系更见紧密
//返回的list1即为线程安全的list
List list1 = Collections.synchronizedList(list);

总结

以上便是对Map接口和Collections工具类的记录和理解了,希望能够帮到大家。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值