/**
* 测试 对于ArrayList的iterator遍历和for遍历的效率问题
* 注: 这个测试结果对其他容器类不一定成立 比如LinkedList
*
*/
public class IteratorTest {
static int size = 1000000;
static List<Object> list1 = new ArrayList<Object>();
static List<Object> list2 = new ArrayList<Object>();
static {
for (int i = 0; i < size; i++) {
list1.add(new Object());
list2.add(new Object());
}
}
@Test
public void iteratorTest() {
long start = System.currentTimeMillis();
for (Iterator<Object> iterator = list1.iterator(); iterator.hasNext();) {
Object entry = (Object) iterator.next();
// System.out.print(entry);
}
System.out.println("\niterator " + (System.currentTimeMillis() - start) + " ms");
}
@Test(dependsOnMethods = "iteratorTest")
public void forTest() {
long start = System.currentTimeMillis();
for (int i = 0, size = list2.size(); i < size; i++) {//这里是一次性求出size() ,假如在遍历的过程中list的内容有增减的话,遍历逻辑会出错
Object entry = list2.get(i);
// System.out.print(entry);
}
System.out.println("\nfor " + (System.currentTimeMillis() - start) + " ms");
}
@Test(groups="alone",invocationCount=10) //testng 测试10次
public void compareTest() {
long start = System.currentTimeMillis();
for (Iterator<Object> iterator = list1.iterator(); iterator.hasNext();) {
Object entry = (Object) iterator.next();
// System.out.print(entry);
}
long time=System.currentTimeMillis()-start;
start = System.currentTimeMillis();
for (int i = 0, size = list2.size(); i < size; i++) {
Object entry = list2.get(i);
// System.out.print(entry);
}
long time2=System.currentTimeMillis() - start;
System.out.println("iterator "+time +" ms, for "+time2+" ms");
}
}
输出
iterator 32 ms
for 15 ms
iterator 32 ms, for 15 ms
iterator 31 ms, for 0 ms
iterator 31 ms, for 0 ms
iterator 32 ms, for 15 ms
iterator 31 ms, for 16 ms
iterator 31 ms, for 16 ms
iterator 31 ms, for 0 ms
iterator 31 ms, for 0 ms
iterator 31 ms, for 16 ms
iterator 31 ms, for 16 ms
遍历中的remove测试
@Test
public void iteratorTest() {
long start = System.currentTimeMillis();
for (Iterator<Object> iterator = list1.iterator(); iterator.hasNext();) {
Object entry = (Object) iterator.next();
System.out.println(entry);
iterator.remove();//right
}
System.out.println("\niterator " + (System.currentTimeMillis() - start) + " ms");
}
@Test(expectedExceptions = IndexOutOfBoundsException.class)
public void forTest() {
long start = System.currentTimeMillis();
for (int i = 0, size = list2.size(); i < size; i++) {
Object entry = list2.get(i);
System.out.println(entry);
list2.remove(i);//wrong
}
System.out.println("\nfor " + (System.currentTimeMillis() - start) + " ms");
}
输出
0
1
2
3
4
5
6
7
8
9
iterator 0 ms
0
2
4
6
8
public static void main(String[] args) {
List a =new ArrayList();
for (int i = 0; i < 10; i++) {
a.add(i);
System.out.println(i);
}
System.out.println("-------------");
int j =0;
for (Iterator iterator = a.iterator(); iterator.hasNext();) {
Object object = (Object) iterator.next();
if(j%2==0){
iterator.remove();
}
j++;
}
for (Object object : a) {
System.out.println(object);
}
}
0
1
2
3
4
5
6
7
8
9
-------------
1
3
5
7
9
分享到:
相关推荐
在Struts2框架中,`<s:iterator>`标签被广泛用于遍历集合或数组等数据结构。本文将深入探讨如何使用Struts2中的`<s:iterator>`标签来遍历二维数组,并通过实例代码来具体说明其用法。 ### Struts2 Iterator标签 ##...
通过实验,我们可以看到,当元素数量较大(如1000000)时,使用索引遍历(第四种方法)的效率最高,其次是增强型for循环,然后是使用Iterator。当元素数量较小(如10)时,各种方法之间的差异变得微不足道,因为此时...
除了使用Iterator之外,我们还可以使用for循环来遍历ArrayList。下面是一个示例代码: ```java ArrayList arrayList = new ArrayList(); for(int i=0; i < arrayList.size(); i++){ arrayList.get(i); // ...........
在遍历 ArrayList 时,不能使用传统的 for 循环来删除元素,因为这将导致 ConcurrentModificationException 异常。相反,我们可以使用以下三种方法来遍历和删除 ArrayList 元素: ### 1. 使用迭代器(Iterator) ...
"Java Iterator接口遍历单列集合迭代器原理详解" Java Iterator接口是Java集合框架中的一员,它主要用于遍历集合中的所有元素。 Iterator接口也是Java集合中的一员,但它与Collection、Map接口有所不同,Collection...
ArrayList提供了一种高效的方式来管理大量的元素,并且提供了迭代器(Iterator)来遍历这些元素,使得我们可以在不暴露底层实现细节的情况下访问和修改列表中的元素。这个资源的目的是通过模拟Java ArrayList的...
在Java编程中,`Iterator`是用于遍历集合(如`List`, `Set`等)的重要工具。然而,当我们尝试在使用`Iterator`遍历集合的过程中直接修改集合时,可能会遇到`ConcurrentModificationException`异常。这个异常通常发生...
- 遍历ArrayList时,使用迭代器通常比索引遍历效率更高,因为迭代器避免了对size()的重复计算。 - 对于大规模数据的增删操作,考虑使用LinkedList,因为ArrayList的插入和删除操作在中间位置时效率较低。 了解并...
通过Iterator迭代器,可以遍历ArrayList、Set、Map等各种集合类型。 1、使用迭代器遍历ArrayList集合 在Java中,ArrayList是一种常见的集合类型,可以使用Iterator迭代器来遍历其元素。下面是一个简单的实例: ``...
在ArrayList中,元素存储在一个连续的内存区域,通过索引可以直接访问到元素,因此对于ArrayList,使用for循环遍历是非常高效的操作,因为get方法可以通过索引快速访问元素,时间复杂度为O(1)。 但是,当使用普通...
在Java编程语言中,迭代器模式(Iterator Pattern)是一种常用的设计模式,用于顺序访问集合对象中的元素,而无需暴露其底层表示。这种模式提供了一种方法来访问一个聚合对象的元素,而无需暴露该对象的内部结构。在...
在提供的代码实例中,可以看到使用 `Enumeration` 和 `Iterator` 遍历 `Hashtable` 的时间测试。虽然在小数据量情况下 `Enumeration` 可能稍微快一些,但随着数据量的增加,两者之间的差距会逐渐缩小。因此,选择...
6. **迭代器**:`ArrayList`支持迭代器(`Iterator`),可以方便地遍历并操作列表中的元素,同时迭代器提供了`hasNext()`和`next()`方法。 7. **扩容策略**:当`ArrayList`需要扩容时,它会将容量扩大为当前容量的...
3. 探究`Iterator`与直接使用`ArrayList`在效率上的差异: - `Iterator`遍历:`Iterator`允许我们在遍历过程中删除元素,而不会导致`ConcurrentModificationException`。它不依赖于索引,因此在某些情况下可能比...
- `ArrayList`可能会返回一个基于数组的`Iterator`。 - `LinkedList`可能会返回一个基于双向链表的`Iterator`。 - `HashSet`可能会返回一个能够快速查找元素的`Iterator`。 ### 六、总结 本文通过对`java.util....
本资料主要探讨如何遍历Java中的List集合,包括基本的迭代器方式、增强for循环(foreach)以及流(Stream)API的使用。下面我们将深入讲解这些遍历方法。 1. 迭代器(Iterator)遍历: Java中的List接口定义了...
同时,理解不同集合类的底层实现和遍历效率也是必不可少的知识。 总之,掌握Java集合遍历的基本方法并能灵活运用,是成为一名优秀Java开发者的基础。无论在实际开发还是面试中,这都是展示你编程功底的重要环节。...
本篇文章将详细介绍几种常用的遍历`Map`的方法,包括使用传统迭代器(Iterator)、增强型for循环(For-Each循环)以及通过键集(Key Set)进行遍历。 #### 一、使用Iterator遍历Map 1. **通过`entrySet()`获取迭代...