源码分析之List(一)List & AbstractList
List
是Collection
三大直接子接口之一,其中的数据可以通过位置检索,用户可以在指定位置插入数据。List
的数据可以为空,可以重复。
List
Collection
主要提供一些通用的方法,而List
则针对线性表的结构,提供了对位置以及子表的操作。特有方法如下:
public interface List<E> extends Collection<E> { //在指定位置,将指定的集合插入到当前的集合中 boolean addAll(int index, Collection<? extends E> c); //这是一个默认实现的方法,会通过Iterator的方式对每个元素进行指定的操作 default void replaceAll(UnaryOperator<E> operator) { Objects.requireNonNull(operator); final ListIterator<E> li = this.listIterator(); while (li.hasNext()) { li.set(operator.apply(li.next())); } } //排序,依据指定的规则对当前集合进行排序,可以看到,排序是通过Arrays这个工具类完成的。 default void sort(Comparator<? super E> c) { Object[] a = this.toArray(); Arrays.sort(a, (Comparator) c); ListIterator<E> i = this.listIterator(); for (Object e : a) { i.next(); i.set((E) e); } } //获取指定位置的元素 E get(int index); //修改指定位置元素的值 E set(int index, E element); //将指定元素添加到指定的位置 void add(int index, E element); //将指定位置的元素移除 E remove(int index); //返回一个元素在集合中首次出现的位置 int indexOf(Object o); //返回一个元素在集合中最后一次出现的位置 int lastIndexOf(Object o); //ListIterator继承于Iterator,主要增加了向前遍历的功能 ListIterator<E> listIterator(); //从指定位置开始,返回一个ListIterator ListIterator<E> listIterator(int index); //返回一个子集合[fromIndex, toIndex),非结构性的修改返回值会反映到原表,反之亦然。如果原表进行了结构修改,则返回的子列表可能发生不可预料的事情 List<E> subList(int fromIndex, int toIndex); }
AbstractList
提供了一些方法的实现,不能被实例化。
public abstract class AbstractList<E> extends AbstractCollection<E> implements List<E> { /** * Sole constructor. (For invocation by subclass constructors, typically * implicit.) */ protected AbstractList() { } }
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 如何在 .NET 中 使用 ANTLR4
· 后端思维之高并发处理方案
· 理解Rust引用及其生命周期标识(下)
· 从二进制到误差:逐行拆解C语言浮点运算中的4008175468544之谜
· .NET制作智能桌面机器人:结合BotSharp智能体框架开发语音交互
· 后端思维之高并发处理方案
· 千万级大表的优化技巧
· 想让你多爱自己一些的开源计时器
· 10年+ .NET Coder 心语 ── 继承的思维:从思维模式到架构设计的深度解析
· Cursor预测程序员行业倒计时:CTO应做好50%裁员计划