Java 集合框架(三)—— LinkedList
三、链表 —— LinkedList

ArrayList 虽然好用,但是数组和数组列表都有一个重大的缺陷:从数组的中间位置删除一个元素要付出很大的代价,其原因是数组中处于被删除元素之后的所有元素都要向数组的前端移动。但是,具有链表结构的 LinkedList 则没有这个问题。
LinkedList 的底层结构是类似数据结构里边的双向链表,可以代价比较小地实现元素的增加和删除。

LinkedList 有一个如上图的内部类,这个类就是实现了双向链表的功能。
1、构造方法
LinkedList()
Constructs an empty list. 构造方法没什么特殊的。
2、常用方法
1)add 方法
默认添加元素到链表的最后一位
LinkedList<String> list = new LinkedList<>();
//----- 添加操作 ----
list.add("1");
list.add("2");
list.add("3");
// 将 "4" 添加到第一个位置
list.add(0, "4");
2)addFirst、removeFirst 和 getFirst 方法
分别为将元素添加到第一个位置,删除第一个位置的元素,获取第一个位置的元素
System.out.println("\nTest \"addFirst(), removeFirst(), getFirst()\"");
// 将 "10" 添加到第一个位置
list.addFirst("10");
System.out.println("list: " + list);
// 将第一个元素删除
System.out.println("list.removeFirst(): " + list.removeFirst());
System.out.println("list: " + list);
// 获取第一个元素
System.out.println("list.getFirst(): " + list.getFirst());
结果为:
Test "addFirst(), removeFirst(), getFirst()" list: [10, 4, 1, 2, 3] list.removeFirst(): 10 list: [4, 1, 2, 3] list.getFirst(): 4
3)offerFirst、pollFirst 和 peekFirst 方法
比上面的上个方法多了个返回值
System.out.println("\nTest \"offerFirst(), pollFirst(), peekFirst()\"");
// 将 "10" 添加到第一个位置,返回 true
System.out.println(list.offerFirst("10"));
System.out.println("list: " + list);
// 将第一个元素删除,失败则返回 null
System.out.println("list.pollFirst(): " + list.pollFirst());
System.out.println("list: " + list);
// 获取第一个元素,失败则返回 null
System.out.println("list.peekFirst(): " + list.peekFirst());
结果为:
Test "offerFirst(), pollFirst(), peekFirst()" true list: [10, 4, 1, 2, 3] list.pollFirst(): 10 list: [4, 1, 2, 3] list.peekFirst(): 4
4)addLast、removeLast 和 getLast 方法
分别为添加一个元素到最后一个位置,删除最后一个位置的元素以及获取最后一个位置的元素
System.out.println("\nTest \"addLast(), removeLast(), getLast()\"");
// 将 "20" 添加到最后一个位置
list.addLast("20");
System.out.println("list: " + list);
// 将最后一个元素删除
System.out.println("list.removeLast(): " + list.removeLast());
System.out.println("list: " + list);
// 获取最后一个元素
System.out.println("list.getLast(): " + list.getLast());
结果为:
Test "addLast(), removeLast(), getLast()" list: [4, 1, 2, 3, 20] list.removeLast(): 20 list: [4, 1, 2, 3] list.getLast(): 3
5)offerLast、pollLast 和 peekLast 方法
同理,比上面的方法多个返回值
System.out.println("\nTest \"offerLast(), pollLast(), peekLast()\"");
// 将 "20" 添加到第一个位置,返回 true
list.offerLast("20");
System.out.println("list: " + list);
// 将第一个元素删除,失败则返回 null
System.out.println("list.pollLast(): " + list.pollLast());
System.out.println("list: " + list);
// 获取第一个元素,失败则返回 null
System.out.println("list.peekLast(): " + list.peekLast());
结果为:
Test "offerLast(), pollLast(), peekLast()" list: [4, 1, 2, 3, 20] list.pollLast(): 20 list: [4, 1, 2, 3] list.peekLast(): 3
6)set 和 get 方法
// 将第 3 个元素设置为 300,不建议在 LinkedList 中使用此操作,因为效率低
list.set(2, "300");
// 获取第 3 个元素,不建议在 LinkedList 中使用此操作,因为效率低
System.out.println("\nget(2): " + list.get(2));
System.out.println("list: " + list);
结果为:
get(2): 300 list: [4, 1, 300, 3]
7)toArray 方法
有两个实现:toArray(), toArray(T[] a)
第二个不需要进行强制类型转换,而且转换后的数组长度和 a 的长度有关,小于等于 list 的 size,则返回 list 的元素,大于则补 null
// 将 LinkedList 转换为数组
String[] arr = list.toArray(new String[list.size()]);
for (String str : arr) {
System.out.println("str: " + str);
}
结果为:
str: 4 str: 1 str: 300 str: 3
如果参数数组长度大于 list 的 size,则返回 null
// 将 LinkedList 转换为数组
String[] arr = list.toArray(new String[list.size() + 5]);
for (String str : arr) {
System.out.println("str: " + str);
}
结果为:
str: 4 str: 1 str: 300 str: 3 str: null str: null str: null str: null str: null
8)size、clear 和 isEmpty 方法
// 输出大小
System.out.println("size: " + list.size());
// 清空 LinkedList
list.clear();
// 判断 LinkedList 是否为空
System.out.println("isEmpty(): " + list.isEmpty() + "\n");
结果为:
size: 4 isEmpty(): true
特别感谢:
1、Java 集合系列 05 之 LinkedList 详细介绍 (源码解析) 和使用示例
2、《Core Java Volume I》
Java 集合框架(三)—— LinkedList的更多相关文章
- Java集合框架之LinkedList浅析
Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...
- java集合框架之LinkedList
参考http://how2j.cn/k/collection/collection-linkedlist/370.html LinkedList 与 List接口 与ArrayList一样,Linke ...
- java 集合框架(三)Collection
一.概述 Collection是集合框架的根接口.不同的集合具有不同的特性,比如有的集合可以有重复元素,有的不可以,有的可以排序,有的不可排序,如此等等,而Collection作为集合的根接口,它规范 ...
- java集合框架04——LinkedList和源码分析
上一章学习了ArrayList,并分析了其源码,这一章我们将对LinkedList的具体实现进行详细的学习.依然遵循上一章的步骤,先对LinkedList有个整体的认识,然后学习它的源码,深入剖析Li ...
- 深入理解java集合框架之---------LinkedList
日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了. 我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入.删除时都需要移动后面的元素,效 ...
- Java集合框架(三)
Map Map集合:该集合存储键值对,一对一对的往里存,而且要保证键的唯一性. Map |------HashTable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.J ...
- [转载] Java集合框架之小结
转载自http://jiangzhengjun.iteye.com/blog/553191 1.Java容器类库的简化图,下面是集合类库更加完备的图.包括抽象类和遗留构件(不包括Queue的实现): ...
- Java集合框架系列大纲
###Java集合框架之简述 Java集合框架之Collection Java集合框架之Iterator Java集合框架之HashSet Java集合框架之TreeSet Java集合框架之Link ...
- 【java集合框架源码剖析系列】java源码剖析之LinkedList
注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...
- Java集合框架源码分析(2)LinkedList
链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...
随机推荐
- 哈希连接(hash join) 原理
哈希连接(hashjoin) 访问次数:驱动表和被驱动表都只会访问0次或1次. 驱动表是否有顺序:有. 是否要排序:否. 应用场景: 1. 一个大表,一个小表的关联: ...
- 利用ASIHTTPRequest访问网络
ASIHTTPRequest是第三方类库,ASIHTTPRequest对CFNetwork API进行了封装. 有如下特点: l 通过简单的接口,即可完成向服务端提交数据和从服务端获取数据的工作 l ...
- 万能的ctrl+shift+F(Element 'beans' cannot have character [children], because the type's content type is element-only.错误)
今天在spring-servlet.xml文件中出现了一个莫名其妙的错误:Element 'beans' cannot have character [children], because the t ...
- Delphi Language Overview
Delphi is a high-level, compiled, strongly typed language that supports structured and object-orient ...
- matlab 生成mat文件
生成MAT文件 假如你的矩阵A.B都已赋值,现在需要将A,B矩阵保存成mat格式文件,执行如下命令:save mydata A B 就会把A B矩阵数据保存在yourdata.dat文件中了 保存指定 ...
- H2内存数据库支持存储到文件
准备工作 1.下载JDK(本人下载的版本为JDK1.7).设置环境变量JAVA_HOME,设置PATH(%JAVA_HOME%\bin%). 2.下载并解压:h2-2014-07-13.zip 官网下 ...
- ASP.NET Core 装X利器SignalR:电子画板
电子画板开发需求 教师端需求: 教师登录后能创建房间(教室) 学生加入房间后有通知提醒 教师能够解散房间 基本的画板功能 学生端需求: 能够切换不同在线的房间 能够收到新建房间的通知 能够收到房间 ...
- webapi token、参数签名是如何生成的(转载)
API接口保障安全性原则:1.有调用者身份2.请求的唯一性3.请求的参数不能被篡改4.请求的有效时间 在刚接触接口开发时,可能脑子里压根就没有这个接口调用安全性的原则,但常识性的经验告诉我们,每一个请 ...
- Day5 作业(完成)
1,有如下变量(tu是个元祖),请实现要求的功能# tu = ("alex", [11, 22, {"k1": 'v1', "k2": [& ...
- OpenvSwitch 解读
OpenvSwitch 解读 报文匹配流程参考下图 调用流程(内核): ovs_vport_receive->ovs_dp_process_received_packet->ovs_flo ...