Java Collection 体系

2021-07-02  本文已影响0人  bowen_wu

概述

java.util.Collection => public interface Collection<E> extends Iterable<E>

Collection Framework Hierarchy in Java

java.util.Collection

构造

常用方法

java.util.List

本质就是一个数组 => 有序

java.util.ArrayList

ArrayList Diagrams

ArrayList 动态扩容

动态扩容的实现 => 创建一个更大的空间,然后把原先的所有元素拷贝过去 => ArrayList add 方法中的 ensureCapacityInternal

java.util.Set

无序 & 不允许有重复元素
判断重复 => equals 方法

Set

java.util.HashSet

最常用、最高效Set 实现 & 无序

HashSet Diagrams

java.util.LinkedHashSet

顺序和插入的时候相同

LinkedHashSet Diagrams

java.util.TreeSet

有序 => 使用 Comparable 约定,认为排序相等的元素相等 => 可用于排序
内部结构 => 红黑树 => 一种二叉树

TreeSet Diagrams

java.util.Collections

约定:接口 | 类 的工具方法在相应的 s 类中**

方法 TODO

Collection 其他实现

java.util.Map

An object that maps keys to values. A map connot contain duplicate keys; each key can map to at most one value

常用方法

java.util.HashMap

最常用、最高效Map 实现

HashMap Diagrams

HashMap 的扩容

同 ArrayList 扩容 => 创建一个更大的空间,然后把原先的所有元素拷贝过去 => HashMap 中的 put() -> putVal() -> resize()

HashMap 线程不安全性

Note that this implementation is not synchronized.
HashMap 在扩容时,如果有多线程同时访问,resize 有可能变成一个死循环的链表 => 在多线程的时候使用 ConcurrentHashMap

HashMap 在 Java 7+ 后的改变:链表 -> 红黑树

HashMap 在处理同一个 Hash 桶里面的碰撞的情况时,把链表变成红黑树,以提高性能

java.util.TreeMap

TreeMap Diagrams

java.util.HashSet vs java.util.HashMap

HashSet 源码

HashSet 就是一个 HashMapHashSet 的构造函数都是 new HashMapHashSet 的所有 value 都是第10行的 PRESENTHashMap 是从 keyvalue 的映射,其中 key 是不能重复的,那么 HashMap 中的 key 的集合就是一个 HashSetHashSet 重用了 HashMap 的逻辑。当 HashSet 中丢入一个元素,实际上是将元素作为 key,第10行的 PRESENT 作为 value 丢入到 HashMap

Guava

不要重复造轮子!尽量使用经过实战检验的类库!

<dependency>
  <groupId>com.google.guava</groupId>
  <artifactId>guava</artifactId>
  <version>30.1.1-jre</version>
</dependency>

常用工具类

知识点

  1. 清除 list 中的重复元素 => Set<Integer> set = new HashSet<>(list);
  2. 哈希就是单向的映射
  3. hashCode 约定 // TODO
    • 同一个对象必须始终返回相同的 hashCode
    • 两个对象的 equals 返回 true,必须返回相同的 hashCode
    • 两个对象不等,也可能返回相同的 hashCode
上一篇 下一篇

猜你喜欢

热点阅读