Java集合框架LinkedList详解及实例

 更新时间:2017年04月08日 14:30:21   投稿:lqh  
这篇文章主要介绍了Java集合框架LinkedList详解及实例的相关资料,从定义,概述,用法进行介绍,需要的朋友可以参考下

Java集合框架LinkedList详解

LinkedList定义

package java.util;
public class LinkedList<E>
 extends AbstractSequentialList<E>
 implements List<E>, Deque<E>, Cloneable, java.io.Serializable{
 transient int size = 0;
 transient Node<E> first;
 transient Node<E> last;
}

LinkedList概述

  LinkedList以双向链表实现,允许重复。(如下Node的实现)并保留头指针和尾指针。

 private static class Node<E> {
  E item;
  Node<E> next;
  Node<E> prev;

  Node(Node<E> prev, E element, Node<E> next) {
   this.item = element;
   this.next = next;
   this.prev = prev;
  }
 }

  链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。

  按下标访问元素—get(i)/set(i,e) 要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。

 public E get(int index) {
  checkElementIndex(index);
  return node(index).item;
 }
 public E set(int index, E element) {
  checkElementIndex(index);
  Node<E> x = node(index);
  E oldVal = x.item;
  x.item = element;
  return oldVal;
 }

 Node<E> node(int index) {
  // assert isElementIndex(index);

  if (index < (size >> 1)) {
   Node<E> x = first;
   for (int i = 0; i < index; i++)
    x = x.next;
   return x;
  } else {
   Node<E> x = last;
   for (int i = size - 1; i > index; i--)
    x = x.prev;
   return x;
  }
 }

  插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作—add(), addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动。

  非线程安全,可以调用Collections.synchronizedList(new LinkedList<>());实现。

LinkedList用法

  简单举个例子:

  List<Integer> list = new LinkedList<>();
  list.add(4);
  list.add(2);
  list.add(3);
  list.add(5);

  for(int i:list)
   System.out.println(i);
  System.out.println(list);

  运行结果:

4
2
3
5
[4, 2, 3, 5]

  LinkedList会保留插入数据的顺序。

subList的使用

 List<Integer> list = new LinkedList<>();
  list.add(4);
  list.add(2);
  list.add(3);
  list.add(5);
  list.add(7);
  list.add(5);
  list.add(11);
  list.add(14);
  list.add(10);
  list.add(9);
  System.out.println(list);
  List<Integer> list2 = list.subList(3, 6);
  System.out.println(list2);
  list2.set(2, 50);

  System.out.println("============");
  System.out.println(list);
  System.out.println(list2);

  运行结果:

[4, 2, 3, 5, 7, 5, 11, 14, 10, 9]
[5, 7, 5]
============
[4, 2, 3, 5, 7, 50, 11, 14, 10, 9]
[5, 7, 50]

  调用LinkedList中的subList方法生成的新的list,内部引用的还是原来的链表,如果改变subList中的值,主list中的值也会跟着改变。

 感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

相关文章

  • 详解Maven POM(项目对象模型)

    详解Maven POM(项目对象模型)

    这篇文章主要介绍了Maven POM(项目对象模型)的相关资料,文中讲解非常细致,代码帮助大家更好的理解和学习,感兴趣的朋友可以了解下
    2020-07-07
  • 详解java平台解析协议相关备忘

    详解java平台解析协议相关备忘

    这篇文章主要介绍了详解java平台解析协议相关备忘,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-01-01
  • SpringCloud OpenFeign概述与使用

    SpringCloud OpenFeign概述与使用

    OpenFeign源于Netflix的Feign,是http通信的客户端。屏蔽了网络通信的细节,直接面向接口的方式开发,让开发者感知不到网络通信细节。所有远程调用,都像调用本地方法一样完成
    2023-01-01
  • java对list<Object>进行手动分页实现

    java对list<Object>进行手动分页实现

    本文主要介绍了java对list<Object>进行手动分页实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-07-07
  • java实现给图片加铺满的网格式文字水印

    java实现给图片加铺满的网格式文字水印

    这篇文章主要给大家介绍了关于java实现给图片加铺满的网格式文字水印的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-01-01
  • 详解在Spring3中使用注解(@Scheduled)创建计划任务

    详解在Spring3中使用注解(@Scheduled)创建计划任务

    本篇文章主要介绍了详解在Spring3中使用注解(@Scheduled)创建计划任务,具有一定的参考价值,感兴趣的小伙伴们可以参考一下。
    2017-03-03
  • 详解springmvc如何处理接受http请求

    详解springmvc如何处理接受http请求

    这篇文章主要给大家介绍了springmvc如何处理接受http请求,文中通过代码示例给大家讲解的非常详细,对大家的学习或工作有一定的帮助,需要的朋友可以参考下
    2024-02-02
  • Springboot使用thymeleaf动态模板实现刷新

    Springboot使用thymeleaf动态模板实现刷新

    这篇文章主要介绍了Springboot使用thymeleaf动态模板实现刷新,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2020-08-08
  • Maven下载和配置环境教程

    Maven下载和配置环境教程

    这篇文章主要为大家详细介绍了Maven下载和配置环境教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2017-08-08
  • Mybatis动态sql超详细讲解

    Mybatis动态sql超详细讲解

    动态SQL是MyBatis的强大特性之一,顾名思义就是会动的SQL,即是能够灵活的根据某种条件拼接出完整的SQL语句,下面这篇文章主要给大家介绍了关于Mybatis动态sql的相关资料,需要的朋友可以参考下
    2023-04-04

最新评论