sách gpt4 ai đã đi

ArrayList(Bộ sưu tập c) VS HashSet(Bộ sưu tập c)

In lại 作者:行者123 更新时间:2023-12-01 13:19:16 30 4
mua khóa gpt4 Nike

在检查 ArrayList API 时,我注意到一些看起来很奇怪的东西。

确实,这里是 ArrayList 构造函数实现,其中 Collection 作为参数传递:

public ArrayList(Collection c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}

这里相当于 HashSet 类:

public HashSet(Collection c) {
map = new HashMap<>(Math.max((int) (c.size()/.75f) + 1, 16));
addAll(c);
}

因此,我们可以注意到 ArrayList 使用了参数中集合提供的元素的 COPY (Arrays.copyOf),而 HashSet 使用了 addAll() 方法。

当然,addAll() 方法不会复制元素,只会添加对 HashSet 集合的引用。

我发现这种微妙的差异对于忽略它的调用者来说是“危险的”。

一个人可能期望一个集合具有 SAME 引用,另一个熟悉 ArrayList API 的人可能期望一个来自原始集合的元素的 COPY。

为什么 Sun 没有为这些 Collections 子类提供相同的概念?

1 Câu trả lời

ArrayList one used a COPY (Arrays.copyOf) of elements provided by the collection in parameter whereas the HashSet one, use addAll() method.

KHÔNG,Arrays.copyOf 只复制数组,而不是这个数组指向的对象。对象未被克隆。也就是说,两个构造函数的行为相同 - 它们将包含对与原始集合相同的对象的Tài liệu tham khảo。修改一个集合中的对象会在另一个集合中修改它(因为它是同一个对象)。

另请注意,Arrays.copyOf() 仅在某些情况下使用。

关于collections - ArrayList(集合 c)VS HashSet(集合 c),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10157218/

30 4 0
行者123
Hồ sơ cá nhân

Tôi là một lập trình viên xuất sắc, rất giỏi!

Nhận phiếu giảm giá Didi Taxi miễn phí
Mã giảm giá Didi Taxi
Giấy chứng nhận ICP Bắc Kinh số 000000
Hợp tác quảng cáo: 1813099741@qq.com 6ren.com