Java中Map集合概述及成员方法、Map集合的三个子类、Collections类

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

运行结果:

put:null
put:王宝强
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);
  • 判断功能
    • 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
  • 获取功能 V get(Object key):根据键获取值
  • Set keySet():获取集合中所有键的集合
  • Collection values():获取集合中所有值的集合
  • Set< Map.Entry< K,V>> entrySet():返回的是键值对对象的集合

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

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

运行结果:

  • list:[30, 20, 50, 10, 40]
  • 自然顺序list:[10, 20, 30, 40, 50]
  • 二分查找:2
  • 二分查找:-6
  • max:50
  • list:[50, 40, 30, 20, 10]
  • list:[30, 20, 10, 40, 50]
  • list:[50, 40, 10, 20, 30]
    • 看到结果是不是二分查找不存在的时候返回-6为什么呢。
    • 因为当二分查找不存在的时候,它就会返回最大索引+1再+1.

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 1. Java基础部分 基础部分的顺序:基本语法,类相关的语法,内部类的语法,继承相关的语法,异常的语法,线程的语...
    子非鱼_t_阅读 31,785评论 18 399
  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,026评论 19 139
  • java笔记第一天 == 和 equals ==比较的比较的是两个变量的值是否相等,对于引用型变量表示的是两个变量...
    jmychou阅读 1,526评论 0 3
  • 一、基本数据类型 注释 单行注释:// 区域注释:/* */ 文档注释:/** */ 数值 对于byte类型而言...
    龙猫小爷阅读 4,292评论 0 16
  • date: 2017-02-28 18:44:10 上一篇关于Python和MySQL的简单联调做了学习。这次主要...
    朴有天虹阅读 409评论 0 0