ArrayList与LinkedList的使用与区别
程序员文章站
2022-05-26 23:33:39
...
ArrayList与LinkedList的使用与区别
ArrayList
- 其中最常用的是
java.util.ArrayList
;ArrayList内部基于数组+数据拷贝的实现,初始容量是10,当添加的元素位置超出容量时,会在原数组的容量基础上扩充为1.5倍;由于ArrayList是基于数组的实现,因此在进行数据检索时的效率很高,只需要获取到元素的索引就能快速定位到元素的位置,但是由于数组的长度一旦定义,则无法修改,因此在对ArrayList进行元素的添加和删除的时候会导致数组的容量发生变化,需要频繁的创建新数组的对象,因此在进行添加,删除时效率很低;ArrayList适合做查询不适合做修改(查快改慢)
ArrayList基本使用:
public class ArrayListDemo {
public static void main(String[] args) {
List<Object> list = new ArrayList<>();
list.add("hello");
list.add(true);
list.add(10);
list.add("he");
list.add(10);
//加入元素
list .add(1,"world");
System.out.println("集合中是否包含指定元素:"+list.contains("hello"));
//替换元素
list.set(1, "qikang");
//截取一个子集合
list = list.subList(2, 5);
System.out.println(list.toString());
Object[] objs = list.toArray();
System.out.println(objs.length);
//清空集合
list.clear();
System.out.println("集合是否为空:"+list.isEmpty());
}
}
LinkedList
- LinkedList是基于双向链表的实现(链表的结构如下),在元素进行增删操作时,只需要修改链表的首尾指针即可轻松实现,因此LinkedList适合用于频繁的修改操作中;但是在进行元素的检索时,只能从链表头,链表尾部依次搜索,查询效率相对较低(LinkedList改快查慢)。LinkedList是List的子类,List中的方法LinkedList都是可以使用
LinkedList基本使用:
LinkedList list = new LinkedList();
list.add("rose");
list.add("jack");
list.add("bob");
list.add("tom");
list.add("jarry");
list.add("bob");
list.add(null);
//这里的数值不是索引,表示的链表需要进行节点搜索的次数
System.out.println(list.get(5));
for (Object obj : list) {
System.out.println("--->"+obj);
}
System.out.println(list.size());
//向集合的头部插入元素
list.addFirst("123");
//向集合的尾部插入元素
list.addLast("789");
System.out.println(list.getFirst()+"获取头部元素");
System.out.println(list.getLast()+"获取尾部元素");
//从头部弹出元素(将元素从集合中删除)
System.out.println(list.pop());
//向集合中加入元素(等同addFirst)
list.push("456");
System.out.println(list);
总结:ArrayList与LinkedList的区别
ArrayList与LinkedList的存储方式如上图所示。
区别1:数据结构不同
ArrayList是Array(动态数组)的数据结构,LinkedList是Link(链表)的数据结构。
区别2:效率不同
当随机访问List(get和set操作)时,ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
当对数据进行增加和删除的操作(add和remove操作)时,LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
区别3:*性不同
ArrayList*性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList*性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
区别4:主要控件开销不同
ArrayList主要控件开销在于需要在List列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。