克隆列表 - 它是如何完成的?

时间:2011-05-11 16:00:12

标签: java android list clone shallow-copy

我想制作一个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()获取一个值并确保它在我使用它时不会改变?

感谢任何提示:-) (我想我只是在理解错误)

3 个答案:

答案 0 :(得分:1)

herejava.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);

由于此方法现在仅被调用一次,因此在此期间无法更改。