<强>集合类的通用遍历方式,用迭代器迭代:强>
它=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集合遍历的几种方式总结及详细比较