auto commit

This commit is contained in:
CyC2018
2019-03-27 20:46:47 +08:00
parent f3b765d6ba
commit 943b5ccd6d
80 changed files with 18097 additions and 19683 deletions

View File

@ -1,30 +1,11 @@
<!-- GFM-TOC -->
* [一、概览](#一概览)
* [Collection](#collection)
* [Map](#map)
* [二、容器中的设计模式](#二容器中的设计模式)
* [迭代器模式](#迭代器模式)
* [适配器模式](#适配器模式)
* [三、源码分析](#三源码分析)
* [ArrayList](#arraylist)
* [Vector](#vector)
* [CopyOnWriteArrayList](#copyonwritearraylist)
* [LinkedList](#linkedlist)
* [HashMap](#hashmap)
* [ConcurrentHashMap](#concurrenthashmap)
* [LinkedHashMap](#linkedhashmap)
* [WeakHashMap](#weakhashmap)
* [参考资料](#参考资料)
<!-- GFM-TOC -->
# 一、概览
容器主要包括 Collection 和 Map 两种Collection 存储着对象的集合,而 Map 存储着键值对(两个对象)的映射表。
## Collection
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/6_2001550476096035.png"/> </div><br>
![](index_files/6_2001550476096035.png)
### 1. Set
@ -51,7 +32,7 @@
## Map
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/2_2001550426232419.png"/> </div><br>
![](index_files/2_2001550426232419.png)
- TreeMap基于红黑树实现。
@ -66,7 +47,7 @@
## 迭代器模式
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/91aa7c29-438f-4fcc-8c63-2a75899139de.png"/> </div><br>
![](index_files/91aa7c29-438f-4fcc-8c63-2a75899139de.png)
Collection 继承了 Iterable 接口,其中的 iterator() 方法能够产生一个 Iterator 对象,通过这个对象就可以迭代遍历 Collection 中的元素。
@ -114,7 +95,7 @@ List list = Arrays.asList(1, 2, 3);
### 1. 概览
实现了 RandomAccess 接口,因此支持随机访问。这是理所当然的,因为 ArrayList 是基于数组实现的。
因为 ArrayList 是基于数组实现的所以支持快速随机访问。RandomAccess 接口标识着该类支持快速随机访问
```java
public class ArrayList<E> extends AbstractList<E>
@ -127,7 +108,7 @@ public class ArrayList<E> extends AbstractList<E>
private static final int DEFAULT_CAPACITY = 10;
```
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/7935be3d-c2b3-4213-90c9-1e68ec4ac4e7.png"/> </div><br>
![](index_files/7935be3d-c2b3-4213-90c9-1e68ec4ac4e7.png)
### 2. 扩容
@ -391,7 +372,7 @@ transient Node<E> first;
transient Node<E> last;
```
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/09184175-9bf2-40ff-8a68-3b467c77216a.png"/> </div><br>
![](index_files/09184175-9bf2-40ff-8a68-3b467c77216a.png)
### 2. 与 ArrayList 的比较
@ -413,7 +394,7 @@ transient Entry[] table;
Entry 存储着键值对。它包含了四个字段,从 next 字段我们可以看出 Entry 是一个链表。即数组中的每个位置被当成一个桶一个桶存放一个链表。HashMap 使用拉链法来解决冲突,同一个链表中存放哈希值相同的 Entry。
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/1d2719d5-8d60-4c9b-a4ad-b2df7c7615af.jpg"/> </div><br>
![](index_files/1d2719d5-8d60-4c9b-a4ad-b2df7c7615af.jpg)
```java
static class Entry<K,V> implements Map.Entry<K,V> {
@ -489,7 +470,7 @@ map.put("K3", "V3");
- 计算键值对所在的桶;
- 在链表上顺序查找,时间复杂度显然和链表的长度成正比。
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/cf779e26-0382-4495-8463-f1e19e2e38a0.jpg"/> </div><br>
![](index_files/cf779e26-0382-4495-8463-f1e19e2e38a0.jpg)
### 3. put 操作
@ -579,7 +560,7 @@ int hash = hash(key);
int i = indexFor(hash, table.length);
```
**4.1 计算 hash 值**
**4.1 计算 hash 值**
```java
final int hash(Object k) {
@ -604,7 +585,7 @@ public final int hashCode() {
}
```
**4.2 取模**
**4.2 取模**
令 x = 1<<4 x 2 4 次方它具有以下性质
@ -825,7 +806,7 @@ final Segment<K,V>[] segments;
static final int DEFAULT_CONCURRENCY_LEVEL = 16;
```
<div align="center"> <img src="https://gitee.com/CyC2018/CS-Notes/raw/master/docs/pics/deb18bdb-b3b3-4660-b778-b0823a48db12.jpg"/> </div><br>
![](index_files/deb18bdb-b3b3-4660-b778-b0823a48db12.jpg)
### 2. size 操作
@ -1111,9 +1092,12 @@ public final class ConcurrentCache<K, V> {
- [Java 集合细节asList 的缺陷](http://wiki.jikexueyuan.com/project/java-enhancement/java-thirtysix.html)
- [Java Collection Framework The LinkedList Class](http://javaconceptoftheday.com/java-collection-framework-linkedlist-class/)
</br><div align="center">⭐️欢迎关注我的公众号 CyC2018在公众号后台回复关键字 📚 **资料** 可领取复习大纲,这份大纲是我花了一整年时间整理的面试知识点列表,不仅系统整理了面试知识点,而且标注了各个知识点的重要程度,从而帮你理清多而杂的面试知识点。可以说我基本是按照这份大纲来进行复习的,这份大纲对我拿到了 BAT 头条等 Offer 起到很大的帮助。你们完全可以和我一样根据大纲上列的知识点来进行复习,就不用看很多不重要的内容,也可以知道哪些内容很重要从而多安排一些复习时间。</div></br>
<div align="center"><img width="180px" src="https://cyc-1256109796.cos.ap-guangzhou.myqcloud.com/%E5%85%AC%E4%BC%97%E5%8F%B7.jpg"></img></div>
---bottom---CyC---
![](index_files/938fc386-0340-47b5-aeaa-6993e3bb4fc0.png)
![](index_files/c26e7ce3-dd9e-47e2-a208-367b5b2cddf6.png)
![](index_files/20e61b68-effe-4a70-a7fd-58be23f9343a.png)
![](index_files/7935be3d-c2b3-4213-90c9-1e68ec4ac4e7.png)
![](index_files/09184175-9bf2-40ff-8a68-3b467c77216a.png)
![](index_files/1d2719d5-8d60-4c9b-a4ad-b2df7c7615af.jpg)
![](index_files/cf779e26-0382-4495-8463-f1e19e2e38a0.jpg)
![](index_files/deb18bdb-b3b3-4660-b778-b0823a48db12.jpg)