Java集合框架LinkedList详解及实例
Java集合框架LinkedList详解
LinkedList定义
packagejava.util; publicclassLinkedListextendsAbstractSequentialList implementsList ,Deque ,Cloneable,java.io.Serializable{ transientintsize=0; transientNode first; transientNode last; }
LinkedList概述
LinkedList以双向链表实现,允许重复。(如下Node的实现)并保留头指针和尾指针。
privatestaticclassNode{ Eitem; Node next; Node prev; Node(Node prev,Eelement,Node next){ this.item=element; this.next=next; this.prev=prev; } }
链表无容量限制,但双向链表本身使用了更多空间,也需要额外的链表指针操作。
按下标访问元素—get(i)/set(i,e)要悲剧的遍历链表将指针移动到位(如果i>数组大小的一半,会从末尾移起)。
publicEget(intindex){ checkElementIndex(index); returnnode(index).item; } publicEset(intindex,Eelement){ checkElementIndex(index); Nodex=node(index); EoldVal=x.item; x.item=element; returnoldVal; } Node node(intindex){ //assertisElementIndex(index); if(index<(size>>1)){ Node x=first; for(inti=0;i x=last; for(inti=size-1;i>index;i--) x=x.prev; returnx; } }
插入、删除元素时修改前后节点的指针即可,但还是要遍历部分链表的指针才能移动到下标所指的位置,只有在链表两头的操作—add(),addFirst(),removeLast()或用iterator()上的remove()能省掉指针的移动。
非线程安全,可以调用Collections.synchronizedList(newLinkedList<>());实现。
LinkedList用法
简单举个例子:
Listlist=newLinkedList<>(); list.add(4); list.add(2); list.add(3); list.add(5); for(inti:list) System.out.println(i); System.out.println(list);
运行结果:
4 2 3 5 [4,2,3,5]
LinkedList会保留插入数据的顺序。
subList的使用
Listlist=newLinkedList<>(); 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中的值也会跟着改变。
感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!