关于对象的初始化,求答疑?


List<Long> insertLabelIds = null;
List<Long> insertLabelIds = new ArrayList();

以上代码, 都是为了初始化一个对象,之后赋值,都是可行的。
但是我感觉这个东西还是有区别的,希望同僚可以从JVM的角度、以及代码层面解答一下 这两种初始化的优劣。
哪种更好,或者每一个使用的场景。

个人的理解:
当给这个对象申明为null的时候,List insertLabelIds = null;
JVM会去寻找内存空间中的这个对象 并赋值为null,然后会有一个引用指向这个对象,但是如果没有内存空间中没有这个对象呢?
还有寻找这个对象的引用的这个过程 算是寻址吗?
List insertLabelIds = new ArrayList();
这一种 JVM是通过new关键字进行空间开辟的,所以这个初始化会有一定的性能问题,毕竟一旦开辟空间了 就会有寻址 开辟空间 过程长。
所以 我认为两者都有寻址的动作 只不过是这个对象创建的时机不同
一个是提前声明 赋值 另外一个申明 引用。

主要是赋值为null,此时不分配内存空间,只有new才分配内存空间。

前者声明了一个对象的引用以后,在jvm中将一块新开辟的没有任何有效值的空间赋给了它,后者只是声明了一个对象的引用,jvm并没有开辟空间。
在使用的时候,如果类创建以后需要自己读写对象,就必须初始化,如果声明的对象是从其他地方接收引用可以写为=null的形式
声明一个类(对象)需要用到类中的方法的时候,需要new。
例如UserInfo userInfo = null;和UserInfo userInfo;是等效的。

如果是之后赋值就用1
如果想直接使用变量就用2
显然1是null引用,啥也没有,你如果逻辑上只是之后赋值,这里定义变量不过是占位的,初始化为null就行
2是创建了一个ArrayList对象,是有开销的,如果你之后赋值为别的引用了,那你这个创建行为除了浪费资源就毫无意义

赋值为null只是创建一个空的引用,算不算list对象,并且会直接垃圾回收掉
而第二种,直接指定了对象类型就是arraylist 使用arraylist()方法时,会对内存大小进行控制,初始化时不传长度参数,默认初始化时最大长度为10,如果变量增加才会再次拓展大小。

img
第一种是否可以理解为这个对象的实例化,并且也进行了初始化,只不过是被赋值成了null
第二种是否可以理解为这个对象已经被JVM 进行了实例化、初始化,可以进行赋值操作