1. 如何将 Map 转 List?
Map map = ...;
List keyList = new ArrayList<>(map.keySet());
List
2. 如何将 List 转 Set?
List list = Arrays.asList("a", "b", "c");
Set set = new HashSet<>(list);
3. 如何判断两个 Set 是否相等?
判断两个Set是否相等:比较它们的元素是否完全相同,即每个Set包含的元素相同且数量一致(Set本身不允许重复元素,因此无需考虑重复问题)。直接使用Set的equals方法即可实现,例如set1.equals(set2)。
4. 如何判断两个 List 是否相等?
判断两个List是否相等:首先检查两个List的引用是否相同,若相同则直接返回true;若不同,则比较两个List的大小(元素数量),如果大小不同则返回false;如果大小相同,则逐个比较对应位置的元素是否相等(使用元素的equals方法)。所有元素均相等则返回true,否则返回false。
5. Set 和 List 在查找元素时性能区别?
Set 查找元素的时间复杂度为 O(1),性能极高。List 查找元素的时间复杂度为 O(n),性能随数据量增大而线性下降。
6. TreeMap 中 key 必须实现 Comparable 吗?
TreeMap 的 key 必须实现 Comparable 接口,或者在构造 TreeMap 时传入自定义的 Comparator。否则在添加未实现 Comparable 且未提供 Comparator 的 key 时会抛出 ClassCastException。
7. HashMap 中的 get() 方法时间复杂度是多少?
O(1) 平均时间复杂度,最坏情况下 O(n)
8. 如何遍历 Map?有哪些方式?
1. 使用 forEach 方法:map.forEach((value, key) => { /* 操作 */ });
2. 使用 for...of 循环和 entries() 方法:for (let [key, value] of map.entries()) { /* 操作 */ };
3. 使用 for...of 循环和 keys() 方法:for (let key of map.keys()) { let value = map.get(key); /* 操作 */ };
4. 使用 for...of 循环和 values() 方法:for (let value of map.values()) { /* 操作 */ };
5. 使用迭代器和 next() 方法:let iterator = map.entries(); let result = iterator.next(); while (!result.done) { let [key, value] = result.value; /* 操作 */ result = iterator.next(); }
9. LinkedHashMap 的 accessOrder 是什么?
LinkedHashMap 的 accessOrder 是一个布尔类型的构造参数,用于控制遍历顺序是否基于访问顺序而非插入顺序。当 accessOrder 设置为 false(默认值)时,遍历顺序遵循键值对的插入顺序;当设置为 true 时,每次调用 get 或类似方法访问条目后,会将最近访问的条目移动到双向链表的末尾,使得遍历顺序反映访问顺序,从而实现类似 LRU 缓存的行为。
10. HashMap 扩容为什么是 2 的幂次方?
HashMap 扩容为2的幂次方是为了通过位运算 (n - 1) & hash 替代取模运算 hash % n,提升计算效率。当n为2的幂次方时,(n - 1) 的二进制形式全为1,使得 & 操作能均匀分布键值对,减少哈希冲突。