Skip to content

Commit d1e4cc0

Browse files
authored
Update Java 容器.md
1 parent a12551f commit d1e4cc0

File tree

1 file changed

+54
-4
lines changed

1 file changed

+54
-4
lines changed

docs/Java 容器.md

Lines changed: 54 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,12 @@ Set 注重独一无二的性质,该体系集合用于存储无序(存入和取
3737

3838
1. HashMap: 根据键的 hashCode 值存储数据,大多数情况下可以直接定位到它的值,因而具有很快
3939
的访问速度,但遍历顺序却是不确定的。 HashMap 非线程安全,底层实现为数组+链表+红黑树。
40-
2. ConcurrentHashMap:**支持并发操作的HashMap**,使用Segment实现线程安全。
41-
3. HashTable:Hashtable 是遗留类,不建议使用,很多映射的常用功能与 HashMap 类似,线程安全的。
42-
4. TreeMap: 红黑树实现,可排序。
43-
5. LinkHashMap: 是 HashMap 的一个子类,保存了记录的插入顺序,在用 Iterator 遍历 LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
40+
2. ConcurrentHashMap:**支持并发操作的HashMap**,在JDK1.7和1.8实现线程安全的方式不同。
41+
3. HashTable:Hashtable 是遗留类,不建议使用,很多映射的常用功能与 HashMap 类似,通过 synchronized 把整个(table)表锁住来实现线程安全的,效率十分低下。
42+
4. TreeMap: 红黑树实现,可排序,需要对一个有序的key集合进行遍历时建议使用。
43+
5. LinkHashMap: 是 HashMap 的一个子类, 增加了一条双向链表, **从而可以保存记录的插入顺序**,在用 Iterator 遍历 LinkedHashMap 时,先得到的记录肯定是先插入的,也可以在构造时带参数,按照访问次序排序。
44+
45+
4446

4547

4648

@@ -474,3 +476,51 @@ ReentrantLock 来进行加锁,所以每次需要加锁的操作锁住的是一
474476
实现原理: HashSet底层由HashMap实现 ,值存放于HashMap的key上 ,HashMap的value统一为PRESENT
475477

476478
检查重复: 先对插入的元素的hashcode值和现有的元素的hashcode作比较,如果没有相符的hashcode,HashSet会假设对象没有重复出现,直接插入。但是如果发现有相同hashcode值的对象,这时会调用`equals()`方法来检查hashcode相等的对象是否真的相同。 如果两者相同,HashSet就不会让加入操作成功 。
479+
## LinkedHashMap
480+
481+
### LinkedHashMap 实现LRU(least recently used)
482+
483+
- 设定最大缓存空间 MAX_ENTRIES3
484+
- 使用 LinkedHashMap 的构造函数将 accessOrder 设置为 true,开启 LRU 顺序;
485+
- 覆盖 removeEldestEntry() 方法实现,在节点多于 MAX_ENTRIES 就会将最近最久未使用的数据移除。
486+
487+
```java
488+
class LRUCache<K, V> extends LinkedHashMap<K, V> {
489+
private static final int MAX_ENTRIES = 3;
490+
491+
protected boolean removeEldestEntry(Map.Entry eldest) {
492+
return size() > MAX_ENTRIES;
493+
}
494+
495+
LRUCache() {
496+
super(MAX_ENTRIES, 0.75f, true);
497+
}
498+
}
499+
public static void main(String[] args) {
500+
LRUCache<Integer, String> cache = new LRUCache<>();
501+
cache.put(1, "a");
502+
cache.put(2, "b");
503+
cache.put(3, "c");
504+
cache.get(1);
505+
cache.put(4, "d");
506+
System.out.println(cache.keySet());
507+
}
508+
```
509+
510+
## TreeMap
511+
512+
### TreeMap 其 key 对象为什么必须要实现 Compare 接口
513+
514+
通过阅读 TreeMap 的 put 方法的源码发现:TreeMap 实现元素不重复就是通过调用 compareTo 方法,而要使用 compareTo 方法就必须实现Compare接口。
515+
516+
## BlockingQueue 的实现类
517+
518+
ArrayBlockingQueue 底层是数组,有界队列,如果我们要使用生产者-消费者模式,这是非常好的选择。
519+
520+
LinkedBlockingQueue 底层是链表,可以当做无界和有界队列来使用,所以大家不要以为它就是无界队列。
521+
522+
DelayQueue是一个无界阻塞队列,只有在延迟期满时才能从中提取元素。该队列的头部是延迟期满后保存时间最长的Delayed 元素。
523+
524+
SynchronousQueue 本身不带有空间来存储任何元素,使用上可以选择公平模式和非公平模式。
525+
526+
PriorityBlockingQueue 是无界队列,基于数组,数据结构为二叉堆,数组第一个也是树的根节点总是最小值。

0 commit comments

Comments
 (0)