flowchart TD

    A[Do you need key–value pairs?] -->|Yes| B[Use a Map]
    A -->|No| C[Need unique elements?]

    B --> B1[Fast lookup] ----> B1a[HashMap]
    B --> B2[Preserve insertion order] ----> B21[inkedHashMap]
    B2 --> B2a[LRU cache] ---> B2a1[LinkedHashMap accessOrder=true]
    B --> B3[Sorted keys] ----> B3a[TreeMap]
    B --> B4[Thread safety]
    B4 ----> B41[ConcurrentHashMap]
    B4 --> B42[Sorted + concurrent] ---> B42a[ConcurrentSkipListMap]
    B --> B5[GC-sensitive cache] ----> B5a[WeakHashMap]
    B --> B6[Enum keys] ----> B6a[EnumMap]

    C -->|Yes| D[Use a Set]
    C -->|No| E[Use a List]

    D --> D1[Fast lookup] ---> D1a[HashSet]
    D --> D2[Preserve insertion order] ---> D2a[LinkedHashSet]
    D --> D3[Sorted elements] ---> D3a[TreeSet]
    D --> D4[Thread safety?]
    
    D4 --> D42[Read-mostly?] --> |Yes|D42a[CopyOnWriteArraySet]
    D42 --> |NO| D41[ConcurrentSkipListSet]
    D --> D5[Enum elements] ---> D5a[numSet]

    E --> E1[Fast random access] ---> E1a[ArrayList]
    E --> E2[Frequent inserts/removes] ---> E2a[LinkedList]
    E --> E3[Thread safety]
    E3 --> E31[Read-mostly] --> E31a[CopyOnWriteArrayList]
    E3 --> E32[Legacy] --> E32a[Vector/Stack]

    E --> F[Need queue/stack behavior?]
    F --> F3[Thread safety?]
    
    %% Special cases
    A --> S[Special cases]
    S --> S1[Compare by identity] ----> S1a[IdentityHashMap]
    S --> S2[Bitset-like enums] ----> S2a[EnumSet]