Java学习路线-37:Map集合

举报
彭世瑜 发表于 2021/08/13 23:14:06 2021/08/13
【摘要】 第32 章 : Map集合 139 Map接口简介 二元偶对象(key=value) Collection集合保存数据是为了输出 Map集合保存数据是为了key查找 常用方法 put 添加数据 get 获取数据 entrySet 将Map转为Set containsKey 检查存在 keySet 将Map中的key转为Set remove 删除数据 12...

第32 章 : Map集合

139 Map接口简介

二元偶对象(key=value)

Collection集合保存数据是为了输出
Map集合保存数据是为了key查找

常用方法

put 添加数据
get 获取数据
entrySet 将Map转为Set
containsKey  检查存在
keySet  将Map中的key转为Set
remove  删除数据

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

继承关系

@Map -@SortedMap -@NavigableMap

AbstractMap(Map) -HashMap(Map, Cloneable, Serializable) -LinkedHashMap(Map) -TreeMap(NavigableMap, Cloneable, Serializable)

Dictionary -Hashtable(Map, Cloneable, Serializable)

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

140 HashMap子类

hash 无序
tree 有序

HashMap 无序存储

import java.util.HashMap;
import java.util.Map;

class Demo { public static void main(String[] args) { Map<String, String> map = new HashMap<>(); map.put("one", "one"); map.put("one", "one+"); // key重复 会被覆盖 map.put("two", null);   // value 为null map.put(null, "three"); // key 为null System.out.println(map.get("one")); // key重复  one+ System.out.println(map.get("two")); // key存在  null System.out.println(map.get("ten")); // key不存在 null }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

put会返回原来的value

Map<String, Integer> map = new HashMap<>();

System.out.println(map.put("one", 1)); // null
System.out.println(map.put("one", 101)); // key重复 1

  
 
  • 1
  • 2
  • 3
  • 4

面试题:HashMap容量扩充
初始容量为16个元素,超过了阈值0.75 相当于 容量 * 阈值 = 12,会自动扩充
扩充的时候会成倍扩充

面试题:HashMap工作原理
链表O(n)
二叉树O(logn)

JDK < 1.8 链表O(n)
JDK >= 1.8 链表O(n) 数量大于8个元素后变为 红黑树,保证查询性能

141 LinkedHashMap子类

LinkedHashMap(链表实现)按照添加顺序保存数据

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;

class Demo { public static void main(String[] args) { Map<String, Integer> map = new LinkedHashMap<>(); map.put("two", 2); map.put("one", 1); map.put("three", 3); System.out.println(map); // HashMap {one=1, two=2, three=3} // LinkedHashMap {two=2, one=1, three=3} }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

142 Hashtable子类

与Vector,Enumeration属于最早的动态数组实现类
Hashtable key 和value都不能为null

import java.util.Hashtable;
import java.util.Map;

class Demo { public static void main(String[] args) { Map<String, Integer> map = new Hashtable<>(); map.put("two", 2); map.put("one", 1); map.put("three", 3); System.out.println(map); // {two=2, one=1, three=3} }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

面试题:HashMap与HashTable区别

HashMap 异步操作,非线程安全, 允许null
HashTable 同步操作,线程安全,不允许null

  
 
  • 1
  • 2

143 Map.Entry内部接口

Map.Entry 作为一个key,value的包装
JDK >= 1.9

144 利用Iterator输出Map集合

存储结构

Collection(Iterator) Map
vlaue Map.Entry(key, value)
vlaue Map.Entry(key, value)

  
 
  • 1
  • 2
  • 3

Map对象迭代方式

Map  - entrySet() -> Set
Set  - iterator() -> Iterator
Iterator -> Map.Entry

  
 
  • 1
  • 2
  • 3
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;

class Demo { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("Tom", 20); map.put("Jack", 21); // 1、将Map转Set Set<Map.Entry<String, Integer>> set = map.entrySet(); // 2、将Set 转Iterator Iterator<Map.Entry<String, Integer>> iterator = set.iterator(); while (iterator.hasNext()){ Map.Entry<String, Integer> entry = iterator.next(); System.out.println(entry.getKey() + "= "+ entry.getValue()); } /** * Tom= 20 * Jack= 21 */ }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

简化写法

import java.util.HashMap;
import java.util.Map;

class Demo { public static void main(String[] args) { Map<String, Integer> map = new HashMap<>(); map.put("Tom", 20); map.put("Jack", 21); for(Map.Entry<String, Integer> entry: map.entrySet()){ System.out.println(entry.getKey() + "= "+ entry.getValue()); } /** * Tom= 20 * Jack= 21 */ }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

145 自定义Map的key类型

通过key获取hash码
常用key:

String
Integer
Long

  
 
  • 1
  • 2
  • 3

面试体:HashMap出现Hash冲突
Hash冲突会转为链表

key key key(hash冲突)
value  value   value value value

  
 
  • 1
  • 2
  • 3
  • 4
import java.util.HashMap;
import java.util.Map;
import java.util.Objects;

class Person{ private String name; private int age; public Person(String name, int age) { this.name = name; this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Person person = (Person) o; return age == person.age && Objects.equals(name, person.name); } @Override public int hashCode() { return Objects.hash(name, age); }
}

class Demo { public static void main(String[] args) { Map<Person, Integer> map = new HashMap<>(); map.put(new Person("Tom", 20), 20); System.out.println(map.get(new Person("Tom", 20))); // 20 }
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37

文章来源: pengshiyu.blog.csdn.net,作者:彭世瑜,版权归原作者所有,如需转载,请联系作者。

原文链接:pengshiyu.blog.csdn.net/article/details/103838362

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。