java集合要点记录

本文深入解析Java集合框架,包括Collection接口及其方法add()和iterator(),Iterator和ListIterator的使用,AbstractCollection的作用,RandomAccess接口的功能,以及ArrayList、Vector、HashSet、TreeSet、队列、优先队列和WeakHashMap等数据结构的特点。此外,还介绍了LinkedHashSet和LinkedHashMap的应用场景,以及IdentityHashMap的工作原理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  • Collection接口
    两个基本方法:add()和iterator()
    1. add(): 如果添加操作使得集合改变就返回true
    2. 返回一个实现了Iterator接口的对象。
  • 迭代器
    Iterator接口共有4个方法
public interface Iterator<E>
{
	E next();
	boolean hasNext();
	void remove();
	default void forEachRemaining(Consumer<? super E> action);
}

应该将Java迭代器认为是连个元素之间。当调用next时,迭代器就越过下一个元素,并返回刚刚越过那个元素的引用。

  • AbstractCollection类:为了防止每一个实现Collection的类都实现所有的方法,在此提供一些例行(如isEmpty、contains等)并抽象化一些基础方法(如size、iterator)。
  • RandomAccess: 为了避免对链表完成随机访问操作,这个接口用来测试一个特定的集合是否支持高效的随机访问。
if (c instanceof RandomAccess){
	use random access algorithm
} else {
	use sequential access algorithm
}
  • 链表:Java中,所有链表都是双向连接的
  • ListIterator: 对自然有序的集合使用迭代器。
add(E); // 不返回Boolean,假定添加操作总会改变链表
// 正向遍历
next();
hasNext()
// 逆向遍历
previous()
hasPrevious()

remove();
// add方法只依赖于迭代器的位置,而remove方法依赖于迭代器的状态。
//add方法总是插入在当前光标的位置
hasNext(); // false
add(e); // e添加在表尾
// remove会删掉刚刚跳过的元素
  • ArrayList: 封装了一个动态再分配的对象数组,异步。
  • Vector: 同步,可以由两个线程安全的访问一个Vector对象
  • HashSet: 基于散列表实现,冲突用链表()解决,在Java8中,桶满时会从链表变为平衡二叉树。
  • TreeSet: 有序集合,基于红黑树实现。
  • 队列:Deque,两种实现:ArrayDeque和LinkedList,这两个类都提供了双端队列。
  • 优先队列:基于堆实现
  • 弱散列映射:WeakHashMap:用来解决当对键的唯一引用来自散列条目时,删除这个Entry.
    它使用弱引用保存键,WeakReference对象将引用保存到另外一个对象中
在 WeakHashMap 中,当某个键不再正常使用时,会被从WeakHashMap中被自动移除。更精确地说,对于一个给定的键,其映射的
存在并不阻止垃圾回收器对该键的丢弃,这就使该键成为可终止的,被终止,然后被回收。某个键被终止时,它对应的键值对也就从
映射中有效地移除了。
这个“弱键”的原理呢?大致上就是,通过WeakReference和ReferenceQueue实现的。 WeakHashMap的key是“弱键”,即是
WeakReference类型的;ReferenceQueue是一个队列,它会保存被GC回收的“弱键”。
实现步骤是:
   (1) 新建WeakHashMap,将“键值对”添加到WeakHashMap中。
        实际上,WeakHashMap是通过数组table保存Entry(键值对);每一个Entry实际上是一个单向链表,即Entry是键值对链表。
   (2) 当某“弱键”不再被其它对象引用,并被GC回收时。在GC回收该“弱键”时,这个“弱键”也同时会被添加到ReferenceQueue(queue)
   		队列中。
   (3) 当下一次我们需要操作WeakHashMap时,会先同步table和queue。table中保存了全部的键值对,而queue中保存被GC回收的键
   		值对;同步它们,就是删除table中被GC回收的键值对。
  • 链接散列集与映射:LinkedHashSet和LinkedHashMap,可以记住插入元素项的顺序,但是链接散列映射将用访问顺序,而不是插入顺序,对映射条目进行迭代,每次调用get或put,受到影响的条目将从当前的位置删除,并放到条目列表的尾部。
    应用:将访问频率高的放在内存中,其他从数据库中读取。

  • IdentityHashMap: 标识散列映射。
    这个类的散列值是用System.identityhashCode方法计算的。
    在对两个对象比较时,使用==,而不是equals

  • 视图 通过使用视图可以获得其他实现了collection接口和Map接口的对象。
    如映射类的keySet: keySet方法返回
    应用:

    1. 轻量级集合包装类 asList
    2. 子范围 subList
    3. 不可修改的视图
    4. 同步视图
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值