该方法是native的,不对底层的源码进行研究,知道方法用法和产生的结果就OK了。根据参数的解释很好理解可以达到的效果,有兴趣的朋友可以直接调这个函数进行试验。 小结 ArrayList实例都有一个容量,它总是至少等于列表的大小。随着向ArrayList中不断添加元素,其容量也自动增长。自动增长会带来数据向新数组的重新拷贝`Arrays.copyOf(elementData, newCapacity)`,因此,如果可预知数据量的多少,可在构造ArrayList时指定其容量。在添加大量元素前,应用程序也可以使用ensureCapacity操作来增加ArrayList实例的容量,这可以减少递增式再分配的数量。 LinkedList - LinkedList 是一个继承于AbstractSequentialList的双向链表。它也可以被当作堆栈、队列或双端队列进行操作。 - LinkedList 实现 List 接口,能对它进行队列操作。 - LinkedList 实现 Deque 接口,即能将LinkedList当作双端队列使用。 数据结构: ![双向链表](https://github.com/tuyc/tuyc.github.io/blob/master/images/[email protected]?raw=true) 链表存储结构具有两个基本特点: - 链表是一种物理存储单元上非连续、非顺序的存储结构。 - 数据元素的逻辑顺序是通过链表中的指针链接次序实现的。 源码 构造函数: java public LinkedList() { } public LinkedList(Collection<? extends E> c) { this(); addAll(c); } LinkedList的构造函数有两个:一种是默认构造和一种是给初始集合数据。使用有参构造函数会把Collection数据依次取出放到链表的尾部。这里先来看一下构造函数中使用到的`addAll()`方法: public boolean addAll(Collection<? extends E> c) { return addAll(size, c); } public boolean addAll(int index, Collection<? extends E> c) { checkPositionIndex(index); Object[] a = c.toArray(); int numNew = a.length; if (numNew == 0) return false; Node<E> pred, succ; if (index == size) { succ = null; pred = last; } else { succ = node(index); pred = succ.prev; } for (Object o : a) { @SuppressWarnings("unchecked") E e = (E) o; Node<E> newNode = new Node<>(pred, e, null); if (pred == null) first = newNode; else pred.next = newNode; pred = newNode; } if (succ == null) { last = pred; } else { pred.next = succ; succ.prev = pred; } size += numNew; modCount++; return true; } 这个方法的功能就是将Collection集合的全部数据拿出来放到index索引开始的链表上,可能是表头、表中、表尾,根据index参数决定。 下面来Look下add、remove、set、get,以及队列和栈常用方法源码: public boolean add(E e) { linkLast(e); return true; } void linkLast(E e) { final Node<E> l = last; final Node<E> newNode = new Node<>(l, e, null); last = newNode; if (l == null) first = newNode; else l.next = newNode; size++; modCount++; } public E remove(int index) { checkElementIndex(index); return unlink(node(index)); } public E set(int index, E element) { checkElementIndex(index); Node<E> x = node(index); E oldVal = x.item; x.item = element; return oldVal; } public E get(int index) { checkElementIndex(index); return node(index).item; } /*******************队列*****************/ public E poll() { final Node<E> f = first; return (f == null) ? null : unlinkFirst(f); } public boolean offer(E e) { return add(e); } /****************栈******************/ public void push(E e) { addFirst(e); } public E pop() { return removeFirst(); } LinkedList的数据操作都是简单的链表操作,前提是熟悉链表操作,想当初的C语言学习链表时也是经历了懵懂的代价,成熟了就好。 (责任编辑:本港台直播) |