一、概念、场景及模型
二、Map的使用
Map的官方文档:Map (Java Platform SE 8 )https://docs.oracle.com/javase/8/docs/api/java/util/Map.html1.关于Map的说明
2.关于Map.Entry的说明
方法 | 说明 |
K getKey()
|
返回 entry 中的 key
|
V getValue()
|
返回 entry 中的 value
|
V setValue(V value)
|
将键值对中的value替换为指定value
|
3.Map的常用方法
方法 | 说明 |
V get(Object key)
|
返回 key 对应的 value
|
V getOrDefault(Object key, V defaultValue)
|
返回 key 对应的 value,key 不存在,返回默认值
|
V put(K key, V value)
|
设置 key 对应的 value
|
V remove(Object key)
|
删除 key 对应的映射关系
|
Set |
返回所有 key 的不重复集合
|
Collection |
返回所有 value 的可重复集合
|
Set |
返回所有的 key-value 映射关系
|
boolean containsKey(Object key)
|
判断是否包含 key
|
boolean containsValue(Object value)
|
判断是否包含 value
|
Map | TreeMap | HashMap |
底层结构 | 红黑树 | 哈希桶 |
插入/删除/查找时间
复杂度
| O(logN) |
O(1)
|
是否有序
|
关于Key有序
|
无序
|
线程安全
|
不安全
|
不安全
|
插入/删除/查找区别
|
需要进行元素比较
|
通过哈希函数计算哈希地址
|
比较与覆写
|
key必须能够比较,否则会抛出 ClassCastException异常
|
自定义类型需要覆写equals和 hashCode方法
|
应用场景
|
需要Key有序场景下
|
Key是否有序不关心,需要更高的时间性能
|
4.Map的遍历方式
使用最多也最简单的是for循序遍历:
- HashMap
map = new HashMap<>(); - map.put(1,1);
- map.put(2,2);
- int[] arr = new int[2];
- int k = 0;
- for (Map.Entry
entry:map.entrySet()) { - arr[k++] = entry.getKey();
- }
其实还有使用迭代遍历map、使用keySet迭代遍历map、使用entrySet遍历map这几种方式,但是觉得使用比较麻烦,直接使用for循环比较方便。
5.试题案例
统计10W个数据当中,每个数据出现的次数以及对应的关系。
- public static void func3(int[] array) {
- HashMap
map = new HashMap<>(); - //1、遍历原来的数据,统计每个数据出现的次数
- for (int i = 0; i < array.length; i++) {
- int key = array[i];
- if(map.get(key) == null) {
- map.put(key,1);
- }else {
- int val = map.get(key);//key出现的 次数
- map.put(key,val+1);
- }
- }
- for (Map.Entry
entry: map.entrySet()) { - System.out.println("key: "+entry.getKey()+" 出现了:"+entry.getValue()+"次!");
- }
- }
三、Set的使用
Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。
Set的官方文档:Set (Java Platform SE 8 )https://docs.oracle.com/javase/8/docs/api/java/util/Set.html1.关于Set的常见方法
方法 | 说明 |
boolean add(E e)
|
添加元素,但重复元素不会被添加成功
|
void clear()
|
清空集合
|
boolean contains(Object o)
|
判断 o 是否在集合中
|
Iterator |
返回迭代器
|
boolean remove(Object o)
|
删除集合中的 o
|
int size()
|
返回set中元素的个数
|
boolean isEmpty()
|
检测set是否为空,空返回true,否则返回false
|
Object[] toArray()
|
将set中的元素转换为数组返回
|
boolean containsAll(Collection> c)
|
集合c中的元素是否在set中全部存在,是返回true,否则返回false
|
boolean addAll(Collection extends E> c)
|
将集合c中的元素添加到set中,可以达到去重的效果
|
注意:
2.试题案例
给定一个非空整数数组,除了某个元素只出现一次以外,其余每个元素均出现两次。找出那个只出现了一次的元素。
- public int singleNumber(int[] nums) {
- HashSet
set = new HashSet<>(); - for (int i = 0; i < nums.length; i++) {
- if (!set.contains(nums[i])){
- set.add(nums[i]);
- }else {
- set.remove(nums[i]);
- }
- }
- for (int i = 0; i < nums.length; i++) {
- if (set.contains(nums[i])){
- return nums[i];
- }
- }
- return -1;
- }