本港台开奖现场直播 j2开奖直播报码现场
当前位置: 新闻频道 > IT新闻 >

wzatv:Android 常用数据结构解析(2)

时间:2017-08-09 21:31来源:报码现场 作者:118开奖 点击:
该方法是native的,不对底层的源码进行研究,知道方法用法和产生的结果就OK了。根据参数的解释很好理解可以达到的效果,有兴趣的朋友可以直接调这个

该方法是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语言学习链表时也是经历了懵懂的代价,成熟了就好。

(责任编辑:本港台直播)
顶一下
(0)
0%
踩一下
(0)
0%
------分隔线----------------------------
栏目列表
推荐内容