为什么在某些情况下不需要对象实例化?

时间:2017-02-14 11:31:40

标签: java object memory-management reference instantiation

为什么有时我们不必创建对象并且可以将其分配给方法等?举例来说。

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

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

2 个答案:

答案 0 :(得分: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 :(得分:1)

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

  • 基元(即不是对象的变量),如boolean,byte,short,char,int,long,float,double,存储在线程堆栈中
  • 使用new关键字创建的
  • 对象在堆中分配

在您的情况下,方法List中实例化的Collections.synchronizedList对象将在堆中分配,并且对此列表的引用将分配给局部变量list2