欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Java集合框架LinkedList详解及实例

程序员文章站 2024-03-01 13:47:34
java集合框架linkedlist详解 linkedlist定义 package java.util; public class 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中的值也会跟着改变。

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