说明:
首先看到这个图,我在昨天已经开始学习集合中的Collection,今天开始学习Map集合
一.List集合
Map与List、Set接口不同,它是由一系列键值对组成的集合,提供了key到Value的映射。同时它也没有继承Collection。在Map中它保证了key与value之间的一一对应关系。也就是说一个key对应一个value,所以它不能存在相同的key值,当然value值可以相同。
List集合有两个子类,但是我们常用的是HashMap
它的主要方法:
put(); 放入键和值
remove(); 移除
get(); 获取
containskey(); 判断
Set(); keySet(); 获取Map集合中所有的键
1.HashMap
以哈希表数据结构实现,查找对象时通过哈希函数计算其位置,它是为快速查询而设计的,其内部定义了一个hash表数组(Entry[] table),元素会通过哈希转换函数将元素的哈希地址转换成数组中存放的索引,如果有冲突,则使用散列链表的形式将所有相同哈希地址的元素串起来,可能通过查看HashMap.Entry的源码它是一个单链表结构。
下面给大家看个我们以后写代码会用到的例子for循环(三种介绍)
package cn.kgc.Demo04;import java.util.HashMap;import java.util.Iterator;import java.util.Map;import java.util.Set;public class Demo05EntrySet { public static void main(String[] args) { HashMapmm = new HashMap<>(); mm.put("豪豪",25); mm.put("福福",23); mm.put("龙龙",27); mm.put("波波",21); mm.put("凡凡",18); System.out.println(mm); System.out.println("************************"); //通过mm.entrySet()获取set集合 Set > set = mm.entrySet(); //通过set集合去使用迭代器 Iterator > iet = set.iterator(); while(iet.hasNext()){ System.out.println(iet.next()); } System.out.println("****************"); Iterator > it = set.iterator(); while(it.hasNext()){ Map.Entry en = it.next();//en是一个对象 Object key = en.getKey(); Object value = en.getValue(); System.out.println(key+":"+value); } //增强型for System.out.println("************************"); for(Map.Entry set1:mm.entrySet()){ String key = set1.getKey(); Integer value = set1.getValue(); System.out.println(key+":"+value); } }}
2.LinkedHashMap
LinkedHashMap是HashMap的一个子类,它保留插入的顺序,如果需要输出的顺序和输入时的相同,那么就选用LinkedHashMap。
LinkedHashMap是Map接口的哈希表和链接列表实现,具有可预知的迭代顺序。此实现提供所有可选的映射操作,并允许使用null值和null键。此类不保证映射的顺序,特别是它不保证该顺序恒久不变。 LinkedHashMap实现与HashMap的不同之处在于,后者维护着一个运行于所有条目的双重链接列表。此链接列表定义了迭代顺序,该迭代顺序可以是插入顺序或者是访问顺序。 根据链表中元素的顺序可以分为:按插入顺序的链表,和按访问顺序(调用get方法)的链表。默认是按插入顺序排序,如果指定按访问顺序排序,那么调用get方法后,会将这次访问的元素移至链表尾部,不断访问可以形成按访问顺序排序的链表。 注意,此实现不是同步的。如果多个线程同时访问链接的哈希映射,而其中至少一个线程从结构上修改了该映射,则它必须保持外部同步。 由于LinkedHashMap需要维护元素的插入顺序,因此性能略低于HashMap的性能,但在迭代访问Map里的全部元素时将有很好的性能,因为它以链表来维护内部顺序。