-1

在 的情况下CopyOnWriteArrayList,只要将元素添加到集合中,就会创建一个新对象。

考虑下面的例子:

   private static void copyOnWriteArrayList() {
    List<String> playersUsing2 = new CopyOnWriteArrayList<String>();
    System.out.println("Original hashCode = " + playersUsing2.hashCode());
    playersUsing2.add("a1");
    System.out.println("After a1 hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
    addElement(playersUsing2, "a2");
    System.out.println("After b1 from copyOnWriteArrayList hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
    playersUsing2.add("b1");
    System.out.println("After b1 hashCode = " + playersUsing2.hashCode() + " size = " + playersUsing2.size());
}

private static void addElement(List<String> playersUsingNew, String value) {
    playersUsingNew.add(value);
    System.out.println("After a2 hashCode = " + playersUsingNew.hashCode() + " size = " + playersUsingNew.size());
}

每次添加元素时,都会创建一个新对象,并且playersUsing2堆栈上的引用将更新为指向该内存位置。可以理解。

现在,我传递playersUsing2给另一个方法,因此将创建一个新的堆栈帧,并且playersUsingNew还将指向相同的内存位置。并且当添加新元素时,将创建一个新对象并将playersUsingNew指向新的内存位置。

但是如何playersUsing2更新第一个堆栈帧以指向最新的内存位置?

我看到了java.util.concurrent.CopyOnWriteArrayList.add(E)实现,但无法理解。是不是通过一些本机代码和JVM来处理,它是怎么发生的?

输出:

Original hashCode = 1
After a1 hashCode = 3087 size = 1
After a2 hashCode = 98754 size = 2
After b1 from copyOnWriteArrayList hashCode = 98754 size = 2
After b1 hashCode = 3064461 size = 3
4

1 回答 1

0

好吧,认为哈希码更改代表新对象的创建是一种误解。 hashCode() 返回的值绝不保证是对象的内存地址。

于 2015-07-20T11:09:31.810 回答