三、链表 —— 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. 【TypeScript】TypeScript 学习 2——接口

    在 TypeScript 中,接口是用作约束作用的,在编译成 JavaScript 的时候,所有的接口都会被擦除掉,因为 JavaScript 中并没有接口这一概念. 先看看一个简单的例子: func ...

  2. SSH登录警告(WARNING: REMOTE HOST IDENTIFICATION HAS CHANGED!)

    在配置本机与docker容器实现ssh无密码访问时出现以下报错 # federico @ linux in ~ [18:35:52] C:127$ sudo ssh-copy-id -i .ssh/i ...

  3. IocPerformance 常见IOC 功能、性能比较

    IocPerformance IocPerformance 基本功能.高级功能.启动预热三方面比较各IOC,可以用作选型参考. Lamar: StructureMap的替代品 Lamar 文档 兼容S ...

  4. 初识WebAPI

    (一)Web API简介: 目前使用Web服务的三种主流的方式是:远程过程调用(RPC),面向服务架构(SOA)以及表征性状态转移(REST),其中REST模式的Web服务与复杂的SOA和RPC对比来 ...

  5. 《ASP.NET MVC 5 破境之道》:第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造

    第一境 ASP.Net MVC5项目初探 — 第三节:View层简单改造 MVC默认模板的视觉设计从MVC1到MVC3都没有改变,比较陈旧了:在MVC4中做了升级,好看些,在不同的分辨率下,也能工作得 ...

  6. Django templates html中进行模板渲染时使用python语法的基本方式

    导包(可以在模板中导入python包进行使用): <%!import urllib%> <%! from ** import **%> 使用if for等python语句: % ...

  7. zoj3497 Mistwald(矩阵快速幂)

    题意:给定一个有向图(最多25个节点,每个节点的出度最多为4),给定起点和终点,然后从起点开始走,走到终点就停止,否则一直往下走,问能不能P步到达终点.也就是说从起点出发,走一条长度为P的路径,路径中 ...

  8. webpack快速入门——Json配置文件使用

    在实际工作中,我们的项目都会配置一个Json的文件或者说API文件,作为项目的配置文件. 有时候你也会从后台读取到一个json的文件,这节课就学习如何在webpack环境中使用Json. 如果你会we ...

  9. Python小白学习之路(六)—— 【元祖】【元祖相关功能】

    元祖 tu = (111,'alex',(11,['aa','xhg',(78,43)],'aaa'),789,) 通过这个例子,我们看到元祖的特征: 是通过括号()括起来的 一般写元祖的时候,推荐子 ...

  10. css实现带箭头的流程条

    直接上效果图: <ul class="navs"> <li>1</li> <li>2</li> <li>3& ...