|
1 | | -<!-- TOC --> |
2 | | - |
3 | | -- [1. 剖析面试最常见问题之 Java 集合框架](#1-剖析面试最常见问题之-java-集合框架) |
4 | | - - [1.1. 集合概述](#11-集合概述) |
5 | | - - [1.1.1. Java 集合概览](#111-java-集合概览) |
6 | | - - [1.1.2. 说说 List, Set, Queue, Map 四者的区别?](#112-说说-list-set-queue-map-四者的区别) |
7 | | - - [1.1.3. 集合框架底层数据结构总结](#113-集合框架底层数据结构总结) |
8 | | - - [1.1.3.1. List](#1131-list) |
9 | | - - [1.1.3.2. Set](#1132-set) |
10 | | - - [1.1.3.3 Queue](#1133-queue) |
11 | | - - [1.1.3.4. Map](#1134-map) |
12 | | - - [1.1.4. 如何选用集合?](#114-如何选用集合) |
13 | | - - [1.1.5. 为什么要使用集合?](#115-为什么要使用集合) |
14 | | - - [1.2. Collection 子接口之 List](#12-collection-子接口之-list) |
15 | | - - [1.2.1. Arraylist 和 Vector 的区别?](#121-arraylist-和-vector-的区别) |
16 | | - - [1.2.2. Arraylist 与 LinkedList 区别?](#122-arraylist-与-linkedlist-区别) |
17 | | - - [1.2.2.1. 补充内容:双向链表和双向循环链表](#1221-补充内容双向链表和双向循环链表) |
18 | | - - [1.2.2.2. 补充内容:RandomAccess 接口](#1222-补充内容randomaccess-接口) |
19 | | - - [1.2.3. 说一说 ArrayList 的扩容机制吧](#123-说一说-arraylist-的扩容机制吧) |
20 | | - - [1.3. Collection 子接口之 Set](#13-collection-子接口之-set) |
21 | | - - [1.3.1. comparable 和 Comparator 的区别](#131-comparable-和-comparator-的区别) |
22 | | - - [1.3.1.1. Comparator 定制排序](#1311-comparator-定制排序) |
23 | | - - [1.3.1.2. 重写 compareTo 方法实现按年龄来排序](#1312-重写-compareto-方法实现按年龄来排序) |
24 | | - - [1.3.2. 无序性和不可重复性的含义是什么](#132-无序性和不可重复性的含义是什么) |
25 | | - - [1.3.3. 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同](#133-比较-hashsetlinkedhashset-和-treeset-三者的异同) |
26 | | - - [1.4 Collection 子接口之 Queue](#14-collection-子接口之-queue) |
27 | | - - [1.4.1 Queue 与 Deque 的区别](#141-queue-与-deque-的区别) |
28 | | - - [1.4.2 ArrayDeque 与 LinkedList 的区别](#142-arraydeque-与-linkedlist-的区别) |
29 | | - - [1.4.3 说一说 PriorityQueue](#143-说一说-priorityqueue) |
30 | | - - [1.5. Map 接口](#15-map-接口) |
31 | | - - [1.5.1. HashMap 和 Hashtable 的区别](#151-hashmap-和-hashtable-的区别) |
32 | | - - [1.5.2. HashMap 和 HashSet 区别](#152-hashmap-和-hashset-区别) |
33 | | - - [1.5.3. HashMap 和 TreeMap 区别](#153-hashmap-和-treemap-区别) |
34 | | - - [1.5.4. HashSet 如何检查重复](#154-hashset-如何检查重复) |
35 | | - - [1.5.5. HashMap 的底层实现](#155-hashmap-的底层实现) |
36 | | - - [1.5.5.1. JDK1.8 之前](#1551-jdk18-之前) |
37 | | - - [1.5.5.2. JDK1.8 之后](#1552-jdk18-之后) |
38 | | - - [1.5.6. HashMap 的长度为什么是 2 的幂次方](#156-hashmap-的长度为什么是-2-的幂次方) |
39 | | - - [1.5.7. HashMap 多线程操作导致死循环问题](#157-hashmap-多线程操作导致死循环问题) |
40 | | - - [1.5.8. HashMap 有哪几种常见的遍历方式?](#158-hashmap-有哪几种常见的遍历方式) |
41 | | - - [1.5.9. ConcurrentHashMap 和 Hashtable 的区别](#159-concurrenthashmap-和-hashtable-的区别) |
42 | | - - [1.5.10. ConcurrentHashMap 线程安全的具体实现方式/底层具体实现](#1510-concurrenthashmap-线程安全的具体实现方式底层具体实现) |
43 | | - - [1.5.10.1. JDK1.7(上面有示意图)](#15101-jdk17上面有示意图) |
44 | | - - [1.5.10.2. JDK1.8 (上面有示意图)](#15102-jdk18-上面有示意图) |
45 | | - - [1.6. Collections 工具类](#16-collections-工具类) |
46 | | - - [1.6.1. 排序操作](#161-排序操作) |
47 | | - - [1.6.2. 查找,替换操作](#162-查找替换操作) |
48 | | - - [1.6.3. 同步控制](#163-同步控制) |
49 | | - |
50 | | -<!-- /TOC --> |
51 | | - |
52 | 1 | # 1. 剖析面试最常见问题之 Java 集合框架
|
53 | 2 |
|
54 | 3 | ## 1.1. 集合概述
|
@@ -309,11 +258,9 @@ Output:
|
309 | 258 |
|
310 | 259 | ### 1.3.3. 比较 HashSet、LinkedHashSet 和 TreeSet 三者的异同
|
311 | 260 |
|
312 | | -`HashSet` 是 `Set` 接口的主要实现类 ,`HashSet` 的底层是 `HashMap`,线程不安全的,可以存储 null 值; |
313 | | - |
314 | | -`LinkedHashSet` 是 `HashSet` 的子类,能够按照添加的顺序遍历; |
315 | | - |
316 | | -`TreeSet` 底层使用红黑树,元素是有序的,排序的方式有自然排序和定制排序。 |
| 261 | +- `HashSet`、`LinkedHashSet` 和 `TreeSet` 都是 `Set` 接口的实现类,都能保证元素唯一,并且都不是线程安全的。 |
| 262 | +- `HashSet`、`LinkedHashSet` 和 `TreeSet` 的主要区别在于底层数据结构不同。`HashSet` 的底层数据结构是哈希表(基于 `HashMap` 实现)。`LinkedHashSet` 的底层数据结构是链表和哈希表,元素的插入和取出顺序满足 FIFO。`TreeSet` 底层数据结构是红黑树,元素是有序的,排序的方式有自然排序和定制排序。 |
| 263 | +- 底层数据结构不同又导致这三者的应用场景不同。`HashSet` 用于不需要保证元素插入和取出顺序的场景,`LinkHashSet` 用于保证元素的插入和取出顺序满足 FIFO 的场景,`TreeSet` 用于支持对元素自定义排序规则的场景。 |
317 | 264 |
|
318 | 265 | ## 1.4 Collection 子接口之 Queue
|
319 | 266 |
|
|
0 commit comments