2015-07-12 44 views
-1

CopyOnWriteArrayList的情况下,只要将元素添加到集合中就会创建一个新对象。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 
+0

你是什么意思_a将创建一个新的对象,并且'playersUsing2'参考stack_? –

+2

我认为你误解了语句_ java.util.ArrayList'的线程安全变体,其中所有可变操作(add,set等)都是通过创建**底层数组的新副本来实现的* * ._ –

+0

@SotiriosDelimanolis但是为什么每次变更操作之后我都会看到一个新的hashcode值。我添加了run的o/p。 – hagrawal

回答

0

那么它是一种误解断定散列代码变更表示创建的由hashCode()方法返回的新object.The值是没有保证是的存储器地址的装置目的。

+0

“* hashCode()返回的值决不能保证是对象的内存地址。*”如果不覆盖hashCode()',那么通常情况下它是true。我已经想出了在'CopyOnWriteArrayList'和'ArrayList'的情况下,它被覆盖。尽管感谢您的提示。 – hagrawal