java集合遍历的几种方式总结及详细比较

  

<强>集合类的通用遍历方式,用迭代器迭代:

        它=list.iterator Iterator ();   而(it.hasNext ()) {   对象obj=it.next ();   }      

  

     //Set设置=map.keySet ();//得到所有关键的集合   (整数:map.keySet ()) {   字符串str=map.get(在);//得到每个关键多对用值的值   }      

        Iterator比;它=map.entrySet () .iterator ();   而(it.hasNext ()) {   String> Map.Entry<整数;输入=it.next ();   system . out。println(“关键=" + entry.getKey() +”和价值=" https://www.yisu.com/zixun/+ entry.getValue ());   }      

        (Map.Entry<整数,String>条目:map.entrySet ()) {//Map.entry<整数,String>映射项(键-值对)有几个方法:用上面的名字//entry.getKey (); entry.getValue ();entry.setValue ();//map.entrySet()返回此映射中包含的映射关系的设置视图。   system . out。println(“关键=" + entry.getKey() +”和价值=" https://www.yisu.com/zixun/+ entry.getValue ());   }      

        (字符串v: map.values ()) {   system . out。println(“价值=" https://www.yisu.com/zixun/+ v);   }      

  

<强>第一种:

        (迭代器迭代器=list.iterator (); iterator.hasNext ();) {   int i=(整数)iterator.next ();   System.out.println(我);   }      

<强>第二种:
  

        迭代器迭代器=list.iterator ();   而(iterator.hasNext ()) {   int i=(整数)iterator.next ();   System.out.println(我);   }      

<强>第三种:
  

        对象(对象:表){   System.out.println(对象);   }      

<强>第四种:
  

        for (int i=0; i< list.size();我+ +){   int j=(整数)list.get(我);   System.out.println (j);   }      

  

  

  

这种方式,相邻的数据元素存放于相邻的内存地址中,整块内存地址是连续的。可以根据元素的位置直接计算出内存地址,直接进行读取。读取一个特定位置元素的平均时间复杂度为O(1)。正常来说,只有基于数组实现的集合,才有这种特性. java中以ArrayList为代表。

  

  

这种方式,每一个数据元素,在内存中都不要求处于相邻的位置,每个数据元素包含它下一个元素的内存地址。不可以根据元素的位置直接计算出内存地址,只能按顺序读取元素。读取一个特定位置元素的平均时间复杂度为O (n)。主要以链表为代表. java中以LinkedList为代表。
  

  

  

  

遍历者自己在集合外部维护一个计数器,然后依次读取每一个位置的元素,当读取到最后一个元素后,停止。主要就是需要按元素的位置来读取元素。

  

  

每一个具体实现的数据集合,一般都需要提供相应的迭代器。相比于传统的循环,迭代器取缔了显式的遍历计数器。所以基于顺序存储集合的迭代器可以直接按位置访问数据。而基于链式存储集合的迭代器,正常的实现,都是需要保存当前遍历的位置,然后根据当前位置来向前或者向后移动指针。

  

  

根据反编译的字节码可以发现,foreach内部也是采用了迭代器的方式实现,只不过Java编译器帮我们生成了这些代码。
  

  

  

  

因为是基于元素的位置,按位置读取,所以我们可以知道,对于顺序存储,因为读取特定位置元素的平均时间复杂度是O(1),所以遍历整个集合的平均时间复杂度为O (n)。而对于链式存储,因为读取特定位置元素的平均时间复杂度是O (n),所以遍历整个集合的平均时间复杂度为O (n2) (n的平方)。

  

ArrayList按位置读取的代码:直接按元素位置读取。

        瞬态对象[]elementData;      公共E (int指数){   rangeCheck(指数);   返回elementData(指数);   }      E elementData (int指数){   返回(E) elementData(指数);   }      

        瞬态int大?0;   瞬态Node第一个;   瞬态Node最后一次;      公共E (int指数){   checkElementIndex(指数);   返回节点(指数).item;   }      Node

java集合遍历的几种方式总结及详细比较