【Java 集合框架介绍】


一、Java 集合框架概览

Java 集合框架的两大根接口:

  • java.util.Collection:List、Set、Queue 的共同父接口(不包括 Map)。
  • java.util.Map:键值对集合,单独体系。

主要接口与常见实现:

  • ListArrayListLinkedListCopyOnWriteArrayList
  • SetHashSetLinkedHashSetTreeSet
  • Queue / DequePriorityQueueArrayDequeLinkedList
  • MapHashMapLinkedHashMapTreeMapConcurrentHashMap

辅助工具类:

  • Collections(工具静态方法,如排序、线程安全包装)
  • Arrays(数组与集合互转)
  • Objects(空值检查等)

关键点:

  • List 有序且可重复;Set 无重复;Map 键唯一。
  • Hash* 系列依赖 hashCode()equals()Tree* 系列依赖比较器(ComparableComparator)。
  • 并发场景使用 java.util.concurrent 包下的集合。

二、复杂度与选型

操作 / 集合ArrayListLinkedListHashSet / HashMapTreeSet / TreeMapLinkedHashMap
随机访问 get(i)O(1)O(n)
插入(末尾)O(1) 摊销O(1)O(1) 摊销O(log n)O(1) 摊销
插入(中间)O(n)O(1) (在已获节点处)O(1)O(log n)O(1)
删除(指定位置)O(n)O(1)(在已获节点处)O(1)O(log n)O(1)
查找 contains / get by keyO(n)O(n)O(1)O(log n)O(1)
保持顺序否(LinkedHashSet 保证插入顺序)排序顺序保证插入顺序或访问顺序

三、概念详解

1. equals() 与 hashCode()

在哈希集合/映射中,判断元素是否相等依赖于 equals()hashCode()。必须满足:

  • 如果 a.equals(b)true,则 a.hashCode() == b.hashCode()
  • 如果 a.hashCode() == b.hashCode()equals 不一定为 true(哈希冲突允许)。

自定义 Bookequals/hashCode

public class Book {
    private final String isbn;
    private final String title;
    private final String author;

    public Book(String isbn, String title, String author) {
        this.isbn = isbn;
        this.title = title;
        this.author = author;
    }

    // 仅以 ISBN 作为唯一标识
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof Book)) return false;
        Book b = (Book) o;
        return isbn != null && isbn.equals(b.isbn);
    }

    @Override
    public int hashCode() {
        return isbn == null ? 0 : isbn.hashCode();
    }

    @Override
    public String toString() {
        return String.format("Book{isbn='%s', title='%s', author='%s'}", isbn, title, author);
    }
}

2. Comparator 与 Comparable

  • Comparable<T>:自然顺序(类内部实现 compareTo)。
  • Comparator<T>:外部排序策略(常用于灵活排序)。

示例:按书名排序的比较器:

Comparator<Book> byTitle = Comparator.comparing(book -> book.getTitle());

使用 TreeSet(按 title 排序):

Set<Book> treeSetByTitle = new TreeSet<>(Comparator.comparing(Book::getTitle));
treeSetByTitle.addAll(listOfBooks);

3. List:ArrayList vs LinkedList

  • ArrayList:大多数场景首选(随机访问快、内存连续)。插入/删除中间元素代价高。
  • LinkedList:在需要频繁在头/中间插入且已有节点引用时可用(但很少优于 ArrayList)。

遍历推荐使用增强 for 或迭代器(Iterator),若需要并发修改使用 ListIteratorremove()/add()

4. Set:HashSet / LinkedHashSet / TreeSet

  • HashSet:无序,最快的去重容器。
  • LinkedHashSet:保持插入顺序,适合需要顺序与去重的场景。
  • TreeSet:有序集合(红黑树),支持范围操作(subSetheadSet 等)。

5. Map:HashMap / LinkedHashMap / TreeMap / ConcurrentHashMap

  • HashMap:常用,不线程安全。
  • LinkedHashMap:可保持插入或访问顺序(可用于实现 LRU 缓存)。
  • TreeMap:基于红黑树的有序映射。
  • ConcurrentHashMap:高并发读写场景首选。

使用 LinkedHashMap 实现简单 LRU(重写 removeEldestEntry):

Map<K,V> lru = new LinkedHashMap<K,V>(16, 0.75f, true) {
    @Override
    protected boolean removeEldestEntry(Map.Entry<K,V> eldest) {
        return size() > MAX_ENTRIES;
    }
};

四、常用 API

1. Collections 工具类

  • 排序:Collections.sort(list)(对于自定义对象可传 Comparator)
  • 线程安全包装:Collections.synchronizedList(list)(注意仍需在迭代时手动同步)
  • 不可变集合:Collections.unmodifiableList(list)(原始 list 改变会影响不可变视图)
  • 二分查找:Collections.binarySearch(list, key, comparator)

安全迭代 synchronizedList

List<String> syncList = Collections.synchronizedList(new ArrayList<>());
synchronized (syncList) {
    for (String s : syncList) {
        // safe
    }
}

2. Arrays 与集合转换

String[] arr = {"a","b"};
List<String> list = Arrays.asList(arr); // 固定大小的 List(不能 add/remove)
List<String> arrayList = new ArrayList<>(Arrays.asList(arr)); // 可变副本

3. Stream 与集合互操作

List<Book> popularBooks = books.stream()
    .filter(b -> b.getRating() >= 4.5)
    .sorted(Comparator.comparing(Book::getRating).reversed())
    .collect(Collectors.toList());
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wdwc2

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值