2017-02-14 207 views
0

为什么有时我们不需要创建一个对象,只需将它分配给方法等?以下面为例。为什么在这种情况下不需要实例化对象?

List<String> list1 = new ArrayList<>(); 
List<String> list2 = Collections.synchronizedList(list1); 

这是否意味着list2被分配了一个ArrayList对象?在这种情况下内存分配会发生什么?谢谢!

回答

1

List2被分配了一些列表的实现。在确切的情况下,它可能是SynchronizedRandomAccessList对象或SynchronizedList对象,但不是ArrayList

Here是源代码:

public static <T> List<T> synchronizedList(List<T> list) { 
     return (list instanceof RandomAccess ? 
       new SynchronizedRandomAccessList<>(list) : 
       new SynchronizedList<>(list)); 
} 

静态方法synchronizedList()只是在这种情况下一个帮手。 java中的对象(不是原始值)用于传递对内存位置的引用。因此synchronizedList()返回一个对new SynchronizedList()对象的内存引用,通过调用它可以将该内存位置分配给list2对象。

1

总是需要对象实例化。在Java中有两个内存区域:线程堆栈和堆。

  • 基元(即变量不是对象)等布尔值,字节,短,字符型,整型,长整型,浮点,双,被存储在线程堆栈
  • 对象了与创建在new关键字在堆

在你的情况下,在方法Collections.synchronizedList实例化的List对象将在Heap和参考这个名单被分配分配将被分配到局部变量list2

相关问题