【问题标题】:Deep copy when Using ArrayList in java在 java 中使用 ArrayList 时的深拷贝
【发布时间】:2015-04-23 03:20:22
【问题描述】:

我知道这是一件小事,但我想问这个问题。假设我有一个返回对象 ArrayList 的 get 方法。首先我们必须返回它的副本吗?如果是这样,它是否必须是 ArrayList 的深层副本?当里面的对象是不可变的时,我们还需要做一个深拷贝吗? 如果我们使用这种类型的构造函数

ArrayList<T> arr = new ArrayList<>(collection);

那么数组的元素是被复制了还是仍然指向旧值? 谢谢

【问题讨论】:

    标签: java arraylist collections copy deep-copy


    【解决方案1】:

    这取决于您的用例。有时需要公开底层集合,有时则不需要。

    例如,如果您想利用类的集合方法,您可以返回基础集合(或基础集合的可修改视图)。例如,这使您班级的客户能够这样做

    phoneBook.getPeople().removeIf(Person::isAddressInvalid);
    

    如果您不想想要公开我会使用的底层集合

    return new ArrayList<>(yourCollection);
    

    我认为在 get 方法中返回深层副本非常很少见。

    【讨论】:

    • 好的,如果类型是字符串,那么我可以这样返回它:return new ArrayList(yourCollection);
    • 当然。字符串是不可变的,因此返回字符串的深层副本尤其没有意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    相关资源
    最近更新 更多