用新列表java替换旧列表

时间:2014-03-18 22:00:28

标签: java arraylist

所以基本上现在我有一个列表,为了从列表中删除无效项目,我正在循环它并将所有有效项目保存到新列表。循环完成后,我想将旧列表设置为等于新列表。我只是想知道,如果我去了

list = newList;

现在会列出一个指向newList的指针吗?或者我现在有2个完全独立的清单。

由于

4 个答案:

答案 0 :(得分:5)

您将为list分配newList引用的相同列表的引用。在分配之后,将只涉及一个列表(listnewList将引用相同的对象)。此外,除非您对list用于引用的对象有另一个引用,否则list用于引用的对象将被垃圾回收。

跟进SamV的评论,如果列表支持删除,那么您不需要两个列表来执行此操作:

List<Thing> list = . . .;
for (Iterator<Thing> iter = list.iterator(); iter.hasNext(); ) {
    Thing t = iter.next();
    if (!isValid(t)) {
        iter.remove(); // removal through the iterator itself is ok
    }
}

答案 1 :(得分:2)

您可以简单地遍历该列表,然后检查有效性,如果不是有效则只需删除它。

for (Iterator<SomeThing> itr = oldList.iterator(); itr.hasNext();) {
    SomeThing smt = itr.next();

    if(!valid) {
        itr.remove();
    }
 }

通过这种方式,您不必创建新列表,然后填写它然后将其分配给旧列表,您将跳过所有代码。

答案 2 :(得分:0)

使用此list = newList;时,newList的值将被复制到列表中,该列表是对包含有效项目的列表的引用。

所以是的,现在list和newList将引用完全相同的对象。

答案 3 :(得分:0)

您可以考虑是否有必要改变列表。从列表中删除有两个指向它的变量的项只会增加混乱。变量是标签,如果它们被分配到多个地方,则其含义会发生变化。听起来你想根据谓词过滤列表。使用Java 8,您可以执行以下操作。

List<String> words = new ArrayList<String>(Arrays.asList("foo", "bar", "baz"));

List<String> wordsStartingWithB = // filtered list
    words.stream()
         .filter(word -> word.toUpperCase().startsWith("B"))
         .collect(Collectors.toList());

wordsStartingWithB.stream()
                  .forEach(s -> System.out.println(s));
// bar
// baz

这允许单词在原始形式中保持完整,而wordsStartingWithB将仅包含您想要的项目。它还为您提供了一个优势,即能够为变量赋予有意义的名称,因为它的含义以后不会改变。尝试将final放在变量前面,看看它是如何让你重新思考这个问题的。

java.util.Stream添加了许多其他有用的方法。当有意义地利用并行运行时,你可以用parallelStream()替换.stream()。

http://download.java.net/jdk8/docs/api/java/util/stream/Stream.html