摘要
- 与vector(线程安全) 一起都是list的子类
- ArrayList基于数组的数据结构 LinkedList基于双向链表的数据结构
- ArrayList 查询时直接返回数据,LinkedList需要遍历链表,所以在随机查询中ArrayList效率比较高
- ArrayList 在增删时需要移动元素的位置,需要进行数组的copy,LinkedList需要根据位置查到插入位置的元素,然后再进行添加指针,在数据量比较小时(10000以下)时性能差不多,但是数据量较大时LinkedList效率比较高
1.与vector(线程安全) 一起都是list的子类
2.ArrayList基于数组的数据结构 LinkedList基于双向链表的数据结构
// ArrayList
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
//LinkedList
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;
}
3.ArrayList 查询时直接返回数据,LinkedList需要遍历链表,所以在随机查询中ArrayList效率比较高
//ArrayList
public E get(int index) {
if (index >= size)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
return (E) elementData[index];
}
//LinkedList
public E get(int index) {
checkElementIndex(index);
return node(index).item;
}
Node<E> node(int index) {
// assert isElementIndex(index);
if (index < (size >> 1)) {
Node<E> x = first;
for (int i = 0; i < index; i++)
x = x.next;
return x;
} else {
Node<E> x = last;
for (int i = size - 1; i > index; i--)
x = x.prev;
return x;
}
}
4.ArrayList 在增删时需要移动元素的位置,需要进行数组的copy,LinkedList需要根据位置查到插入位置的元素,然后再进行添加指针,在数据量比较小时(10000以下)时性能差不多,但是数据量较大时LinkedList效率比较高
//ArrayList
public void add(int index, E element) {
if (index > size || index < 0)
throw new IndexOutOfBoundsException(outOfBoundsMsg(index));
ensureCapacityInternal(size + 1); // Increments modCount!!
System.arraycopy(elementData, index, elementData, index + 1,
size - index);
elementData[index] = element;
size++;
}
//LinkedList
public void add(int index, E element) {
checkPositionIndex(index);
if (index == size)
linkLast(element);
else
linkBefore(element, node(index));
}
void linkBefore(E e, Node<E> succ) {
// assert succ != null;
final Node<E> pred = succ.prev;
final Node<E> newNode = new Node<>(pred, e, succ);
succ.prev = newNode;
if (pred == null)
first = newNode;
else
pred.next = newNode;
size++;
modCount++;
}
5.测试程序
public class Test1 {
static List<Integer> arrayData =new ArrayList<Integer>();
static List<Integer> linkedData =new LinkedList<Integer>();
public static int maxCount = 30000;
public static void main(String[] args) {
for(int i=0;i<maxCount;i++){
arrayData.add(i);
linkedData.add(i);
}
System.out.println("maxCount:"+maxCount);
//获得两者随机访问的时间
System.out.println("arrayData get time:"+getTime(arrayData));
System.out.println("linkedData get time:"+getTime(linkedData));
//获得两者插入数据的时间
System.out.println("arrayData insert time:"+insertTime(arrayData));
System.out.println("linkedData insert time:"+insertTime(linkedData));
}
//获取数据
public static long getTime(List<Integer> list){
long time=System.currentTimeMillis();
for(int i = 0; i < maxCount; i++){
int getData = list.get(i);
}
return System.currentTimeMillis()-time;
}
//插入数据
public static long insertTime(List<Integer> list){
long num = maxCount;
int index = 1000;
long time=System.currentTimeMillis();
for(int i = 1; i < num; i++){
list.add(index, i);
}
return System.currentTimeMillis()-time;
}
}
6.运行结果
maxCount:10000
arrayData get time:1
linkedData get time:82
arrayData insert time:24
linkedData insert time:27
maxCount:30000
arrayData get time:2
linkedData get time:658
arrayData insert time:127
linkedData insert time:58
今天的文章ArrayList 与 LinkedList分享到此就结束了,感谢您的阅读。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
如需转载请保留出处:https://bianchenghao.cn/16000.html