LinkedList
特点:
- first
- last
- 元素之间形成双向链表,链表结构。
- 每个元素也有一个索引(位置)。
LinkedList 和 ArrayList 的对比
- LinkedList 底层采用的是双向链表的数据结构,ArrayList 底层采用的是变长数组的数据结构。
- 向空容器中插入第一个元素时,LinkedList 比 ArrayList 快。后续元素的追加,LinkedList 比 ArrayList 慢(前提是数组不扩容)。
- 向容器的指定位置插入元素时,LinkedList 比 ArrayList 快。
- 查询数据时,如果根据索引获取数据,ArrayList 比 LinkedList 快。但是,如果根据元素查找,它们都是线性查找,没有本质区别。
注意: 当 LinkedList 为空时(没有元素),getFirst 和 getLast 会出现异常。
示例
// 创建对象
LinkedList list = new LinkedList();
// 插入数据
list.add("jack"); // 默认是从尾部依次插入
list.add("rose");
list.addFirst("abc");
list.add(2, "rose2");
System.out.println(list); // [abc, jack, rose2, rose]
// 获取数据
System.out.println(list.get(0)); // abc
System.out.println(list.getFirst());
System.out.println(list.getLast());
// 遍历,同 ArrayList 类似
// 修改数据
list.set(2, "jack2");
System.out.println(list); // [abc, jack, jack2, rose]
// 删除数据
list.remove(); // 从头部移除一个元素
System.out.println(list); // [jack, jack2, rose]
list.remove(0);
System.out.println(list); // [jack2, rose]
System.out.println(list.size()); // 2
System.out.println(list.element()); // jack2
// 从头部插入元素
list.push("h");
System.out.println(list); // [h, jack2, rose]
// 从头部弹出数据
System.out.println(list.pop()); // h
System.out.println(list); // [jack2, rose]