什么是Map
Map 是一个接口类,没有继承Collection,该类中存储的是<K,V>结构的键值对,K是唯一的不能重复。可通过K ,找到V
Map简单使用
Map是接口类,不能直接new 对象(下面黑色是接口类)
咱们new HashMap 或 TreeMap 都可以里面方法都是一样的,就是底层不一样,Hash底层是哈希桶,Tree底层是红黑树;
建议new 哈希
Map<String,Integer> map = new HashMap<>();
Map的常用方法和说明
方法 | 解释 |
---|---|
V get (Object key) | 返回 key 对用的 value |
V getOrDefault(Object key, V defaultValue) | 返回 key 对应的 value,key 不存在,返回默认值 |
V put(K key, V value) | 添加 key value,如果有集合里有key修改 value |
V remove(Object key) | 删除 key 对应的映射关系 |
Set<K> keySet() | 返回所有 key 集合 |
Collection<V> values() | 返回所有 value 集合 |
Set<Map.Entry<K, V>> entrySet() | 返回所有的 key-value 映射关 |
boolean containsKey(Object key) | 判断是否包含 key |
boolean containsValue(Object value) | 判断是否包含 value |
下面写代码简单用一下
put 方法
Map<String,Integer> map = new HashMap<>();
map.put("pencil",1);//铅笔 1个
map.put("book",2); //书 2个
System.out.println(map);
简单输出一下
当添加相同的key 会修改 会修改原有的key的value;
Map<String,Integer> map = new HashMap<>();
map.put("pencil",1);//铅笔 1个
map.put("book",2); //书 2个
map.put("book",8);
System.out.println(map);
book 的value 修改成 8 ;
get方法 返回 key 对用的 value
Map<String,Integer> map = new HashMap<>();
map.put("pencil",1);//铅笔 1个
map.put("book",2); //书 2个
System.out.println(map.get("book"));
remove 就是删除key 的对应关系 简单来讲就是删除
Map<String,Integer> map = new HashMap<>();
map.put("pencil",1);//铅笔 1个
map.put("book",2); //书 2个
map.remove("book");
System.out.println(map);
map里只剩 铅笔 了,书的对应关系已经删除了
containsKey和containsValue方法,就是判断里面有没有对应的key和value
Set<K> keySet() | 返回所有 key 集合 |
Collection<V> values() | 返回所有 value 集合 |
Set<Map.Entry<K, V>> entrySet() | 返回所有的 key-value 映射关 |
values是返回 Collection<V>类型的数组;
keySet 把 map里的key 放在Set里 并返回 Set;
entrySet 将Map中的键值对放在Set中返回了
目前可能不知道Set怎么用,讲完下面就明白了
Map底层结构 | TreeMap | HashMap |
底层结构 | 红黑树 | 哈希桶 |
插入/删除/查找时间 复杂度 | O(1) | |
是否有序 | 关于Key有序 | 无序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 需要进行元素比较 | 通过哈希函数计算哈希地址 |
比较与覆写 | key必须能够比较,否则会抛出 ClassCastException异常 | 自定义类型需要覆写equals和 hashCode方法 |
应用场景 | 需要Key有序场景下 | Key是否有 |
建议用hashMap
什么是Set
Set与Map主要的不同有两点:Set是继承自Collection的接口类,Set中只存储了Key。
key是唯一不能重复的;可以用于去重
常见方法
方法 | 解释 |
---|---|
boolean add(E e) | 添加元素,但重复元素不会被添加成功 |
void clear() | 清空集合 |
boolean contains(Object o) | 判断 o 是否在集合中 |
Iterator<E> 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中,可以达到去重的效果 |
简单来说就Set可以达到去重效果,下面简单添加元素看看,其他方法就演示了,大部分和链表对象方法效果都是一样的
Set<Integer> set = new HashSet<>();
int[] array = {1,2,3,4,3,2,1};
for (int j : array) {
set.add(j);
}
System.out.println(set);
Set底层结构 | TreeSet | HashSet |
底层结构 | 红黑树 | 哈希桶 |
插入/删除/查找时间 复杂度 | O(1) | |
是否有序 | 关于Key有序 | 不一定有序 |
线程安全 | 不安全 | 不安全 |
插入/删除/查找区别 | 按照红黑树的特性来进行插入和删除 | 1. 先计算key哈希地址 2. 然后进行 插入和删除 |
比较与覆写 | key必须能够比较,否则会抛出 ClassCastException异常 | 自定义类型需要覆写equals和 hashCode方法 |
应用场景 | 需要Key有序场景下 | Key是否有序不关心,需要更高的 时间性能 |
以后做题只要涉及到去重就可以往Set上面向想;