java中的Map集合

本文详细介绍了Java中的Map集合,包括Map API、Map的遍历方式如keySet、forEach和EntrySet,以及HashMap和TreeMap的实现原理和区别。HashMap是线程不安全且允许null键值的,而TreeMap则根据键进行排序。还提到了LinkedHashMap,它保持插入顺序。

Map集合

Map API

在这里插入图片描述

在这里插入图片描述

Map集合的遍历

使⽤keySet进⾏遍历

  1. 可以使⽤keySet()⽅法获取到集合中所有的键。
  2. 遍历存储了所有的键的集合,依次通过键获取值。
  /**
     * 1. 使⽤keySet进⾏遍历
     * @param map 需要遍历的集合
     */
    private static void keyset(Map<String, String> map) {
	// 1. 获取存储了所有的键的集合
        Set<String> keys = map.keySet();
	// 2. 遍历这个Set集合
        for (String key : keys) {
	// 2.1. 通过键获取值
            String value = map.get(key);
	// 2.2. 展示⼀下键和值
            System.out.println("key = " + key + ", value = " + value);
        } 
    }

使⽤forEach⽅法

这个forEach⽅法, 并不是Iterable接⼝中的⽅法。 是Map接⼝中定义的⼀个⽅法。从功能上将, 与Iterable中的⽅法差不多。 只是在参数部分有区别。
default void forEach(BiConsumer<? super K, ? super V> action)

/**
* 2. 使⽤forEach进⾏遍历
* @param map 需要遍历的集合
*/
private static void forEach(Map<String, String> map) {
	map.forEach((k, v) -> {
		// k: 遍历到的每⼀个键
		// v: 遍历到的每⼀个值
		System.out.println("key = " + k + ", value = " + v);
	});
}

使⽤EntrySet进⾏遍历

Entry<K, V>:
是Map中的内部静态接⼝, ⼀个Entry对象我们称为⼀个实体,⽤来描述集合中的每⼀个键值对。

/**
* 3. 使⽤entrySet进⾏遍历
* @param map 需要遍历的集合
*/
private static void entrySet(Map<String, String> map) {
	// 1. 获取⼀个存储有所有的Entry的⼀个Set集合
	Set<Map.Entry<String, String>> entries = map.entrySet();
	// 2. 遍历Set集合
	for (Map.Entry<String, String> entry :entries) {
		// 2.1. 获取键
		String key = entry.getKey();
		// 2.2. 获取值
		String value = entry.getValue();
		// 2.3. 展示
		System.out.println("key = " + key + ", value = " +value);
		//通过setValue可以去修改原始map的值
		//映射项(键-值对)。Map.entrySet ⽅法返回映射的 collection视图,其中的元素属于此类。
		//获得映射项引⽤的唯⼀ ⽅法是通过此 collection 视图的迭代器来实现。这些 Map.Entry 对象仅
		//在迭代期间有效;更正式地说,如果在迭代器返回项之后修改了底层映射,则
		//某些映射项的⾏为是不确定的,除了通过 setValue 在映射项上执⾏操作之外。
		//entry.setValue("hello");
	}
}

HashMap(了解)

HashMap基本实现

注意:HashMap可以实现排序:因为他的底层数据结构是由数组+链表+⼆叉树共同实现的.所以可以排序.同时这样做的⽬的是提⾼数据存储的效率.

HashMap与Hashtable的区别

  1. HashMap是线程不安全的集合, Hashtable是线程安全的集合。
  2. HashMap允许出现null键值, Hashtable是不允许的。
  3. HashMap的⽗类是AbstractMap, Hashtable的⽗类是Dictionary。
  4. HashMap的Map接⼝的新的实现类, 底层算法效率优于Hashtable。

TreeMap

原理实现

与TreeSet⼀样,进⾏排列,只是TreeMap是按照键的⼤⼩实现,对于值是不管的.我们可以将TreeSet中的值理解成TreeMap中的键.

注意点

  1. 什么类型的数据类型可以作为key?
    实现了Comparable接⼝的compareTo()⽅法
    实现了Comparator接⼝的compare()⽅法
  2. 经常作为key的有:
    String,包装类,⾃定义的实现了要求的类
  3. 不可以的代表:数组,ArrayList,LinkedList(如果给他们建⽴的⽐较器也可以⽐较,但是不建议使⽤)
  4. 元素可不可以作为key,跟元素内部的成员没有关系

其他的实现类

LinkedHashMap
:数组,ArrayList,LinkedList(如果给他们建⽴的⽐较器也可以⽐较,但是不建议使⽤)
4. 元素可不可以作为key,跟元素内部的成员没有关系

其他的实现类

LinkedHashMap
与HashMap类似的,底层多维护了⼀个链表, 记录每⼀个键的存储顺序。也就是说, 在LinkedHashMap中, 键值对的添加顺序可以得到保障。 类似于LinkedHashSet与HashSet。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值