From bdb10bfe508c84e15c1905cbef3a958b588e6087 Mon Sep 17 00:00:00 2001 From: CyC2018 <1029579233@qq.com> Date: Sun, 15 Apr 2018 13:22:54 +0800 Subject: [PATCH] auto commit --- notes/Java 容器.md | 43 ++++++++++-------- notes/Leetcode 题解.md | 2 +- notes/正则表达式.md | 2 +- pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png | Bin 0 -> 19456 bytes 4 files changed, 25 insertions(+), 22 deletions(-) create mode 100644 pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png diff --git a/notes/Java 容器.md b/notes/Java 容器.md index 1cb19fe6..2e10a401 100644 --- a/notes/Java 容器.md +++ b/notes/Java 容器.md @@ -9,9 +9,9 @@ * [ArrayList](#arraylist) * [Vector](#vector) * [LinkedList](#linkedlist) + * [LinkedHashMap](#linkedhashmap) * [TreeMap](#treemap) * [HashMap](#hashmap) - * [LinkedHashMap](#linkedhashmap) * [ConcurrentHashMap - JDK 1.7](#concurrenthashmap---jdk-17) * [ConcurrentHashMap - JDK 1.8](#concurrenthashmap---jdk-18) * [参考资料](#参考资料) @@ -40,13 +40,13 @@ - Vector:和 ArrayList 类似,但它是线程安全的; -- LinkedList:基于双向循环链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双端队列。 +- LinkedList:基于双向循环链表实现,只能顺序访问,但是可以快速地在链表中间插入和删除元素。不仅如此,LinkedList 还可以用作栈、队列和双向队列。 ### 3. Queue - LinkedList:可以用它来支持双向队列; -- PriorityQueue:基于堆结构实现,可以用它来实现优先级队列。 +- PriorityQueue:基于堆结构实现,可以用它来实现优先队列。 ## Map @@ -111,7 +111,7 @@ List list = Arrays.asList(1,2,3); ## ArrayList -[ArraList.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/ArrayList.java) +[ArrayList.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/ArrayList.java) ### 1. 概览 @@ -224,6 +224,10 @@ private void writeObject(java.io.ObjectOutputStream s) [LinkedList.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/LinkedList.java) +## LinkedHashMap + +[LinkedHashMap.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/HashMap.java) + ## TreeMap [TreeMap.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/TreeMap.java) @@ -302,7 +306,7 @@ map.put("K3", "V3"); - 插入 <K2,V2> 键值对,先计算 K2 的 hashCode 为 118,使用除留余数法得到所在的桶下标 118%16=6。 - 插入 <K3,V3> 键值对,先计算 K3 的 hashCode 为 118,使用除留余数法得到所在的桶下标 118%16=6,插在 <K2,V2> 后面。 -

+

查找需要分成两步进行: @@ -317,7 +321,7 @@ map.put("K3", "V3"); 因为从 JDK 1.8 开始引入了红黑树,因此扩容操作较为复杂,为了便于理解,以下内容使用 JDK 1.7 的内容。 -设 HashMap 的 table 长度为 M,需要存储的键值对数量为 N,如果哈希函数满足均匀性的要求,那么每条链表的长度大约为 N/M,因此平均查找次数的数量级为 O(N/M)。 +设 HashMap 的 table 长度为 M,需要存储的键值对数量为 N,如果哈希函数满足均匀性的要求,那么每条链表的长度大约为 N/M,因此平均查找次数的复杂度为 O(N/M)。 为了让查找的成本降低,应该尽可能使得 N/M 尽可能小,因此需要保证 M 尽可能大,也就是说 table 要尽可能大。HashMap 采用动态扩容来根据当前的 N 值来调整 M 值,使得空间效率和时间效率都能得到保证。 @@ -397,11 +401,9 @@ void transfer(Entry[] newTable) { ### 5. 确定桶下标 -很多操作都需要先确定一个键值对所在的桶下标,需要分三步进行。 +很多操作都需要先确定一个键值对所在的桶下标,这个操作需要分三步进行。 -(一)hashCode() - -调用 Key 的 hashCode() 方法得到 hashCode。 +(一)调用 hashCode() ```java public final int hashCode() { @@ -420,7 +422,7 @@ static final int hash(Object key) { } ``` -(三)除留余数法 +(三)除留余数 令 x = 1<<4,即 x 为 2 的 4 次方,它具有以下性质: @@ -429,7 +431,7 @@ x : 00010000 x-1 : 00001111 ``` -令一个数 y 与 x-1 做与运算,可以去除 y 位级表示的第 4 位及以上数: +令一个数 y 与 x-1 做与运算,可以去除 y 位级表示的第 4 位以上数: ``` y : 10110010 @@ -449,7 +451,7 @@ y%x : 00000010 拉链法需要使用除留余数法来得到桶下标,也就是需要进行以下计算:hash%capacity,如果能保证 capacity 为 2 的幂次方,那么就可以将这个操作转换位位运算。 -以下操作在 Java 8 中没有,但是原理上相同。 +以下操作在 JDK 1.8 中没有,但是原理上相同。 ```java static int indexFor(int h, int length) { @@ -472,7 +474,7 @@ new capacity : 00100000 ### 7. 扩容-计算数组容量 -先考虑如何求一个数的补码,对于 10010000,它的掩码为 11111111,可以使用以下方法得到: +先考虑如何求一个数的掩码,对于 10010000,它的掩码为 11111111,可以使用以下方法得到: ``` mask |= mask >> 1 11011000 @@ -480,9 +482,14 @@ mask |= mask >> 2 11111100 mask |= mask >> 4 11111111 ``` -如果最后令 mask+1,得到就是大于原始数字的最小的 2 次方。 +mask+1 是大于原始数字的最小的 2 次方。 -以下是 HashMap 中计算一个大小所需要的数组容量的代码: +``` +num 10010000 +mask+1 100000000 +``` + +以下是 HashMap 中计算数组容量的代码: ```java static final int tableSizeFor(int cap) { @@ -508,10 +515,6 @@ HashMap 允许有一个 Node 的 Key 为 null,该 Node 一定会放在第 0 - 由于 Hashtable 是线程安全的也是 synchronized,所以在单线程环境下它比 HashMap 要慢。 - HashMap 不能保证随着时间的推移 Map 中的元素次序是不变的。 -## LinkedHashMap - -[LinkedHashMap.java](https://github.com/CyC2018/JDK-Source-Code/tree/master/src/HashMap.java) - ## ConcurrentHashMap - JDK 1.7 [ConcurrentHashMap.java](https://github.com/CyC2018/JDK-Source-Code/blob/master/src/1.7/ConcurrentHashMap.java) diff --git a/notes/Leetcode 题解.md b/notes/Leetcode 题解.md index f3f229d8..0cee7066 100644 --- a/notes/Leetcode 题解.md +++ b/notes/Leetcode 题解.md @@ -190,7 +190,7 @@ You have 3 cookies and their sizes are big enough to gratify all of the children You need to output 2. ``` -题目描述:每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。 +题目描述:每个孩子都有一个满足度,每个饼干都有一个大小,只有饼干的大小大于等于一个孩子的满足度,该孩子才会获得满足。求解最多可以获得满足的孩子数量。 因为最小的孩子最容易得到满足,因此先满足最小孩子。给一个孩子的饼干应当尽量小又能满足该孩子,这样大饼干就能拿来给满足度比较大的孩子。 diff --git a/notes/正则表达式.md b/notes/正则表达式.md index 1252be08..e21a85c5 100644 --- a/notes/正则表达式.md +++ b/notes/正则表达式.md @@ -231,7 +231,7 @@ a.+c **正则表达式** ``` -(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))\.){3}(((\d)|([1-9]\d)|(1\d{2})|(2[0-4]\d)|(25[0-5]))) +((25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d))\.){3}(25[0-5]|(2[0-4]\d)|(1\d{2})|([1-9]\d)|(\d)) ``` **匹配结果** diff --git a/pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png b/pics/d5c16be7-a1c0-4c8d-b6b9-5999cdc6f9b3.png new file mode 100644 index 0000000000000000000000000000000000000000..df5be529a879d4e795cbf18ae00ca2dddb3c17b4 GIT binary patch literal 19456 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 literal 0 HcmV?d00001