20201008 王维
学习总结
1. java.util.LinkedList
public class LinkedList<E>
extends AbstractSequentialList<E>
implements List<E>, Deque<E>, Cloneable, Serializable
LinkedList
的直接父类是 AbstractSequentialList
,实现了 List
、 Deque
LinkedList
是一个双向链表,允许存储 null
,此实现不同步(非线程安全的)
方法名 | 返回值 | 描述 |
---|---|---|
addFirst(E e) |
void |
在该列表开头插入指定的元素 |
addLast(E e) |
void |
将指定的元素追加到此列表的末尾/ add() |
get(int index) |
E |
返回此列表中指定位置的元素 |
getFirst() |
E |
返回此列表中的第一个元素 |
getLast() |
E |
返回此列表中的最后一个元素 |
push(E e) |
void |
列表的前面插入元素/ addFirst() |
removeFirst() |
E |
从此列表中删除并返回第一个元素/ poll() / pollFirst() / pop() |
ArrayList集合采用了和数组相同的存储方式,在内存中分配连续的空间,因此在添加和删除非尾部元素是会导致后面所有元素的移动,这就造成在插入、删除的效率低下。LinkedList采用链表存储方式存储数据,有点就在于插入、删除元素时效率比较高,但是查找效率低
比较 ArrayList / LinkedList
同:都实现了 List 接口,都是有序的、可以重复的、可以存null值得集合
异:ArrayList 在随机访问(获取元素时)效率比 LinkedList 高
在添加元素到末尾时,两个集合效率差不多
在任意位置添加元素时, LinkedList 效率更高
在任意位置删除元素时, LinkedList 效率高
内存, ArrayList 使用的是连续空间。
推荐优先使用 ArrayList
2. java.util.Map
Map 接口不是 Collection 的子类,使用键、值映射表来存储
public interface Map<K,V>
Map 不能有重复的键(覆盖),每个键可以映射到最多一个值
允许将映射内容视为一组键,值集合或键值映射集合
key 不要求有序, value 也不要求有序,但可以重复
当使用对象作为 key 时,要重写 equals 和 hashCode 方法
抽象方法:
方法 | 返回值 | 描述 |
---|---|---|
clear() |
void |
删除所有的映射 |
containsKey(Object key) |
boolean |
Map 中是有没有这个 key |
containsValue(Object value) |
boolean |
Map 有没有这个 value |
entrySet() |
Set<Map.Entry<K,V>> |
返回包含的映射的 Set |
get(Object key) |
V |
根据 key 返回对应的 value |
isEmpty() |
boolean |
Map 是不是空的 |
keySet() |
Set<K> |
返回 Map 中所有 key 的 Set |
put(K key, V value) |
V |
向 Map 添加映射 |
putAll(Map m) |
void |
将指定 Map 中的映射复制到此映射 |
remove(Object key) |
V |
如果 key 存在,删除映射 |
remove(Object key, Object value) |
boolean |
当 key 、value 映射存在时,删除 |
replace(K key, V value) |
boolean |
当 key 存在时,替换内容 |
size() |
int |
Map 中映射的数量 |
values() |
Collection |
返回所有 value 的集合 |
Map 的实现类较多,在此我们关注 HashMap
、 TreeMap
、 HashTable
、 LinkedHashMap
2.1 TreeMap
public class TreeMap<K,V>
extends AbstractMap<K,V>
implements NavigableMap<K,V>, Cloneable, Serializable
继承 AbstractMap
,一个红黑树基于 NavigableMap
实现
非线程安全的
key
不能存 null
,但是 value
可以存 null
key
必须是可比较的
2.2 Hashtable
public class Hashtable<K,V>
extends Dictionary<K,V>
implements Map<K,V>, Cloneable, Serializable
该类实现了一个哈希表,它将键映射到值
不允许 null
作为键和值
初始容量( initialCapacity
)为 11 ,负载因子( loadFactor
)为 0.75f
线程安全的
不保证顺序
扩容方式是旧容量的2倍 +1
数组 + 链表
2.3 HashMap
public class HashMap<K,V>
extends AbstractMap<K,V>
implements Map<K,V>, Cloneable, Serializable
基于哈希表的实现的 Map
接口
允许 null
的值和 null
键
非线程安全 初始容量 16,负载因子 0.75
扩容是 2倍旧的容量
HashMap
类大致相当于 Hashtable
,除了它是不同步的,并允许null
内部采用 数组 + 链表实现 , JDK 8 及以后版本增加红黑树的支持。
HashMap
的 put 过程:
存储时,根据内部的 hash
方法计算 key ,来确定 value
的存储位置( Map
的桶bucket
),如果 hash
相 同,在计算下标。如果产生没有碰撞( key
不相同),直接放到桶中,由于 hash
相同,所以放到一个桶 中。放的时候,如果没有超过阈值,以链表的形式放到后边,长度超过阈值将链表转换成红黑树存储。如果产生碰撞(节点已经存在)就替换值。
心得体会
今天又涉及到了一个新的数据结构,对于他的一些常用知识,不知道的很多,对Map集合的理解需要再多下功夫。还有各个集合的联系,区别,也是需要多下功夫的地方。
近期评论