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)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...
随机推荐
- C# Timer类
C# 有三种不同的Timer类 1.Threading.Timer 2.Timer.Timer 3.Forms.Timer using System; using System.Collections ...
- EBS trace分析
下载Trace Analyzer,打开bin下的traceanalyzer.bat 即可分析EBS的trace文件,图形化界面,无需tkprof 需要配置javahome,确认java版本为1.6以上 ...
- Android-CallUtil工具类
打电话相关的工具类: public final class CallUtil { /** * 拨打电话(直接拨打电话) * @param phoneNum 电话号码 */ @SuppressLint( ...
- .NET 调试入门(二) dump 出程序数据
前言 有时候我们需要看程序中运行情况怎么,如:某对象字段的具体值是多少等问题,我们就可以用调试工具找到答案.我们还是沿用前面的程序.原代码在文章低部. dump栈上的值 在线程4中输 ...
- Spark Structured Stream 2
❤Limitations of DStream API Batch Time Constraint application级别的设置. 不支持EventTime event time 比process ...
- MongoDB下载及安装
MongoDB的下载及安装 1.下载: MongoDB的官网是:http://www.mongodb.org/ 2.安装: 方案一:(程序启动方式) 1> 创建文件夹:MongoDB 在D ...
- linux ab压力测试工具及ab命令详解
原文链接:https://blog.csdn.net/qq_27517377/article/details/78794409 yum -y install httpd-tools ab -v 查看a ...
- 点分治&&动态点分治学习笔记
突然发现网上关于点分和动态点分的教程好像很少……蒟蒻开篇blog记录一下吧……因为这是个大傻逼,可能有很多地方写错,欢迎在下面提出 参考文献:https://www.cnblogs.com/LadyL ...
- Code Chef DARTSEGM(计算几何+凸包)
题面 传送门 题解 好眼熟丫-- 一月月赛最后一题--,代码都不用改-- //minamoto #include<bits/stdc++.h> #define R register #de ...
- RF射频技术的原理
[摘要]射频技术(RF)是Radio Frequency的缩写.较常见的应用有无线射频识别(Radio Frequency Identification,RFID),常称为感应式电子晶片或近接卡.感应 ...