为什么我的网络接口列表不能打印?

时间:2012-10-30 08:56:51

标签: java collections

我正在尝试打印网络接口列表(最终将它们存储在某种类型的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);

但我仍然很好奇为什么另一种方式不起作用。谢谢:))

1 个答案:

答案 0 :(得分:4)

简而言之,因为Enumeration是一个有状态迭代器。

第一次调用Collections.list(nets)时,此库方法将遍历nets枚举,拉出元素,直到枚举不再返回。这按预期工作,返回的列表正如您所期望的那样。

但是,在下一行,您再次致电Collections.list(nets) 。这会从nets现在已用尽中提取所有元素,因此“正确”会从没有(更多)元素的枚举中创建一个空列表。

解决此问题的一种方法是立即将nets转换为列表,然后在任何地方引用该列表。因此,您可以将代码的开头更改为:

List<NetworkInterface> nets = null;
try {
    nets = Collections.list(NetworkInterface.getNetworkInterfaces());
}
...

然后只需稍后引用nets列表,而不是每次都包装一个枚举。