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

时间:2022-04-23 19:26:05

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类
第一次为什么是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类
我们发现当这个键存在的时候,删除会返回对应的值,
不存在的时候,删除会返回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类
我们看到判断并不会影响他的输出结果

  • 长度功能
    • 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类

下面我们来看

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

我们来看下输出结果:
JAVA基础再回首(十八)——Map集合概述及成员方法、Map集合的三个子类、Collections类
看到结果是不是二分查找不存在的时候返回-6为什么呢。
因为当二分查找不存在的时候,它就会返回最大索引+1再+1.

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

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

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