【问题标题】:Java: Why is java.util.Collections.list(Enumeration) destructive?Java:为什么 java.util.Collections.list(Enumeration) 具有破坏性?
【发布时间】:2021-04-27 08:15:01
【问题描述】:

我有一个小程序,它依赖于从本地网络接口获取一些信息。 然后,我需要添加一些功能,这又需要该信息。 我不想碰我经过测试和高度使用的方法。因此,迫于时间的压力,我决定重用该方法,有效地将 NetworkInterface Enumeration 转换为 ArrayList 两次(这不是我最自豪的编码时刻!)。

经过测试,我发现它并没有真正起作用!

动作顺序:

  1. 我一次将网络接口枚举从操作系统中抓取到一个类字段中
  2. myMethod 将 NetworkInterface Enumeration 翻译成 ArrayList,做一些分析并返回一些信息,做一些事情
  3. myMethod 将 NetworkInterface Enumeration 转换为 ArrayList,做一些分析并返回一些信息,做一些事情 else

我注意到,在第二次翻译中,结果为零! 在调试中,我注意到我的枚举有一个字段“i”。 该字段:第一次等于 55(我的 IF 的计数),第二次等于 0...

我提供了一小段代码,可以重现它以供您调试(我使用的是 Java 8):

import java.net.NetworkInterface;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Enumeration;

public class CollectionsListDemo {
    public static void main(String[] args) {
        ArrayList<NetworkInterface> netFacesArList1;
        ArrayList<NetworkInterface> netFacesArList2;
        try {
            Enumeration<NetworkInterface> netFaces = NetworkInterface.getNetworkInterfaces();
            netFacesArList1 = Collections.list(netFaces);
            netFacesArList2 = Collections.list(netFaces);
        } catch (Exception e) {
            throw new RuntimeException("whatever");
        }

        System.out.println(netFacesArList1.size()); // 55, on my machine
        System.out.println(netFacesArList2.size()); // 0
    }
}

基本上,我想知道的是 Collections.list() 以这种方式工作是否有实际原因......或者这只是一个限制......或者我使用错误?

现在,我只是要把这个翻译取出来,放到一个单独的 ArrayList 中,我想我可以用不同的方法读取它,而不会记住以前读取的内容...

【问题讨论】:

    标签: java list arraylist collections iterable


    【解决方案1】:

    Collections.list(Enumeration) 并不是“破坏性的”。那就是EnumerationIterator 的过时版本)是一次性的。一旦你迭代...枚举它,它就会返回空并且剩下 0 个元素。 Iterator 也是如此,尽管 ListIterator 允许您向前和向后移动,因此即使迭代到最后也可以始终“倒带”。

    当您考虑假定的用例时,其原因会变得更加明显:

    Enumeration<NetworkInterface> netFaces = NetworkInterface.getNetworkInterfaces();
    while(netFaces.hasMoreElements()) {
        NetworkInterface iface = netFaces.nextElement();
        // do something with iface
    }
    // Enumeration object is now used up
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-03-15
      • 2013-05-16
      • 2015-11-08
      • 1970-01-01
      • 1970-01-01
      • 2013-02-20
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多