English 中文(简体)
在爪哇需要校服吗?
原标题:Need of Iterator class in Java?
  • 时间:2012-05-25 07:33:12
  •  标签:
  • java

我知道这个问题可能很模糊,但我之所以问这个问题,是因为这个班必须经过一些思考。

这个问题出现在我脑海中,

考虑以下代码:

class A
{

    private int myVar;

    A(int varAsArg)
    {
          myVar = varAsArg;
    }

   public static void main(String args[])
   {

      List<A> myList = new LinkedList<A>();
      myList.add(new A(1));
      myList.add(new A(2));
      myList.add(new A(3));

      //I can iterate manually like this:
      for(A obj : myList)
                 System.out.println(obj.myVar);

      //Or I can use an Iterator as well:
      for(Iterator<A> i = myList.iterator(); i.hasNext();)
      {
         A obj = i.next();
         System.out.println(obj.myVar);
      }
   }
}

因此,从上述代码中可以看到,我可以用 < code> for cyol 来代替迭代,而我可以使用 < code> Iterator class class hasNext () next () 方法。同样,也可以用 remove () 方法作为例子。经验丰富的用户评论了使用 < code> Iterator 类的其他答案,而不是使用 < code> for locs to exerate by < list 。 为什么?

更让我困惑的是, Iterator class < a href="http://docs.oracle.com/javase/1.4.2/docs/api/java/ util/ Iterator.html" rel="nofollow" > 三种 方法。这些方法的功能可以通过写一个略有不同的代码来实现。

有些人可能会争辩说,许多类的功能可以通过写入一个自有代码来实现,而不是使用为此而制作的 < code> class 。 是的, 确实如此。 但正如我所说, < code> Iterator class只有三种方法。 因此,为什么在同一个任务可以用一个简单的代码块来完成时,要经过繁琐的创建额外类的工作,而这个代码块也不是太复杂,无法理解。


编辑:

虽然我同意,因为许多答案都说,如果不使用 Iterator ,我就无法实现移除功能,所以我想知道以下内容是否是错误的,或者是否会产生一些不可取的结果。

for(A obj : myList)
{
           if(obj.myVar == 1)
                 myList.remove(obj);
}

上述代码片断是否与 remove 做同样的事情?

最佳回答

首先,每个构造都实际在封面下使用 < code> Iterator 界面。 但是, 它不会将下面的 < code> Iterator 实例暴露在用户代码中, 所以无法调用 方法 。

这意味着有些东西需要明确使用 Iterator 接口,无法通过使用每个环来实现。

删除当前元素就是这样一种使用实例。

其他想法见ContopMdificationExpeption 。即使允许它工作,它也含糊不清(如果obj 出现在清单中两次呢? )和低效(对于链接的清单,它需要直线而非恒定时间) 。

问题回答

Iterator 远早于你在 Java 进化过程中显示的 for 语句。 这就是为什么它就在那里。 另外,如果你想删除某些东西,则使用 Iterator.remove () () < decode > (不能使用 for 语句) 来做到这一点(不能使用 for 语句)。

每个构件( for (Xx: list) ) 实际使用 Iterator 作为其内部实施。 您可以将任何 Iterable 作为元素源。

正如其他人已经说过的那样:在爪哇,迭代器比预言更长,它提供remove () <()

还有: 您将如何执行您自己的提供者类 ( myliist in your example)? 您将使它变成 < code> Iterable , 并使用一种创建 < code> Iterator 的方法 。

首先,在向爪哇引入 forach 环(见上面的代码样本)之前,创建了 Iterator 。 (前者在爪哇2,后者只在爪哇5)。

自 Java5 以来,每个圆环实际上是最常见的情景(当您一次在默认的顺序下通过一个单一的 < code> Iterable 迭代时,不需要删除或索引元素)中首选的单圈。 请注意,每个圆环在背景中使用了标准收集类的迭代器;换句话说,它只是合成糖。

迭代器,列表驱动器都用于允许用户使用不同的权限,如列表代用器有9种方法,但迭代器只有3种方法,但可以删除您无法在循环中实现的功能。计算是另外一回事,也用于只给予阅读权限。

试管是古典政府设计模式的一种实施, 这样您就可以实现行为清晰的分离, 与迭代( 迭代) 的技术代码和您的商业代码区分 。

想象一下您必须改变下一步行为( 比如, 通过获取下一个元素而不是下一个 Even 元素) 。 如果您只依赖 < code> 环的 < code> /code> 环, 您必须手动改变每个循环, 像这样的方式

for (int i; i < list.size(); i = i+2)

如果您使用迭代器, 您可以简单地覆盖/ 重写“ 下一步( ) ” 和“ 下一步( ) ” 方法, 而修改将会在您的应用程序中随处可见 。

我认为,回答你的问题是抽象的。迭代符是写成的,因为要抽象地转动不同的收藏集。

每个收藏都有不同的方法对元素进行循环。 矩阵列表已经对访问进行了索引化。 Queses 有民意测验和偷看方法。 Stack 有弹出和偷看方法 。

通常您只需要对元素进行迭代即可使迭代程序开始运行。 您并不关心您需要迭代的收藏类型。 您只需调用迭代( ) 方法, 而用户迭代程序则反对这样做 。

如果您询问为什么不在收藏界面上使用相同的方法, 并删除额外的对象创建 。 您需要了解您在收藏中当前的位置, 从而无法在收藏中执行下一个方法, 因为您无法在不同的位置使用它, 因为每次调用下一个( ) 方法时, 它都会增加索引( 简化每个收藏的安装方式不同), 所以如果在不同的地方使用相同的收藏, 您就会跳过一些对象 。 另外, 如果您在收藏中无法写入下一个( ) 的多线索安全方法, 则收藏支持“ 货币 ” 。

It is usually not safe to remove an object from collection iterating by other means than iterator. Iterator.remove() method is safest way to do it. For ArrayList example: for(int i=0;i





相关问题
Spring Properties File

Hi have this j2ee web application developed using spring framework. I have a problem with rendering mnessages in nihongo characters from the properties file. I tried converting the file to ascii using ...

Logging a global ID in multiple components

I have a system which contains multiple applications connected together using JMS and Spring Integration. Messages get sent along a chain of applications. [App A] -> [App B] -> [App C] We set a ...

Java Library Size

If I m given two Java Libraries in Jar format, 1 having no bells and whistles, and the other having lots of them that will mostly go unused.... my question is: How will the larger, mostly unused ...

How to get the Array Class for a given Class in Java?

I have a Class variable that holds a certain type and I need to get a variable that holds the corresponding array class. The best I could come up with is this: Class arrayOfFooClass = java.lang....

SQLite , Derby vs file system

I m working on a Java desktop application that reads and writes from/to different files. I think a better solution would be to replace the file system by a SQLite database. How hard is it to migrate ...

热门标签