我想制作一个List的浅表副本,我通过方法调用返回它(来自Android的公共列表getScanResults(),请参阅http://developer.android.com/reference/android/net/wifi/WifiManager.html#getScanResults%28%29)。问题是,clone()没有在List接口上定义,但只在像ArrayList这样的具体类上定义 - 但是我不知道getScanResults()在内部使用了什么,所以我不能简单地使用它或者我错了这个?然后我想到了像
这样的东西anExistingList.add(getScanResults());
但是getScanResults()似乎返回null而不是空列表,如果没有什么可以返回,那么这也是没有选项。 什么时候我会做
if(getScanResults() != null)
anExistingList.add(getScanResults());
getScanResults()的返回值可能在第一个代码行和第二个代码行之间发生变化,因此它可以首先传递“not equals null”条件,然后在第二行中为null,或者我错了吗? / p>
那么,我如何制作getScanResults()返回值的浅表副本或者只是制定我的目标:从getScanResults()获取一个值并确保它在我使用它时不会改变?
感谢任何提示:-) (我想我只是在理解错误)
答案 0 :(得分:1)
看here。 java.util.Collections
提供了静态方法copy
,用于将内容从一个列表复制到另一个列表。
答案 1 :(得分:1)
所有表现良好的集合都有复制构造函数。因此,根据您的需要(例如快速索引或有效删除某些元素)创建所需类型的列表实例。
在这种情况下,您需要做更多的工作来处理可能的null的不便。所以像这样:
/**
* @return a copy of the original; an empty list if original is null.
*/
public static <T> List<T> randomAccessibleCopy(List<T> original) {
return (null == original)
? Collections.<T>emptyList()
: new ArrayList<T>(original);
}
现在,您可以使用返回列表的基础API的结果调用此方法。
答案 2 :(得分:0)
if(getScanResults() != null)
anExistingList.add(getScanResults());
应该是
List x = getScanResults();
if(x != null)
anExistingList.add(x);
由于此方法现在仅被调用一次,因此在此期间无法更改。