三、链表 —— 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的更多相关文章

  1. Java集合框架之LinkedList浅析

    Java集合框架之LinkedList浅析 一.LinkedList综述: 1.1LinkedList简介 同ArrayList一样,位于java.util包下的LinkedList是Java集合框架 ...

  2. java集合框架之LinkedList

    参考http://how2j.cn/k/collection/collection-linkedlist/370.html LinkedList 与 List接口 与ArrayList一样,Linke ...

  3. java 集合框架(三)Collection

    一.概述 Collection是集合框架的根接口.不同的集合具有不同的特性,比如有的集合可以有重复元素,有的不可以,有的可以排序,有的不可排序,如此等等,而Collection作为集合的根接口,它规范 ...

  4. java集合框架04——LinkedList和源码分析

    上一章学习了ArrayList,并分析了其源码,这一章我们将对LinkedList的具体实现进行详细的学习.依然遵循上一章的步骤,先对LinkedList有个整体的认识,然后学习它的源码,深入剖析Li ...

  5. 深入理解java集合框架之---------LinkedList

    日常开发中,保存一组数据使用的最多的就是 ArrayList, 其次就是 LinkedList 了. 我们知道 ArrayList 是以数组实现的,遍历时很快,但是插入.删除时都需要移动后面的元素,效 ...

  6. Java集合框架(三)

     Map Map集合:该集合存储键值对,一对一对的往里存,而且要保证键的唯一性. Map |------HashTable:底层是哈希表数据结构,不可以存入null键null值.该集合是线程同步的.J ...

  7. [转载] Java集合框架之小结

    转载自http://jiangzhengjun.iteye.com/blog/553191 1.Java容器类库的简化图,下面是集合类库更加完备的图.包括抽象类和遗留构件(不包括Queue的实现): ...

  8. Java集合框架系列大纲

    ###Java集合框架之简述 Java集合框架之Collection Java集合框架之Iterator Java集合框架之HashSet Java集合框架之TreeSet Java集合框架之Link ...

  9. 【java集合框架源码剖析系列】java源码剖析之LinkedList

    注:博主java集合框架源码剖析系列的源码全部基于JDK1.8.0版本. 在实际项目中LinkedList也是使用频率非常高的一种集合,本博客将从源码角度带领大家学习关于LinkedList的知识. ...

  10. Java集合框架源码分析(2)LinkedList

    链表(LinkedList) 数组(array)和数组列表(ArrayList)都有一个重大的缺陷: 从数组的中间位置删除一个元素要付出很大的代价,因为数组中在被删除元素之后的所有元素都要向数组的前端 ...

随机推荐

  1. HDU 3472 混合图欧拉回路 + 网络流

    九野的博客,转载请注明出处:http://blog.csdn.net/acmmmm/article/details/13799337 题意: T个测试数据 n串字符 能否倒过来用(1表示能倒着用) 问 ...

  2. 基于统计的无词典的高频词抽取(二)——根据LCP数组计算词频

    接着上文[基于统计的无词典的高频词抽取(一)——后缀数组字典序排序],本文主要讲解高频子串抽取部分. 如果看过上一篇文章的朋友都知道,我们通过 快排 或 基数排序算出了存储后缀数组字典序的PAT数组, ...

  3. asp.net使用SpeechSynthesizer类生成语音文件部署到iis遇到的几个坑

    首先需要引入命名空间System.Speech.Synthesis,代码如下: using (var speechSyn = new SpeechSynthesizer()) { speechSyn. ...

  4. 20181015记录一个简单的TXT日志类

    20190422添加换行以及时间记录 using System; using System.Collections.Generic; using System.IO; using System.Lin ...

  5. C#调用C++库知识点

    DllImport方式: CharSet属性:Ansi短字节和Unicode长字节 CallingConvention属性:Cdecl清理和被调用方清理堆栈 EntryPoint属性:定位函数入口.如 ...

  6. C#之asp.net 及MVC 生成动态验证码:

    C#之asp.net 及MVC 生成动态验证码: 1.生成验证码字符串 // 随机生成指定长度的验证码字符串private string RandomCode(int length) { string ...

  7. Python 面向对象编程的一些特征 及 单例模式的实现, 父类方法的调用(python2/python3)

    一.面向对象编程几个特征(封装, 继承,多态) 1.封装:类里面封装函数和变量, 在将类进行实例化成实例对象时进行传参, 从而生成不同的实例对象,增加代码的复用. 2.继承:子类可以继承父类的方法和属 ...

  8. [JS深入学习]——数组对象排序

    (转) JavaScript实现多维数组.对象数组排序,其实用的就是原生的sort()方法,用于对数组的元素进行排序. sort() 方法用于对数组的元素进行排序.语法如下: arrayObject. ...

  9. 常见无线组网分析(NB-IOT组网和Mesh组网)

      NB-IOT LoRa Zigbee WIFI 蓝牙 组网方式 基于现有蜂窝组网 基于LoRa网关 基于Zigbee网关 基于无线路由器 居于蓝牙Mesh的网关 网络部署方式 节点 节点 + 网关 ...

  10. 将一个List拆分为n份的方法

    public static void main(String[] args) { List<Integer> taskList = new ArrayList<>(); for ...