我正在尝试打印网络接口列表(最终将它们存储在某种类型的String数组中)。以下代码仅在
时打印接口列表 String[] networkInterfaces = new String[Collections.list(nets).size()];
线不存在。如果不存在单行,它将打印整个列表。
Enumeration<NetworkInterface> nets = null;
try {
nets = NetworkInterface.getNetworkInterfaces();
} catch (SocketException e) {
e.printStackTrace();
}
System.out.println(Collections.list(nets).size());
String[] networkInterfaces = new String[Collections.list(nets).size()];
for (NetworkInterface netint : Collections.list(nets)) {
System.out.println(netint.getName());
}
很抱歉这个问题上没有标签,我不确定什么是合适的。知道为什么会这样吗?我修改了它,以便将集合保存到ArrayList(看起来很好)
ArrayList<NetworkInterface> netints = Collections.list(nets);
但我仍然很好奇为什么另一种方式不起作用。谢谢:))
答案 0 :(得分:4)
简而言之,因为Enumeration
是一个有状态迭代器。
第一次调用Collections.list(nets)
时,此库方法将遍历nets
枚举,拉出元素,直到枚举不再返回。这按预期工作,返回的列表正如您所期望的那样。
但是,在下一行,您再次致电Collections.list(nets)
。这会从nets
,现在已用尽中提取所有元素,因此“正确”会从没有(更多)元素的枚举中创建一个空列表。
解决此问题的一种方法是立即将nets
转换为列表,然后在任何地方引用该列表。因此,您可以将代码的开头更改为:
List<NetworkInterface> nets = null;
try {
nets = Collections.list(NetworkInterface.getNetworkInterfaces());
}
...
然后只需稍后引用nets
列表,而不是每次都包装一个枚举。