所以基本上现在我有一个列表,为了从列表中删除无效项目,我正在循环它并将所有有效项目保存到新列表。循环完成后,我想将旧列表设置为等于新列表。我只是想知道,如果我去了
list = newList;
现在会列出一个指向newList的指针吗?或者我现在有2个完全独立的清单。
由于
答案 0 :(得分:5)
您将为list
分配newList
引用的相同列表的引用。在分配之后,将只涉及一个列表(list
和newList
将引用相同的对象)。此外,除非您对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