目录
存储特点
-
以键值对的形式存放
-
键: 无序,无下标,元素不可重复
-
值: 无序,无下标,元素可以重复
常用实现类
-
HashMap
-
JDK1.2 底层哈希表实现 线程不安全,效率高
-
-
LinkedHashMap
-
JDK1.2 是HashMap的子类,底层哈希表实现 线程不安全,效率高
-
-
TreeMap
-
JDK1.2 是SortedMap的实现类,底层红黑树实现 线程不安全,效率高
-
-
Hashtable
-
JDK1.0 底层哈希表实现 线程安全,效率低
-
-
Properties
-
JDK1.0 是Hashtable的子类,底层哈希表实现 线程安全,效率低
-
创建
-
建议使用多态
Map<键的泛型,值的泛型> 集合名=new 实现类名<>();
常用方法
K: key-键
V: value-值
-
V put(K,V) : 添加键值对至集合末尾
-
当键未存在,则添加, 当键已经存在, 则进行值的覆盖
-
-
boolean containsKey(K): 判断集合中是否包含指定键
-
boolean containsValue(V): 判断集合中是否包含指定值
-
V get(K): 根据键获取对应的值
-
V remove(K): 根据键移除整个键值对
-
int size(): 获取集合元素个数
-
一个键值对是一个元素
-
遍历
-
键遍历
-
思路: 先获取到集合的所有键, 遍历键,根据需求通过键获取值
-
Set<K的泛型> keySet(): 获取所有的键放入Set集合返回
//1. 获取所有的键 Set<String> set1 = map.keySet(); //2. 遍历所有的键 for (String k : set1) { //获取键和值查看 System.out.println(k+" - "+map.get(k)); }
-
-
值遍历
-
思路: 获取所有的值进行遍历
-
Collection<V的泛型> values(): 获取所有的值放入Collection类型的集合返回
//1. 获取所有的值 Collection<String> coll = map.values(); //2. 遍历所有的值 coll.forEach(v-> System.out.println(v));
-
-
键值对遍历
-
思路: 将键值对存入对象, 返回所有的键值对对象, 再遍历对象获取出键和值
-
Set< Map.Entry<K的泛型,V的泛型> > entrySet(): 获取所有的键值对对象存入Set集合返回
-
Map.Entry<K的泛型,V的泛型> : 是Map接口的内部接口, 表示键值对,一个Entry对象可以存储一个键值对的内容
-
从Entry对象中获取键值的数据
Entry对象.getKey(): 获取键 Entry对象.getValue(): 获取值
-
//1. 获取接收所有的键值对对象 Set<Map.Entry<String,String>> set2=map.entrySet(); //2. 遍历所有的键值对对象 for (Map.Entry<String, String> entry : set2) { //从键值对对象中获取出键和值的内容 System.out.println(entry.getKey()+" - "+entry.getValue()); }
-
-
自遍历
-
思路: 利用forEach方法结合接口实现遍历
-
forEach(BiConsumer实现类对象)
System.out.println("自遍历-匿名内部类:"); map.forEach(new BiConsumer<String, String>() { @Override public void accept(String key, String value) { System.out.println(key+" - "+value); } }); System.out.println("自遍历-lambda简化:"); map.forEach((k,v)->System.out.println(k+" - "+v));
-
使用
-
底层哈希表实现的集合, 必须重写hashCode()和equals()才能保证自定义的键不重复
-
LinkedHashMap可以保证元素存入和取出的顺序一致
-
TreeMap可以根据键进行默认的升序排序
-
如果键为自定义类型, 则必须提供排序规则(两种方式与TreeSet一致)
-
当键为null时, 排序会导致空指针
-
必须在书写排序规则时对null值做转换处理
-
Map<Worker, String> map = new TreeMap<>((o1,o2)->{ //判断当前对象是否为null, 为null转换为数字, 不为null获取真实工资数值 double s1 = o1 == null ? -1 : o1.getSalary(); double s2 = o2 == null ? -1 : o2.getSalary(); //根据工资从低到高 if (s1 > s2) { return 1; } else if (s1< s2) { return -1; } return 0; }); map.put(new Worker("zhangsan", 30, 9000), "经理"); map.put(new Worker("zhangsan", 30, 9000), "副总"); map.put(new Worker("李四", 30, 6000), "主管"); map.put(new Worker("王五", 30, 5000), "职员"); map.put(null, "职员");
-
-
Hashtable不允许空值空键
-
HashMap允许空值和空键, 至多存在一个null键,可以存在多个null值
-
-
Properties集合只能存储String类型的数据
-
不建议使用多态
-
不能添加泛型
-
常用独有方法:
1. V getProperty(K): 根据键获取值,相当于Map中的get方法 2. V setProperty(k,V): 添加键值对到集合末尾,相当于Map中的put方法 3. load(输入流): 通过输入流将指定配置文件中的内容加载到集合中
-