Java:为什么Java.util.Collections.list(枚举)具有破坏性?
我有一个小程序,它依赖于从本地网络接口获取一些信息。 然后,我需要添加一些功能,这再次需要这些信息。 我不想触碰我经过测试和高度使用的方法。因此,迫于时间的压力,我决定重用该方法,有效地将NetworkInterface枚举转换为ArrayList,这不是我最自豪的编码时刻 在测试时,我注意到它实际上不起作用 行动顺序: 我从操作系统中获取一次NetworkInterface枚举,并将其放入一个类字段中 myMethod将NetworkInterface枚举转换为ArrayList,进行一些分析并返回一些信息,以便执行某些操作 myMethod将NetworkInterface枚举转换为ArrayList,进行一些分析并返回一些信息,以执行其他操作 我注意到,在第二次翻译中,结果是零! 在调试中,我注意到我的枚举有一个字段I。 该字段:第一次,它等于我的IFs计数的55,第二次,它等于0 我提供了一小段代码,可以复制它,以便于您调试我使用的Java 8:Java:为什么Java.util.Collections.list(枚举)具有破坏性?,java,list,arraylist,collections,iterable,Java,List,Arraylist,Collections,Iterable,我有一个小程序,它依赖于从本地网络接口获取一些信息。 然后,我需要添加一些功能,这再次需要这些信息。 我不想触碰我经过测试和高度使用的方法。因此,迫于时间的压力,我决定重用该方法,有效地将NetworkInterface枚举转换为ArrayList,这不是我最自豪的编码时刻 在测试时,我注意到它实际上不起作用 行动顺序: 我从操作系统中获取一次NetworkInterface枚举,并将其放入一个类字段中 myMethod将NetworkInterface枚举转换为ArrayList,进行一些分析
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
哈,真奇怪__哈,真奇怪__