不知道大家有没有试过这样去遍历一个LinkedList
- for(int i=0;i<list.size();i++){
- list.get(i);
- }
我以前就是这样做的,不是不知道有iterator 这个方法,而是习惯了。
到不久前自己用JAVA去重写数所据结构的实现才发现一些东西。
像用Itertate 比用for循环快,究单竟快多少呢?
下面我用自己写的例子说一点个人见解:
List 的结点:
- package com.shmilyhe.data;
- public class Node<T> {
- public T content;
- public Node<T> next;
- public Node(){}
- public Node(T value){
- content=value;
- }
- }
链表(LinkedList 是双向链表,为了简单我只写了个单向的,测试迭代效果是一样的)
- package com.shmilyhe.data;
- public class SinglyLinked<T> {
- private Node<T> current;
- private Node<T> head;
- private Node<T>end;
- private int count;
- public T next(){
- T t=current==null?null:current.content;
- current=current==null?null:current.next;
- return t;
- }
- public void reSet(){
- current=head;
- }
- public void remove(int index){
- Node<T> node=head;
- for(int i=0;i<index;i++){
- node=node==null?null:node.next;
- }
- if(node!=null)node.next=node.next==null?null:node.next.next;
- }
- public int length(){
- return count;
- }
- public T get(int index){
- Node<T>node=head;
- for(int i=0;i<index;i++){
- node=node==null?null:node.next;
- }
- return node==null?null:node.content;
- }
- public void removeAll(){
- current=null;
- head=null;
- count=0;
- }
- public void add(T value){
- if(head==null){
- head=new Node<T>();
- head.content=value;
- end=head;
- current=head;
- }else{
- end.next=new Node<T>(value);
- end=end.next;
- }
- count++;
- }
- public Object[] toArray(){
- Object[] array=new Object[this.count];
- T t=null;
- int flag=0;
- while((t=this.next())!=null){
- array[flag]=t;
- flag++;
- }
- return array;
- }
- }
由上面可知:
迭代遍历List 时间复杂度为T(n)=O (n)
而用for 循环则 T(n)=O(n*n+n/2)
for 循环遍历 用的时间是 迭代的(n+1)/2倍即list越大效率相差越大
事实是不是这样呢?
下面是我写的SinglyLinked 和JAVA 自带的LinkedList的测试,结果正如我所想
- package com.shmilyhe.test;
- import java.util.Date;
- import java.util.Iterator;
- import java.util.LinkedList;
- import org.junit.Test;
- import com.shmilyhe.data.SinglyLinked;
- public class SinglyLinkedTest {
- @Test
- public void testIterator(){
- SinglyLinked sl=new SinglyLinked();
- for(int i=0;i<100000;i++){
- sl.add(""+i);
- }
- Object tem=null;
- Date bt=new Date();
- while((tem=sl.next())!=null){
- System.out.println(tem);
- }
- Date et=new Date();
- System.out.println(bt+"/n");
- System.out.println(et+"/n");
- System.out.println("迭代所用的时间为(MS):"+(et.getTime()-bt.getTime()));
- }
- @Test
- public void testFor(){
- SinglyLinked sl=new SinglyLinked();
- for(int i=0;i<100000;i++){
- sl.add(""+i);
- }
- Date bt=new Date();
- for(int i=0;i<sl.length();i++){
- System.out.println(sl.get(i));
- }
- Date et=new Date();
- System.out.println(bt+"/n");
- System.out.println(et+"/n");
- System.out.println("for循环遍历所用的时间为(MS):"+(et.getTime()-bt.getTime()));
- }
- @Test
- public void testGenericsIterator(){
- SinglyLinked<String> sl=new SinglyLinked<String>();
- for(int i=0;i<100000;i++){
- sl.add(""+i);
- }
- String tem=null;
- Date bt=new Date();
- while((tem=sl.next())!=null){
- System.out.println(tem);
- }
- Date et=new Date();
- System.out.println(bt+"/n");
- System.out.println(et+"/n");
- System.out.println("泛型迭代所用的时间为(MS):"+(et.getTime()-bt.getTime()));
- }
- @Test
- public void testLinkedListItorate(){
- LinkedList ll=new LinkedList();
- for(int i=0;i<100000;i++){
- ll.add(""+i);
- }
- Iterator it =ll.iterator();
- Date bt=new Date();
- while(it.hasNext()){
- System.out.println(it.next());
- }
- Date et=new Date();
- System.out.println(bt+"/n");
- System.out.println(et+"/n");
- System.out.println("LinkedList迭代所用的时间为(MS):"+(et.getTime()-bt.getTime()));
- }
- @Test
- public void testLinkedListFor(){
- LinkedList ll=new LinkedList();
- for(int i=0;i<100000;i++){
- ll.add(""+i);
- }
- Date bt=new Date();
- for(int i=0;i<ll.size();i++){
- System.out.println(ll.get(i));
- }
- Date et=new Date();
- System.out.println(bt+"/n");
- System.out.println(et+"/n");
- System.out.println("for循环遍历LinkedList所用的时间为(MS):"+(et.getTime()-bt.getTime()));
- }
- }