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中的值也会跟着改变。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!
下一篇: 详解java中的6种单例写法及优缺点