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



为什么有时我们不必创建一个对象而只能将其分配给方法等?以关注为例。

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

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

list2被分配了列表的某些实现。在确切情况下,它是SynchronizedRandomAccessList对象或SynchronizedList对象,而不是ArrayList

这是源代码:

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对象的内存位置。

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

  • primitives (即不是对象的变量),例如布尔,字节,短,char,int,int,long,flow,float,double,存储在线程堆栈中
  • 对象new关键字创建的对象
  • 分配

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

最新更新