Java 在中为每个语句使用枚举而不受RAM限制?

Java 在中为每个语句使用枚举而不受RAM限制?,java,enumeration,foreach,Java,Enumeration,Foreach,嗨,我有大约1000万个值,并在增强for循环中获得枚举,但它破坏了我的RAM。有什么方法可以得到迭代而不是枚举 我正在尝试为Collections.list()和Collections.enumeration()找到替代项 import java.util.Collections; 导入java.util.Enumeration; 导入java.util.Iterator; 公共最终类枚举{ /** *允许将{@link Enumeration}与for each语句一起使用 *实现不使用任何

嗨,我有大约1000万个值,并在增强for循环中获得枚举,但它破坏了我的RAM。有什么方法可以得到迭代而不是枚举

我正在尝试为Collections.list()和Collections.enumeration()找到替代项

import java.util.Collections;
导入java.util.Enumeration;
导入java.util.Iterator;
公共最终类枚举{
/**
*允许将{@link Enumeration}与for each语句一起使用
*实现不使用任何堆空间,这样就可以
*几乎无止境的枚举,而{@link Collections#list}是有限的
*因此,此实现比
*收藏。列表。
* 
*@param枚举
*原始枚举。
*@return直接调用原始枚举的{@link Iterable}。
*/
公共静态最终Iterable(最终枚举){
返回新的Iterable(){
公共最终迭代器迭代器(){
返回新的迭代器(){
公共最终布尔值hasNext(){
返回枚举。hasMoreElements();
}
公开期末考试T next(){
返回枚举.nextElement();
}
/**
*由于不可能实现此方法,因此未实施此方法
*从枚举中删除某些内容。
* 
*@抛出不支持的操作异常
*总是。
*/
公开最终作废删除(){
抛出新的UnsupportedOperationException();
}
};
}
};
}
}

我经常使用的一个技巧可能会有帮助,那就是说你有一个方法可以获取一个集合

 populate(List<String> list);
填充(列表);
您不想更改该方法,但您知道它只使用add()方法。您可以执行以下操作

 List<String> list = new ArraysList<String>() {
    public boolean add(String text) {
        myProcess(text);
        return false;
    }
 };
 populate(List<String> list);
List List=new ArraysList(){
公共布尔添加(字符串文本){
myProcess(文本);
返回false;
}
};
填充(列表);

在这种情况下,populate可以在不使用额外内存的情况下添加任意数量的数据。

Enumeratimon在Java 1.2(1998)中被Iterator替代了,还有什么理由继续使用它吗?最简单的解决方案是不使用增强的for循环。只需使用一个常规循环。为了让刚开始讨论这个问题的人明白:询问者想要一种替代方法来对枚举执行For Each,除了从枚举中列出一个列表,这将占用额外的空间。也就是说,我同意Peter的观点,除非必须使用枚举,否则应该避免枚举。不幸的是,Collections.list()的实现不是很聪明。而Collections.list()只是通过枚举接口的精简实现包装集合的迭代器(实际上不需要时间和空间)对于我来说,作者为什么选择实际返回ArrayList是一个疑问:这个决定强制实现者实际分配足够大的RAM来存储枚举的完整内容,然后实际复制内容。使用增强的for循环进行迭代就像breeze:)@Alzaz这种设计的一个好处是我们可以得到一个有限大小的列表。一个枚举可能会不断增长,因此在一个不断增长的枚举上,For-Each永远不会停止。如果您只是想“此刻”迭代元素,那么拥有一个有限大小的列表就可以做到这一点。然而,仅为每个循环获取一个循环而处理枚举似乎不值得。这是一个在无限列表上迭代的解决方案。想象一下,在Collections.list或Collections.enumeration中,RAM会发生什么。有时候你会遇到一些需要做的事情。这有一个“装饰性”的错误,它只工作一次,也就是说,如果你只想从你的Iterable中得到一个迭代器。对于增强的for循环来说,这很好,但我认为这违反了Iterable的一般约定。这可能是
list()
方法创建新列表的原因,而不是像您在这里所做的那样。Iterable的契约非常松散。它只保证迭代器返回正确类型的元素。它没有说明迭代器返回什么元素。我想这应该是
公共布尔加法(字符串文本)
 List<String> list = new ArraysList<String>() {
    public boolean add(String text) {
        myProcess(text);
        return false;
    }
 };
 populate(List<String> list);