List和ArrayList的区别

装箱:在值类型向引用类型转换时发生;

拆箱:在引用类型向值类型转换时发生;

值类型:直接将内存存储在栈内,由系统自动释放资源的数据类型;

引用类型:由类型的实际值引用(类似于指针)表示的数据类型,通俗点说就是在编程时需要new出来的变量类型都是引用型,引用类型是存放在内存的堆中;

内存堆跟栈的定义跟数据结构的堆栈是不同的

栈:由大至小的分配,先进后出,直接存放值类型的地方;我们一般出现的内存溢出就是由于栈位都分配完了;

堆:由小至大的分配,随意存储,存放引用类型的地方;

List接口是一个有序集合,其元素以线性方法存储,集合中允许存放重复的元素。

Array类实现List接口,可以直接通过ArrayList为List接口实例化。ArrayListl类是数组列表类,实现了可变长度的数组。 List是一个接口,而ArrayList是List接口的一个实现类。 

ArrayList类继承并实现了List接口。 

因此,List接口不能被构造,也就是我们说的不能创建实例对象,但是我们可以像下面那样为List接口创建一个指

向自己的对象引用,而ArrayList实现类的实例对象就在这充当了这个指向List接口的对象引用。

由于ArrayList的每个item默认是Object的类型,所以当我们执行语句list.add(1);的时候,就是做了一次装箱的操作。同理,在for循环里list的每一项都要做一个拆箱的操作才能得到变量i,最后到打印变量i时,由于字符串也是引用类型,所以也要做一次的装箱的操作。这里前后一共做了6次的装箱拆箱(4次装箱,2次拆箱),每一次的装箱拆箱都涉及CPU以及内存的分配,都是性能的损耗。

由于List使用了泛型,我们指定了item必需是int类型,所以在add item的时候,不需要再进行装箱拆箱的操作,一直到打印i的时候,才需要做装箱的操作,整段代码执行完以后,一共才进行2次的装箱拆箱(2次装箱,0次拆箱)。

如果List的item多,程序运行时,相对于ArrayList来说就会节省很多的系统资源。所以List与ArrayList的使用区别,到最后就是性能的表现问题。

原文地址:https://www.cnblogs.com/TangGe520/p/8901425.html