三、链表 —— 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. spring案列——annotation配置

    一.需要的jar包 spring.jar commons-loggin.jar commons-loggin.jar commons-annotation.jar 二.项目结构 三.entity pa ...

  2. UniGui之锱铢积累(仔细看这个文件)

    http://www.doc88.com/p-4022977294324.html 这个是Word文档

  3. Grafana安装及配置

    安装 sudo yum install https://grafanarel.s3.amazonaws.com/builds/grafana-2.1.3-1.x86_64.rpm 启动 sudo se ...

  4. <mvc:annotation-driven />到底帮我们做了啥

    一句 <mvc:annotation-driven />实际做了以下工作:(不包括添加自己定义的拦截器) 我们了解这些之后,对Spring3 MVC的控制力就更强大了,想改哪就改哪里. s ...

  5. (C#)计算1-2+3-4+.....+m

    方法一: public static int Sum(int m) { int sum = 0; bool bol = true; for (int i=1;i<=m;i++) { if (bo ...

  6. 利用bootstrap上传视频文件,mvc做后台处理

    @{ Layout = null; } <!DOCTYPE html> <html> <head> <meta name="viewport&quo ...

  7. 我所理解的网络游戏<一>:网游的顶层设计

    网游的基本结构 各大模块的基本功能如下 · 服务器端 登陆服:处理新建玩家.登陆逻辑. 场景服:处理场景服中的逻辑. 中心服:处理跨服的逻辑,实现不同场景服进程的数据调度,以及向数据库查询数据. 数据 ...

  8. Web Server IIS7部署网站常遇到的错误及解决办法

    IIS7部署网站常遇到的错误及解决办法 经常遇到问题: 1.错误:403.14-Forbidden Web 服务器被配置为不列出此目录的内容及Login on failed for "IIS ...

  9. DateTimeField如何自动设置为当前时间并且能被修改 ——django日期时间字段的使用

    参考于:https://www.cnblogs.com/huchong/p/7895263.html 创建django的model时,有DateTimeField.DateField和TimeFiel ...

  10. Day 41 线程

    进程只能在同一个时间干一件事情,如果想同时干两件或者多件事情,进程就无能为力了. 进程在执行过程中如果阻塞,整个进程就会挂起,即使进程中有些工作不依赖于输入的数据,也将无法执行. 一是由于进程是资源的 ...