一丶ArrayList
ArrayList是动态扩展数组,底层是用数组实现,插入位置有三种情况,从首位插入,中间位置插入,尾部插入。线性表的插入删除操作都是通过移动来实现的,由于数组长度固定不变,插入数据时,需要一个新的数组。1.当添加数据是在首位插入时,先将新的数据放入到新的数组内,然后将原始数组中的数据复制到新的数组。
2.当数据插入的位置是中间位置时,先将插入位置前面的数据先放到新的数组里,再放新的数据,再复制旧的数据完成添加。3.数据尾部插入,由于不会影响其他元素,因此会直接插入到后面。
同样,删除按位置也有三种情况:1.从头部删除,删除头结点然后移动后面的数据
2.从中间指定位置删除,找到要删除数据的位置,删除后,后面的数据移动.3.从尾部删除:直接删除尾部数据完成删除操作。
二、LinkedList
LinkedList是双向链表的数据结构,底层是用链表实现,是由相互引用的节点组成的双向链表,当插入数据到某个位置时,这个数据会形成一个新的节点,然后改变链表中对应的两个节点的引用关系就可以完成插入。同样,删除数据时,删除对应节点的引用就可以完成删除操作
下面,展示ArrayList与LinkedList的增、删、查代码对比
添加数据操作
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import org.junit.Test;
public class ListAddDemo {
@Test
public void ArrayListTailAddTest() {
List<String> arrList = new ArrayList<String>();
long startTime = System.currentTimeMillis();
long startMemory = Runtime.getRuntime().freeMemory();
for (int i = 0; i < 100000; i++) {
arrList.add("Hello World!"); // 尾部插入
}
long endTime = System.currentTimeMillis();
long endMemory = Runtime.getRuntime().freeMemory();
System.out.println("ArrayList尾部添加十万个数据所花费的时间:" + (endTime - startTime) + "毫秒");
System.out.println("ArrayList尾部添加操作消耗内存:" + (startMemory - endMemory)/1024 + "Kb");
}
@Test
public void LinkedListAddTest() {
List<String> lnkList = new LinkedList<String>();
long startTime = System.currentTimeMillis();
long startMemory = Runtime.getRuntime().freeMemory();
for (int i = 0; i < 100000; i++) {
lnkList.add("Hello World!");
}
long endTime = System.currentTimeMillis();
long endMemory = Runtime.getRuntime().freeMemory();
System.out.println("LinkedList添加十万个数据所花费的时间:" + (endTime - startTime) + "毫秒");
System.out.println("LinkedList添加操作消耗内存:" + (startMemory - endMemory)/1024 + "Kb");
}
@Test
public void ArrayListHeadAddTest() {