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

原创 2016年08月22日 00:41:31

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);
    }
}

我们来看输出结果:
这里写图片描述
第一次为什么是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);

根据键删除对于值的元素输出结果
这里写图片描述
我们发现当这个键存在的时候,删除会返回对应的值,
不存在的时候,删除会返回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());

这个就比较简单了,判断集合是否包含指定的值,我就不说了,和键一样,给大家看一下输出结果
这里写图片描述
我们看到判断并不会影响他的输出结果

  • 长度功能
    • 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);
        }
    }
}

这个还是很好理解的,最重要的就是遍历得到每一个键值对对象,看下输出结果
这里写图片描述

下面我们来看

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(30);
        list.add(20);
        list.add(50);
        list.add(10);
        list.add(40);

        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, 30));
         System.out.println("二分查找:"+ Collections.binarySearch(list, 300));

        // 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);
    }
}

我们来看下输出结果:
这里写图片描述
看到结果是不是二分查找不存在的时候返回-6为什么呢。
因为当二分查找不存在的时候,它就会返回最大索引+1再+1.

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

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

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

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/m366917/article/details/52270577

人工智能百度AI:语音识别java类

-
  • 1970年01月01日 08:00

Map集合及其子类

Map(地图集合):保存具有映射关系的数据,一组用于保存Map集合里面的key,一组用用保存Map里的value,这种关系是键值对,key里面不能允许重复,value里面可以是null。这样看的话Ma...
  • qq_32519097
  • qq_32519097
  • 2016-10-04 16:00:06
  • 1056

Java-Map和List类中子类的区别

HashMap与HashTable都是java的集合类,都可以用来存放java对象,这是他们的相同点,但是他们也有区别: 一、历史原因 HashTable是基于陈旧的Dictionary类的,...
  • u013943420
  • u013943420
  • 2017-03-20 19:10:12
  • 417

java中关于collection和map及其子类

collection(集合)是一个根接口,用来描述一组对象的集合。JDK并没有直接提供对个接口的实现,而是提供了对她的子接口的实现例如set和list等。在collection接口中用的最多的两种基本...
  • lskyne
  • lskyne
  • 2013-05-22 16:20:28
  • 4537

Java Map 集合类简介

java.util 中的集合类包含 Java 中某些最常用的类。 最常用的集合类是 List 和 Map。 List 的具体实现包括 ArrayList 和 Vector,它们是可变大小的列表,比较适...
  • casularm
  • casularm
  • 2004-11-03 10:25:00
  • 79043

集合-Map概述-Map子类对象特点-Map共性方法

Map集合:该集合存储键值对。一对一对往里存。而且要保证键的唯一性。 1,添加 put(K key, V value) putAll(Map m) 2,删除 cl...
  • shenqingxiaojian
  • shenqingxiaojian
  • 2014-08-01 09:11:04
  • 1952

Map的一些子类的用法和区别

最常用的是HashMap: import java.util.HashMap; import java.util.Map; import java.util.HashSet; import java...
  • u012289441
  • u012289441
  • 2014-08-28 13:49:30
  • 650

Java Map的几种类型

Java Map的几种类型
  • whing123
  • whing123
  • 2017-09-04 10:04:24
  • 139

JAVA中的MAP及其子类

JAVA中的MAP及其子类 Map(地图集合):保存具有映射关系的键值对数据,key里面不能允许重复,value里面可以是null。这样一来的话Map跟Set集合很像,把value全部设为nul...
  • latiohongjui
  • latiohongjui
  • 2017-06-19 08:39:04
  • 167

JAVA中MAP类

 转自于互联网]Map以按键/数值对的形式存储数据,和数组非常相似,在数组中存在的索引,它们本身也是对象。       Map的接口       Map---实现Map       Map.Entry...
  • Phoxe_bai
  • Phoxe_bai
  • 2008-07-22 17:01:00
  • 551
收藏助手
不良信息举报
您举报文章:JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类
举报原因:
原因补充:

(最多只允许输入30个字)