2014-03-18 50 views
0

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

list = newList; 

会列出现在是一个指向newList?或者我现在有2个完全独立的列表。

感谢

+1

为什么不从第一个列表中删除项目并完成它呢?或者这是一个假设的问题? – SamV

回答

5

你会被分配给list相同的列表newList引用的参考。分配后,只会涉及一个列表(listnewList将引用同一个对象)。此外,除非您另外引用list用于引用的对象,否则list用于引用的对象将被垃圾收集。当您使用此list = newList; newList的价值,这是参考

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 
    } 
} 
0

由SamV评论跟进,如果列表支持删除,你不需要两个列表进行此操作将含有有效项目的清单复制到列表中。

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

2

您可以简单地迭代该列表,然后检查有效性,如果不是有效的,只需将其删除即可。

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

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

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

+1

但是,只有'oldList'是一个可变列表才有效。 –

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