前言
记录并温习学过的List集合,也希望可以帮到大家(如果哪里记录的不正确,请各位批评指正)
ArrayList
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class ArrayListTest {
public static void main(String[] args) {
// List 代表一个元素有序,且可以重复的集合,集合中的每个元素都有其对应的索引
// List允许元素重复,可以通过索引来访问指定位置的集合元素
// List默认按元素的添加顺序设置元素的索引
// List中添加了一些根据索引来操作集合元素的方法
List<String> list = new ArrayList<String>();
list.add("b"); // 第一个索引下标为0
list.add("c"); // 索引下标为1
list.add("d"); // 索引下标为2
list.add("a"); // 索引下标为3
list.add("d"); // 允许有重复的元素
System.out.println(list);
System.out.println(list.get(1)); // 通过索引来访问指定位置的集合元素
list.add(1,"h"); // 在指定索引下标的位置插入数据
System.out.println(list);
List<String> l = new ArrayList<String>();
// 在指定索引下标的位置插入集合
l.add("aaa");
list.addAll(2,l);
System.out.println(list);
// 获取指定元素在集合中第一次出现的索引下标
System.out.println(list.indexOf("d"));
// 获取指定元素在集合中最后一次出现的索引下标
System.out.println(list.lastIndexOf("d"));
// 根据指定的索引下标移除数据
list.remove(2);
System.out.println(list);
// 根据指定的索引下标移除数据
list.set(1, "hh");
System.out.println(list);
// 根据索引下标位置截取一段元素形成新的集合,包含截取开始时的索引,不包含结束时候的索引(>=2 <4)
List<String> sublist = list.subList(2, 4); // 去索引下标大于等于2,小于4
System.out.println("截取后新的集合:" + sublist);
// 集合的长度
System.out.println("集合的长度:" + list.size());
// 遍历
// 1.根据下标
System.out.println("根据下标遍历:");
for (int i = 0; i < list.size(); i++) {
System.out.print(list.get(i));
}
System.out.println();
// 2.for-each遍历
System.out.println("for-each遍历:");
for (String str : list) {
System.out.print(str);
}
System.out.println();
/* 删除集合中元素出现问题
使用for-each循环遍历集合,遍历过程中对集合进行删除操作
因此出现异常java.util.ConcurrentModificationException
解决方式:使用迭代器
*/
Iterator<String> it = list.iterator();
while (it.hasNext()) { // hasNext 判断下一位是否有元素
String stri = it.next(); // next() 获取当前元素
if (stri.equals("a")) {
it.remove();
}
}
}
}
LinkedList
import java.util.LinkedList;
public class LinkedListTest {
/*
除了ArrayList的基本操作之外,
还额外提供了几种方法:
getFirst()/getLast()
removeFirst()/removeLast()
addFirst()/addLast()
*/
public static void main(String[] args) {
LinkedList<String> lls=new LinkedList<>();
lls.add("a");
lls.add("aa");
lls.addFirst("c"); // 在集合第一个位置上添加元素
lls.addLast("b"); // 在集合最后一个位置上添加元素
lls.removeFirst(); // 删除集合中第一个位置元素
lls.removeLast(); // 删除集合中最后一个位置元素
System.out.println("第一位上元素:" + lls.getFirst());
System.out.println("最后一位上元素:" + lls.getLast());
// 模拟堆栈
LinkedList<String> list = new LinkedList<>(); // 构建空栈
list.push("A");// 使用堆栈的方式存入集合中
list.push("B");
list.push("C");
for (String string : list) {
System.out.print(string + "\t");// C B A
}
LinkedList<String> llist = new LinkedList<>();
llist.add("A");// 使用队列的方式存入集合中
llist.add("B");
llist.add("C");
for (String string : llist) {
System.out.print(string + "\t");// A B C
}
}
}
ArrayList和LinkedList
相同点:
1.都是List接口的实现类,可变长度的集合实现
2.元素有序(集合中存储的元素和插入顺序相同)可重复
3.都允许存放null
4.都支持泛型(Generic)
5.都是不同步,线程不安全
不同点:
ArrayListTest | LinkedList |
---|---|
动态数组的数据结构 | 链表的数据结构 |
新增了操作链表头部和尾部的方法 | |
顺序存储 | 链式存储 |
get(index)通过索引可以随机访问集合中任意一个元素,适用于查询 | get(index)按照顺序从链表一端开始检索,直到另外一端 |
add、remove 需要移动集合中的元素 | add、remove 只需要对指针指向的进行修改适用于删除/添加 |