ArrayList
- ArrayListS是可重复,有序的集合
- 通过索引找到元素位置
- ArrayList可以在添加和删除元素后动态增长和缩小
- 一个其容量能够动态增长的动态数组,能快速查询元素,但添加和删除比较慢
- 通过测试后, 遍历ArrayList时,使用随机访问(即,通过索引序号访问)效率最高,而使用迭代器的效率最低
public static void main(String[] args) {
ArrayList<Integer> str=new ArrayList<>();
System.out.println("初始化长度是:"+str.size());
str.add(23);
str.add(23);
str.add(53);
str.add(12);
str.add(10);
// 可以通过索引添加元素与元素
str.add(3,7);
//输出顺序与添加顺序一致
System.out.println("添加元素后"+str);
System.out.println("添加后的长度是:"+str.size());
//数字只能通过索引删除元素,输入添加数字会超出索引范围
str.remove(2);
System.out.println("添加元素后"+str);
System.out.println("添加后的长度是:"+str.size());
//遍历的元素顺序与添加的元素位置保持一致
for(Integer ele:str) {
System.out.println("遍历后:"+ele);
}
System.out.println("------------>");
//可以使用Collection.sort()进行排序
Collections.sort(str);
for(Integer ele1:str) {
System.out.println("排序后"+ele1);
}
}
结果是
初始化长度是:0
添加元素后[23, 23, 53, 7, 12, 10]
添加后的长度是:6
添加元素后[23, 23, 7, 12, 10]
添加后的长度是:5
遍历后:23
遍历后:23
遍历后:7
遍历后:12
遍历后:10
<--------------->
排序后7
排序后10
排序后12
排序后23
排序后23
LinkedList
- LinkedList是List和Deque接口的双向链表实现
- 除了实现 List 接口外,LinkedList 类还为在列表的开头及结尾 get、remove 和 insert 元素提供了统一的命名方法。这些操作允许将链接列表用作堆栈、队列或双端队列,也允许为空。
public static void main(String[] args) {
LinkedList<String> str=new LinkedList<>();
str.add("小明");
str.add("小花");
str.add("小陈");
System.out.println("输出添加的元素:"+str);
//添加一个元素 ,相当于向尾部添加一个元素,等同于addLast(E)方法
str.add("小马");
System.out.println("添加后的元素:"+str);
//向前添加一个元素
str.addFirst("小城");
System.out.println("添加后的元素"+str);
//按照索引位置添加元素,在第四位添加一个元素
str.add(3,"小亮");
System.out.println("索引添加后的元素"+str);
//删除最后一个元素
String strLast=str.removeLast();
System.out.println("删除最后一个元素"+str);
//删除第一个元素
String strFirst=str.removeFirst();
System.out.println("删除第一个元素"+str);
}
}
结果:
输出添加的元素:[小明, 小花, 小陈]
添加后的元素:[小明, 小花, 小陈, 小马]
添加后的元素[小城, 小明, 小花, 小陈, 小马]
索引添加后的元素[小城, 小明, 小花, 小亮, 小陈, 小马]
删除最后一个元素的[小城, 小明, 小花, 小亮, 小陈]
总结:1.如果需要查找或者遍历元素,使用ArrayList,ArrayList中的get(int index)给出O(1)的性能,而LinkedList性能为O(n) 。因为ArrayList是一个动态数组,而数组是以一块连续内存存储的,数组在随机访问性是最好的。
2.如果需要频繁删除于添加,使用LinkedList, LinkedList删除操作给出O(1)性能,而ArrayList提供可变性能:在最坏情况下(在删除第一个元素时为O(n) )和在最佳情况下为O(1) (在删除最后一个元素时),同理插入性能也是一样,因为LinkedList以链表实现的集合,存储位置是不连续的。
3.性能比较:ArrayList维护索引和元素数据,而 inkedList维护元素数据和相邻节点的两个指针,所以LinkedList更消耗内存