一、概念、场景及模型
二、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;
}