java集合框架书籍_Java集合框架:LinkedList

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-linkedlist/

LinkedList定义

package java.util;

public class LinkedList

extends AbstractSequentialList

implements List, Deque, Cloneable, java.io.Serializable{

transient int size = 0;

transient Node first;

transient Node last;

}

LinkedList概述

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

private static class Node {

E item;

Node next;

Node prev;

Node(Node prev, E element, Node 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 x = node(index);

E oldVal = x.item;

x.item = element;

return oldVal;

}

Node node(int index) {

// assert isElementIndex(index);

if (index < (size >> 1)) {

Node x = first;

for (int i = 0; i < index; i++)

x = x.next;

return x;

} else {

Node 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 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 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 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中的值也会跟着改变。

参考资料

《关于Java集合的小抄》

欢迎跳转到本文的原文链接:https://honeypps.com/java/java-collection-linkedlist/

欢迎支持笔者新作:《深入理解Kafka:核心设计与实践原理》和《RabbitMQ实战指南》,同时欢迎关注笔者的微信公众号:朱小厮的博客。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值