A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© air 中级黑马   /  2013-12-6 04:01  /  1875 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 air 于 2013-12-6 16:25 编辑

二话不说,插入代码
  1. import java.util.*;
  2. /*
  3. 去除ArrayList集合中的重复元素
  4. */
  5. class ArrayListTest
  6. {
  7.         public static void main(String[] args)
  8.         {
  9.                 System.out.println("Hello World!");
  10.         }

  11.         public static ArrayList singleElement(ArrayList al)
  12.         {
  13.                 //定义一个临时容器。
  14.                 ArrayList newAl = new ArrayList();
  15.                
  16.                 Iterator it= al.iterator();
  17.                 while(it.hasNext())
  18.                 {
  19.                         Object obj =it.next();
  20.                         
  21.                         if(!newAl.contains(obj))
  22.                                 newAl.add(obj);
  23.                 }
  24.                 return newAl;
  25.         }
  26. }
复制代码

在java中,Iterator it= al.iterator();这一步他的过程是怎么样的呢?
我感觉视频里老师好像也没有很贴切的举例来形容它,带过去了。反正我是不太理解。
请知道的同学给我一些思路上的详细解释好不好?

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

6 个回复

倒序浏览
同学你好。
Iterator it= al.iterator();
意思是返回了一个当前集合的迭代器。
这个迭代器是一个内部类。可以操作集合中的成员。
下面是源代码。

  1. public Iterator<E> iterator() {
  2.         return new Itr();
  3.     }

  4.     /**
  5.      * An optimized version of AbstractList.Itr
  6.      */
  7.     private class Itr implements Iterator<E> {
  8.         int cursor;       // index of next element to return
  9.         int lastRet = -1; // index of last element returned; -1 if no such
  10.         int expectedModCount = modCount;

  11.         public boolean hasNext() {
  12.             return cursor != size;
  13.         }

  14.         @SuppressWarnings("unchecked")
  15.         public E next() {
  16.             checkForComodification();
  17.             int i = cursor;
  18.             if (i >= size)
  19.                 throw new NoSuchElementException();
  20.             Object[] elementData = ArrayList.this.elementData;
  21.             if (i >= elementData.length)
  22.                 throw new ConcurrentModificationException();
  23.             cursor = i + 1;
  24.             return (E) elementData[lastRet = i];
  25.         }

  26.         public void remove() {
  27.             if (lastRet < 0)
  28.                 throw new IllegalStateException();
  29.             checkForComodification();

  30.             try {
  31.                 ArrayList.this.remove(lastRet);
  32.                 cursor = lastRet;
  33.                 lastRet = -1;
  34.                 expectedModCount = modCount;
  35.             } catch (IndexOutOfBoundsException ex) {
  36.                 throw new ConcurrentModificationException();
  37.             }
  38.         }

  39.         final void checkForComodification() {
  40.             if (modCount != expectedModCount)
  41.                 throw new ConcurrentModificationException();
  42.         }
  43.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
Iterator it= al.iterator(); 这一步是通过al集合创建一个可以可以迭代it集合。
al.iterator()返回的是Iterator类型数据,再赋值给it。
举例子的话,还真不好举,就好比一杯水装在普通瓶子里面,我们想知道里面水有多少,我们就可以把这里面的水到到一个带有刻度的容器中。

评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
Iterator模式是用于遍历集合类的标准访问方法。它可以把访问逻辑从不同类型的集合类中抽象出来,从而避免向客户端暴露集合的内部结构。
如果没有Iterator,我们就需要用for循环或while来遍历集合,这样对于不同的集合,遍历方法是不一样的。。。。
Iterator模式则总是用同一种逻辑来遍历集合:

for(Iterator it = c.iterater(); it.hasNext(); ) { ... }

通过源码可以看出:
public interface Iterator {
  boolean hasNext();
  Object next();
  void remove();
}
   依赖前两个方法就能完成遍历,典型的代码如下:

for(Iterator it = c.iterator(); it.hasNext(); ) {
  Object o = it.next();
  // 对o的操作...
}
   在JDK1.5中,还对上面的代码在语法上作了简化:

// Type是具体的类型,如String。
for(Type t : c) {
// 对t的操作...
}
经过Iterator迭代过的每种集合,他们实现了Iteator接口,还是可以返回自己集合类型,如Array可能返回ArrayIterator,Set可能返回SetIterator,Tree可能返回TreeIterato







评分

参与人数 1技术分 +1 收起 理由
田磊阳 + 1

查看全部评分

回复 使用道具 举报
老师在视频里面说了啊,这是集合的特有取出方式。Iterator也是一个接口,其内部类实现了这个接口,所以更利于数据的取出。你就理解成是集合的特有取出方式还有内部类就行了。

迭代器(Iterator):用来取出集合中的元素的;迭代器就是把取出的方式定义在集合内部,这样取出方式就可以直接访问集合内部元素了,所以定义成了内部类。但是每个容器的数据结构都不同,所以取出的细节也不一样,但是都有判断和取出的共性动作,所以就将共性进行抽取形成一个接口(Iterator),所以这些内部类只要实现了这个借口,就可以用对外提供的hasNext()方法判断有没有元素和用next()方法取出元素了
                ArrayList list = new ArrayList();
                list.add("123");
                list.add("b");
                list.add("a");

                Iterator it = list.iterator();

                while(it.hasNext())
                {
                        sop(it.next());
                }
回复 使用道具 举报
  是这样:Iterator是一个接口,无法实例化,只能通过ArrayList对象的iterator()方法来迭代获取arraylist的元素,这样一来,就等同于new 了一个Iterator,之后你才能通过Iterator的句柄来判断并且遍历ArrayList可变数组里的值。
  大白话就是:数组要用到for循环来遍历数组,同样的,ArrayList就要用到Iterator迭代器来遍历。
回复 使用道具 举报
air 中级黑马 2013-12-6 16:23:05
7#
史超 发表于 2013-12-6 10:40
是这样:Iterator是一个接口,无法实例化,只能通过ArrayList对象的iterator()方法来迭代获取arraylist的 ...

你这大白话还真是白啊。一看就明白了。。3Q,上面几位朋友说的挺专业的。只是不太适合我这个初学的人理解概念。谢谢各位
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马