天天看点

JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类

JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类

版权声明:转载必须注明本文转自程序员杜鹏程的博客:http://blog.csdn.net/m366917

今天一觉醒来,朋友圈都是庆祝女排12后再次获得奥运冠军,有种精神叫做女排精神,学习女排,振兴中华。我们先让自己强大起来,整个祖国都会变的很强大

我们来继续学习集合的最后一个知识点,Map集合

Map集合

  • 概述
    • 将键映射到值的对象
    • 一个映射不能包含重复的键
    • 每个键最多只能映射到一个值
前面我们一直在学Collection集合,那么它和Map集合有什么区别呢?
  • Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对
  • Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍
  • 注意:
    • Map集合的数据结构值针对键有效,跟值无关
    • Collection集合的数据结构是针对元素有效

下面我们来了解Map集合的功能概述

  • 添加功能
    • V put(K key,V value):添加元素。
public class MapDemo {
    public static void main(String[] args) {
        // 创建集合对象
        Map<String, String> map = new HashMap<String, String>();
        System.out.println("put:" + map.put("马蓉", "王宝强"));
        System.out.println("put:" + map.put("马蓉", "宋喆"));
         // 输出集合名称
        System.out.println("map:" + map);
    }
}
           
我们来看输出结果:
JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类

第一次为什么是null呢?而第二次返回的是王宝强呢?最后奇怪的是马蓉和宋喆真像现实中一样。我来给大家说说这是为什么?

因为如果键是第一次存储,就直接存储元素,返回null

如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

现在明白了吧。

但是我们平时添加元素不是这样添加的,是下面这样

// 创建集合对象
        Map<String, String> map = new HashMap<String, String>();
        // 添加元素
        map.put("邓超", "孙俪");
        map.put("黄晓明", "杨颖");
        map.put("周杰伦", "昆凌");
        map.put("刘恺威", "杨幂");
        // 输出集合名称
        System.out.println("map:" + map);
           

输出结果:map:{邓超=孙俪, 周杰伦=昆凌, 黄晓明=杨颖, 刘恺威=杨幂}

我们继续

  • 删除功能
    • void clear():移除所有的键值对元素
    • V remove(Object key):根据键删除键值对元素,并把值返回

我们在上面添加元素的基础上来学习这个删除功能

map.clear();//会移除所有的键值对元素
    System.out.println("map:" + map);//map:{} //所以不建议使用

    //V remove(Object key):根据键删除键值对元素,并把值返回
    System.out.println("remove:" + map.remove("黄晓明"));
    System.out.println("remove:" + map.remove("黄晓波"));
    // 输出集合名称
    System.out.println("map:" + map);
           
根据键删除对于值的元素输出结果
JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类

我们发现当这个键存在的时候,删除会返回对应的值,

不存在的时候,删除会返回null

  • 判断功能
    • boolean containsKey(Object key):判断集合是否包含指定的键
    • boolean containsValue(Object value):判断集合是否包含指定的值
    • boolean isEmpty():判断集合是否为空
//boolean containsKey(Object key):判断集合是否包含指定的键
    System.out.println("containsKey:" + map.containsKey("黄晓明"));
    System.out.println("containsKey:" + map.containsKey("黄晓波"));
    // 输出集合名称
    System.out.println("map:" + map);
    //boolean isEmpty():判断集合是否为空
    System.out.println("isEmpty:"+map.isEmpty());
           
这个就比较简单了,判断集合是否包含指定的值,我就不说了,和键一样,给大家看一下输出结果
JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类
我们看到判断并不会影响他的输出结果
  • 长度功能
    • int size():返回集合中的键值对的对数
//这个也比较简单了
    System.out.println("size:"+map.size());//size:4
           

下面我们重点看一下Map的获取功能

  • 获取功能
    • V get(Object key):根据键获取值
    • Set keySet():获取集合中所有键的集合
    • Collection values():获取集合中所有值的集合
    • Set< Map.Entry< K,V>> entrySet():返回的是键值对对象的集合
public class MapDemo {
    public static void main(String[] args) {
        // 创建集合对象
        Map<String, String> map = new HashMap<String, String>();

        // 创建元素并添加元素
        map.put("邓超", "孙俪");
        map.put("黄晓明", "杨颖");
        map.put("周杰伦", "蔡依林");
        map.put("刘恺威", "杨幂");

        // V get(Object key):根据键获取值
        System.out.println("get:" + map.get("周杰伦"));
        System.out.println("get:" + map.get("周杰")); // 返回null

        // Set<K> keySet():获取集合中所有键的集合
        Set<String> set = map.keySet();
        for (String key : set) {
            System.out.println("key:"+key);
        }

        // Collection<V> values():获取集合中所有值的集合
        Collection<String> con = map.values();
        for (String value : con) {
            System.out.println("value:"+value);
        }
        // 获取所有键值对对象的集合
        Set<Map.Entry<String, String>> set1 = map.entrySet();
        // 遍历键值对对象的集合,得到每一个键值对对象
        for (Map.Entry<String, String> me : set1) {
            // 根据键值对对象获取键和值
            String key = me.getKey();
            String value = me.getValue();
            System.out.println(key + "---" + value);
        }
    }
}
           
这个还是很好理解的,最重要的就是遍历得到每一个键值对对象,看下输出结果
JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类

下面我们来看

Map子类

HashMap

  • HashMap类概述
    • 键是哈希表结构,可以保证键的唯一性
  • 常用案例
    • HashMap< String,String>
    • HashMap< Integer,String>
    • HashMap< String,Student>
    • HashMap< Student,String>
    • 上面的也不是非要是学生对象,可以是你需求的对象

LinkedHashMap

  • 概述
    • Map 接口的哈希表和链接列表实现,具有可预知的迭代顺序。
    • 由哈希表保证键的唯一性,不可重复
    • 由链表保证键盘的有序(存储和取出的顺序一致)

TreeMap

  • 概述
    • 键是红黑树结构,可以保证键的排序和唯一性
Map集合的知识点和它的子类我上面都将到了,下面我们来做道练习题吧
  • HashMap和Hashtable的区别?
public class HashtableDemo {
    public static void main(String[] args) {
         HashMap<String, String> hm = new HashMap<String, String>();    

        hm.put("android", "hello");
        hm.put(null, "world"); 
        hm.put("java", null); 
        System.out.println(hm);

        Hashtable<String, String> ht = new Hashtable<String, String>();
        ht.put("android", "hello");
        ht.put(null, "world"); //NullPointerException
        ht.put("java", null); // NullPointerException
        System.out.println(ht);
    }
}
           

在输出结果中:HashMap会打印出{null=world, java=null, android=hello}

而在Hashtable中会报错

所以我们就能得出他们的区别

  • HashMap:线程不安全,效率高。允许null键和null值
  • Hashtable:线程安全,效率低。不允许null键和null值

我们再来学习一个知识点

Collections类

我们之前学习了Collection,那么它和Collections有什么区别呢。

我们先来了解Collections类,然后在来说他们之间的区别

  • Collections类概述
    • 针对集合进行操作的工具类,都是静态方法。
  • Collection和Collections的区别
    • Collection:是单列集合的顶层接口,有子接口List和Set。
    • Collections:是针对集合操作的工具类,有对集合进行排序和二分查找的方法
  • Collections成员方法
    • public static < T> void sort(List list):排序 默认情况下是自然顺序。
    • public static < T> int binarySearch(List< ?> list,T key):二分查找
    • public static < T> T max(Collection< ?> coll):最大值
    • public static void reverse(List< ?> list):反转
    • public static void shuffle(List< ?> list):随机置换

我们来练习一下

public class CollectionsDemo {
    public static void main(String[] args) {
        // 创建集合对象
        List<Integer> list = new ArrayList<Integer>();

        // 添加元素
        list.add();
        list.add();
        list.add();
        list.add();
        list.add();

        System.out.println("list:" + list);

        // public static <T> void sort(List<T> list):排序 默认情况下是自然顺序。
         Collections.sort(list);
         System.out.println("自然顺序list:" + list);

        // public static <T> int binarySearch(List<?> list,T key):二分查找
         System.out.println("二分查找:" + Collections.binarySearch(list, ));
         System.out.println("二分查找:"+ Collections.binarySearch(list, ));

        // public static <T> T max(Collection<?> coll):最大值
         System.out.println("max:"+Collections.max(list));

        // public static void reverse(List<?> list):反转
         Collections.reverse(list);
         System.out.println("list:" + list);

        //public static void shuffle(List<?> list):随机置换
        Collections.shuffle(list);
        System.out.println("list:" + list);
    }
}
           
我们来看下输出结果:
JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类

看到结果是不是二分查找不存在的时候返回-6为什么呢。

因为当二分查找不存在的时候,它就会返回最大索引+1再+1.

上面的排序功能,它在默认情况下是自然顺序,如果我们要存储一个自定义对象,那么他就不说自然排序了,就要用到我们上一篇讲到的比较器Comparator排序了,大家要注意一下

好了,到这里,我们就把集合基本上学完了。下一篇,我们就要开始IO流的学习了,你准备好了吗?

欢迎有兴趣的同学加我朋友的QQ群:点击直接加群555974449 请备注:java基础再回首我们一起来玩吧。