集合详解(四):Map

一、Map

(一)Map概述

1、Map集合:将键映射到值的对象。

1)一个映射不能包含重复的键;

2)每个键最多只能映射到一个值。

2、Map集合和Collection集合的区别

1)Map集合存储元素是成对出现的,Map集合的键是唯一的,值是可重复的。可以把这个理解为:夫妻对 。

2)Collection集合存储元素是单独出现的,Collection的儿子Set是唯一的,List是可重复的。可以把这个理解为:光棍(11.11)

3、注意:

1)Map集合的数据结构只针对键有效,跟值无关 ,HashMap,TreeMap。

2)Collection集合的数据结构是针对元素有效 。

(二)功能

1、添加功能

1)V put(K key,V value):添加元素。这个其实还有另一个功能

  • 如果键是第一次存储,就直接存储元素,返回null
  • 如果键不是第一次存在,就用值把以前的值替换掉,返回以前的值

2、删除功能

1)void clear():移除所有的键值对元素

2)V remove(Object key):根据键删除键值对元素,并把值返回

3、判断功能 (有意思)

1)boolean containsKey(Object key):判断集合是否包含指定的键

2)boolean containsValue(Object value):判断集合是否包含指定的值

3)boolean isEmpty():判断集合是否为空

4、长度功能

int size():返回集合中的键值对的对数

5、获取功能

1)基本方法:

  • Set<Map.Entry<K,V>> entrySet():遍历获取
  • V get(Object key):根据键获取值
  • Set<K> keySet():获取集合中所有键的集合
  • Collection<V> values():获取集合中所有值的集合

2)遍历Map的方法

  • 方法1:先拿到所有的key,然后遍历获取所有的value

    • keySet()
    • get(Object key)
  • 方法2:先拿到所有的键值对,然后遍历,获取每一个键值对对象-Entry(推荐)。
    • entrySet()
    • Map.Entry

3)图解

4)具体代码

<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;">	/*
	 * Map集合的遍历。
	 * 方法1:先拿到所有的key,然后遍历获取所有的value
	 * 方法2:先拿到所有的键值对,然后遍历,获取每一个键和值(推荐)
	 *
	 */
	public void test3(){

		// 创建集合对象
		Map<String, String> map = new HashMap<String, String>();

		// 创建元素并添加到集合
		map.put("杨过", "小龙女");
		map.put("郭靖", "黄蓉");
		map.put("杨康", "穆念慈");
		map.put("陈玄风", "梅超风");

		// 方法1:获取所有的键,然后根据键获取值(键找值)
		Set<String> set = map.keySet();
		// 遍历键的集合,获取得到每一个键
		for (String key : set) {
			// 根据键去找值
			String value = map.get(key);
			System.out.println(key + "---" + value);
		}

		// 方法2: 直接拿到所有的键值
		Set<Map.Entry<String, String>> entrySet = map.entrySet();//拿到键值的Set集合
		for (Map.Entry<String, String> entry : entrySet) {//遍历集合,拿到每一对的键值
			System.out.println(entry.getKey() + ":" + entry.getValue());
		}

		// 方法2: 直接拿到所有的键值
		for (Map.Entry<String, String> entry : map.entrySet()) {
			System.out.println("key= " + entry.getKey() + " and value= "
					+ entry.getValue());
		}
	}
</span></span>

二、HashMap

1、概述:

1)HashMap是基于哈希表的Map接口实现。

2)哈希表的作用是用来保证键的唯一性的,即键是唯一的,值是可重复的。

2、Hashtable和HashMap的区别?

1)Hashtable:线程安全,效率低。不允许null键和null值

2)HashMap:线程不安全,效率高。允许null键和null值

<span style="font-size:18px;">		// hm.put(null, "world"); //NullPointerException
		// hm.put("java", null); // NullPointerException</span>

3、实例:键的唯一性

<span style="font-size:18px;"><span style="font-family:Arial;font-size:18px;">	/*
	 * HashMap:是基于哈希表的Map接口实现。
	 * 哈希表的作用是用来保证键的唯一性的。
	 *
	 * HashMap<String,String>
	 * 键:String
	 * 值:String
	 */
	public void test1(){

		// 创建集合对象
		HashMap<String, String> hm = new HashMap<String, String>();

		// 创建元素并添加元素
		// String key1 = "it001";
		// String value1 = "马云";
		// hm.put(key1, value1);

		hm.put("it001", "马云");
		hm.put("it003", "马化腾");
		hm.put("it004", "乔布斯");
		hm.put("it005", "张朝阳");
		hm.put("it002", "裘伯君"); // wps
		hm.put("it001", "比尔盖茨");

		// 遍历
		Set<String> set = hm.keySet();
		for (String key : set) {
			String value = hm.get(key);
			System.out.println(key + "---" + value);
		}

	}</span></span>

三、LinkedHashMap

1、特性:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。

1)由哈希表保证键的唯一性

2)由链表保证键盘的有序(存储和取出的顺序一致)

2、实例:

<span style="font-size:18px;">/*
 * LinkedHashMap:是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。
 * 由哈希表保证键的唯一性
 * 由链表保证键盘的有序(存储和取出的顺序一致)
 */
public class LinkedHashMapDemo {
	public static void main(String[] args) {
		// 创建集合对象
		LinkedHashMap<String, String> hm = new LinkedHashMap<String, String>();

		// 创建并添加元素
		hm.put("2345", "hello");
		hm.put("1234", "world");
		hm.put("3456", "java");
		hm.put("1234", "javaee");
		hm.put("3456", "android");

		// 遍历
		Set<String> set = hm.keySet();
		for (String key : set) {
			String value = hm.get(key);
			System.out.println(key + "---" + value);
		}
	}
}
</span>

四、TreeMap

1、TreeMap:是基于红黑树的Map接口的实现。

2、实现:需要排序比较接口同TreeSet

3、实例:"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果

<span style="font-size:18px;">	/*
	 * 需求 :"aababcabcdabcde",获取字符串中每一个字母出现的次数要求结果:a(5)b(4)c(3)d(2)e(1)
	 *
	 * 分析:
	 * 		A:定义一个字符串(可以改进为键盘录入)
	 * 		B:定义一个TreeMap集合
	 * 			键:Character
	 * 			值:Integer
	 * 		C:把字符串转换为字符数组
	 * 		D:遍历字符数组,得到每一个字符
	 * 		E:拿刚才得到的字符作为键到集合中去找值,看返回值
	 * 			是null:说明该键不存在,就把该字符作为键,1作为值存储
	 * 			不是null:说明该键存在,就把值加1,然后重写存储该键和值
	 * 		F:定义字符串缓冲区变量
	 * 		G:遍历集合,得到键和值,进行按照要求拼接
	 * 		H:把字符串缓冲区转换为字符串输出
	 *
	 */
	public void test3() {

		String line = "aababcabcdabcde";

		// 定义一个字符串(可以改进为键盘录入)
//		Scanner sc = new Scanner(System.in);
//		System.out.println("请输入一个字符串:");
//		String line = sc.nextLine();

		// 定义一个TreeMap集合
		TreeMap<Character, Integer> tm = new TreeMap<Character, Integer>();

		//把字符串转换为字符数组
		char[] chs = line.toCharArray();

		//遍历字符数组,得到每一个字符
		for(char ch : chs){
			//拿刚才得到的字符作为键到集合中去找值,看返回值
			Integer i =  tm.get(ch);

			//是null:说明该键不存在,就把该字符作为键,1作为值存储
			if(i == null){
				tm.put(ch, 1);
			}else {
				//不是null:说明该键存在,就把值加1,然后重写存储该键和值
				i++;
				tm.put(ch,i);
			}
		}

		//定义字符串缓冲区变量
		StringBuilder sb=  new StringBuilder();

		//遍历集合,得到键和值,进行按照要求拼接
		Set<Character> set = tm.keySet();
		for(Character key : set){
			Integer value = tm.get(key);
			sb.append(key).append("(").append(value).append(")");
		}

		//把字符串缓冲区转换为字符串输出
		String result = sb.toString();
		System.out.println("result:"+result);

	}</span>

时间: 2024-10-10 23:54:11

集合详解(四):Map的相关文章

集合详解之 Map

集合详解之 Map + 面试题 集合有两个大接口:Collection 和 Map,本文重点来讲解集合中另一个常用的集合类型 Map. 以下是 Map 的继承关系图: Map 简介 Map 常用的实现类如下: Hashtable:Java 早期提供的一个哈希表实现,它是线程安全的,不支持 null 键和值,因为它的性能不如 ConcurrentHashMap,所以很少被推荐使用. HashMap:最常用的哈希表实现,如果程序中没有多线程的需求,HashMap 是一个很好的选择,支持 null 键

Java集合详解6:TreeMap和红黑树

Java集合详解6:TreeMap和红黑树 初识TreeMap 之前的文章讲解了两种Map,分别是HashMap与LinkedHashMap,它们保证了以O(1)的时间复杂度进行增.删.改.查,从存储角度考虑,这两种数据结构是非常优秀的.另外,LinkedHashMap还额外地保证了Map的遍历顺序可以与put顺序一致,解决了HashMap本身无序的问题. 尽管如此,HashMap与LinkedHashMap还是有自己的局限性----它们不具备统计性能,或者说它们的统计性能时间复杂度并不是很好才

Java集合详解4:HashMap和HashTable

Java集合详解4:HashMap和HashTable 今天我们来探索一下HashMap和HashTable机制与比较器的源码. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 喜欢的话麻烦star一下哈 文章首发于我的个人博客: https://h2pl.github.io/2018/05/10/collection4 更多关于Java后端学习的内容请到我的CSDN博客上查看:https://blog.csdn.net/a724888 我的个

C# 集合详解 (适合新手)

System.Collections 命名空间包含接口和类,这些接口和类定义各种对象(如列表.队列.位数组.哈希表和字典)的集合.System.Collections.Generic 命名空间包含定义泛型集合的接口和类,泛型集合允许用户创建强类型集合,它能提供比非泛型强类型集合更好的类型安全性和性能.System.Collections.Specialized 命名空间包含专用的和强类型的集合,例如,链接的列表词典.位向量以及只包含字符串的集合. 在System.Collections命名空间中

Java集合详解7:HashSet,TreeSet与LinkedHashSet

Java集合详解7:HashSet,TreeSet与LinkedHashSet 今天我们来探索一下HashSet,TreeSet与LinkedHashSet的基本原理与源码实现,由于这三个set都是基于之前文章的三个map进行实现的,所以推荐大家先看一下前面有关map的文章,结合使用味道更佳. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/12/colle

Java集合详解5:深入理解LinkedHashMap和LRU缓存

Java集合详解5:深入理解LinkedHashMap和LRU缓存 今天我们来深入探索一下LinkedHashMap的底层原理,并且使用linkedhashmap来实现LRU缓存. 具体代码在我的GitHub中可以找到 https://github.com/h2pl/MyTech 文章首发于我的个人博客: https://h2pl.github.io/2018/05/11/collection5 更多关于Java后端学习的内容请到我的CSDN博客上查看:https://blog.csdn.net

Java集合详解6:这次,从头到尾带你解读Java中的红黑树

<Java集合详解系列>是我在完成夯实Java基础篇的系列博客后准备开始写的新系列. 这些文章将整理到我在GitHub上的<Java面试指南>仓库,更多精彩内容请到我的仓库里查看 https://github.com/h2pl/Java-Tutorial 喜欢的话麻烦点下Star.fork哈 文章首发于我的个人博客: www.how2playlife.com 什么是红黑树 首先,什么是红黑树呢? 红黑树是一种"平衡的"二叉查找树,它是一种经典高效的算法,能够保证

集合详解之 Collection

集合详解之 Collection 先来看看集合的继承关系图,如下图所示: 其中: 外框为虚线的表示接口,边框为实线的表示类: 箭头为虚线的表示实现了接口,箭头为实线的表示继承了类. 为了方便理解,我隐藏了一些与本文内容无关的信息,隐藏的这些内容会在后面的章节中进行详细地介绍. 从图中可以看出,集合的根节点是 Collection,而 Collection 下又提供了两大常用集合,分别是: List:使用最多的有序集合,提供方便的新增.修改.删除的操作: Set:集合不允许有重复的元素,在许多需要

Android基础入门教程——8.3.7 Paint API之—— Xfermode与PorterDuff详解(四)

Android基础入门教程--8.3.7 Paint API之-- Xfermode与PorterDuff详解(四) 标签(空格分隔): Android基础入门教程 本节引言: 上节我们写了关于Xfermode与PorterDuff使用的第一个例子:圆角&圆形图片ImageView的实现, 我们体会到了PorterDuff.Mode.DST_IN给我们带来的好处,本节我们继续来写例子练练手, 还记得Android基础入门教程--8.3.2 绘图类实战示例给大家带来的拔掉美女衣服的实现吗? 当时我

LinearLayout详解四:彻底解决软键盘遮挡输入框的问题

之前把预备知识都介绍完了,话说学以致用,接下来我们要通过重载LinearLayout类来解决软键盘覆盖的问题. 首先阐述一下这个问题,如下图所示: 然后看挡住输入框的情况 然后我们给出xml的源代码: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:lay