Java:为什么Java.util.Collections.list(枚举)具有破坏性?

Java:为什么Java.util.Collections.list(枚举)具有破坏性?,java,list,arraylist,collections,iterable,Java,List,Arraylist,Collections,Iterable,我有一个小程序,它依赖于从本地网络接口获取一些信息。 然后,我需要添加一些功能,这再次需要这些信息。 我不想触碰我经过测试和高度使用的方法。因此,迫于时间的压力,我决定重用该方法,有效地将NetworkInterface枚举转换为ArrayList,这不是我最自豪的编码时刻 在测试时,我注意到它实际上不起作用 行动顺序: 我从操作系统中获取一次NetworkInterface枚举,并将其放入一个类字段中 myMethod将NetworkInterface枚举转换为ArrayList,进行一些分析

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

在测试时,我注意到它实际上不起作用

行动顺序:

我从操作系统中获取一次NetworkInterface枚举,并将其放入一个类字段中 myMethod将NetworkInterface枚举转换为ArrayList,进行一些分析并返回一些信息,以便执行某些操作 myMethod将NetworkInterface枚举转换为ArrayList,进行一些分析并返回一些信息,以执行其他操作 我注意到,在第二次翻译中,结果是零! 在调试中,我注意到我的枚举有一个字段I。 该字段:第一次,它等于我的IFs计数的55,第二次,它等于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中,我想我可以用不同的方法读取它,而不需要它记住以前读取的内容…

不是集合。ListNumeration是破坏性的。这是一个过时版本的枚举是一次性使用的。一旦你用iter…枚举它,它返回空的,剩下0个元素。迭代器也是如此,尽管a允许您向前和向后移动,所以即使迭代到最后,它也可以始终被重绕

当你考虑假设用例时,这个原因变得更加明显:

Enumeration<NetworkInterface> netFaces = NetworkInterface.getNetworkInterfaces();
while(netFaces.hasMoreElements()) {
    NetworkInterface iface = netFaces.nextElement();
    // do something with iface
}
// Enumeration object is now used up
并不是说Collections.ListNumeration具有破坏性。这是一个过时版本的枚举是一次性使用的。一旦你用iter…枚举它,它返回空的,剩下0个元素。迭代器也是如此,尽管a允许您向前和向后移动,所以即使迭代到最后,它也可以始终被重绕

当你考虑假设用例时,这个原因变得更加明显:

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

哈,真奇怪__哈,真奇怪__