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排序了,大家要注意一下

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,271评论 5 476
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,275评论 2 380
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,151评论 0 336
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,550评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,553评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,559评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,924评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,580评论 0 257
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,826评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,578评论 2 320
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,661评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,363评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,940评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,926评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,156评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 42,872评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,391评论 2 342

推荐阅读更多精彩内容

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