
java list能赋空值。
分配内存,初始化实例变量的值,还有就是依次创建当前类所在继承链上的所有类的对象。如果有初始化块,会自动运行。 java中基本类型采用C与C++中相同的方法,不采用句柄的方式,基本类型的变量容纳了具体的值(固定长度),存在于堆栈中。
java中除了八大基本类型一切都是对象,在声明变量时String s;只是获得了一个句柄,其并不指向一个对象,在使用时必然会出现运行期错误。应该初始化String s = “abcd”; 这是字符串这种特殊类型的初始化方式,更通用的是用new关键字进行句柄与新对象的链接。
Java中,变量的使用都遵循一个原则,先定义,并且初始化后,才可以使用。我们不能int a后,不给a指定值,就去打印a的值。这条对对于引用类型变量也是适用的。而“null”指的是不确定的对象;“ null”用来判断引用类型是否分配了存储空间。 String s = null;已经分配了存储空间,只是不确定是什么类型,称为空对象。(其实就是不确定对象时初始化分配内存的一种状态,等待被真的指向一个某对象)。
这个java中的通配符“上界”“下界”有关。上界<? extends Number>规定:只能取(get),不能添加(add)。
下界<? super Number>规定:不能取(get),只能添加(add)。
现在试想一下你的例子,List<? extends Number>list = new ArrayList<>()
Java中是强类型的,就是说任何变量在具体使用时,必须明确类型。上述list在定义时,表述其中的每一项值都是Number本身或者是其子类,但是在add时(list.add( new Long(1) ) 看似没错),但编译器它却不知道这个list到底放的是啥类型,有可能是ArrayList<Short>,ArrayList<Test>等,因为不确定所以就不允许你add一个long或者short。
从这个list定义中,在获取值时,编译器知道的是里面放的是Number类型或者是其子类型值,因此Number n = (Number)list.get(0), Long l = (Long)list.get(0)可以编译通过。
一般看法:list=null能更快的释放内存,list.Clear()只是清空了内容 在内存上它还是占有空间,而=null 就是不占用内存空间
大佬看法:=null还没有立刻把内存清掉,要调用GC.Collect()才会清掉内存,
Clear方法和=null差不多,也不会马上把内存清掉,直到GC.Collect()调用为止(如果你不调用的话系统会在适当的时机调用)。不过调用list.Clear()会减轻GC.Collect方法的负担,使其能更快完成清除内存的工作
不用了,就设置为null,如果还要new一个使用,那不如Clear了继续用得好。因此单独比较内存释放是没有意义的,要看具体场合用具体的功能。
另外在局部变量时,离开作用域自动释放,相当于赋值null,因此一般很少有人会特意使用这个null的。
所以如果元素很多,做法通常是这样的:
list.Clear()
list=null
GC.Collect()
但GC.Collect()通常会消耗很多时间,所以如果数组元素不多的情况没必要直接调用GC.Collect,让系统在它感到不适的时候自动调用GC.Collect为好。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)