列表意外更新

时间:2013-09-28 18:25:57

标签: java list

我有一个意外更新的列表。我有一个返回列表的函数。我想用不同的参数调用它两次,并将结果存储在一个长列表中。

List<URL> resultUrls = new ArrayList<URL>();
webPages.runSearch(parameter1);                   // runs search and stores result in a public variable of the object webPages
resultUrls = webPages.getUrls();                  // returns public variable
webPages.runSearch(parameter2);
resultUrls.addAll(webPages.getUrls());

在执行最后一行之前,resultUrls已经使用parameter2包含runSearch的更新结果。我希望它仍然保存带有parameter1的runSearch的结果。最终结果是我使用相互追加的parameter2获得了两个搜索副本。我想要的是使用参数1附加搜索来自存储在resultUrls变量中的参数2的搜索。

非常感谢任何帮助。

2 个答案:

答案 0 :(得分:2)

List<URL> resultUrls = new ArrayList<URL>();
webPages.runSearch(parameter1);                   // runs search and stores result in a public variable of the object webPages
resultUrls = webPages.getUrls();                  // returns public variable

在此之后,您已丢弃您在第一个语句中创建的ArrayList,现在resultUrls是对作为对象成员的公共变量的引用由webPages引用。

你应该能够从这一点弄清楚。

提示:上面的最后一条陈述应该是

resultUrls.addAll(webPages.getUrls());

答案 1 :(得分:0)

我们不知道webPages是什么,但我怀疑问题是你的runSearch方法没有创建新列表 - 它只是改变了现有的列表。我怀疑你想要创建第一个列表的副本。请注意,您不需要创建原始ArrayList<URL>,因为无论如何都要丢弃它。

webPages.runSearch(parameter1); 
List<URL> resultUrls = new ArrayList<URL>(webPages.getUrls());
webPages.runSearch(parameter2);
resultUrls.addAll(webPages.getUrls());

(你可以以空列表开头,只需在第一次调用后添加webPages.getUrls()的结果,但这似乎有点无意义。)

我建议您实际更改设计,但是webPages的类型无论如何都不是有状态的 - 而是让runSearch返回相关列表。那时,您可以:

List<URL> resultUrls = webPages.runSearch(parameter1);
resultUrls.addAll(webPages.runSearch(parameter2));