装箱:由值类型向引用类型转换
拆箱:由引用类型向值类型转换
值类型:直接将值存储在栈内,由系统自动释放资源的数据类型
引用类型:引用类型存放在内存的堆之中;通俗讲,new出来的都是引用类型
栈:存放值类型的地方,由大到小分配,内存溢出就是栈分配完毕
堆:由小到大分配,随意储存,存放引用类型的地方
区别
首先,list是一个抽象类,list不能被实例化,就是不能new list;而ArrayList是这个接口的实现类,可以被new 出来比如 List<Object> objects =new ArrayList<>();
为什么要用 List list = new ArrayList() ,而不用 ArrayList alist = new ArrayList()呢?
问题就在于List接口有多个实现类,现在你用的是ArrayList,也许哪一天你需要换成其它的实现类,如
LinkedList或者Vector等等,这时你只要改变这一行就行了: List list = new LinkedList(); 其它使用了list地方的代码根本不需要改动。
其次性能问题,由于ArrayList的每个item默认是Object的类型,所以当我们执行语句list.add(1);的时候,就是做了一次装箱的操作。同理,在for循环里list的每一项都要做一个拆箱的操作才能得到变量i,最后到打印变量i时,由于字符串也是引用类型,所以也要做一次的装箱的操作。这里前后一共做了6次的装箱拆箱(4次装箱,2次拆箱),每一次的装箱拆箱都涉及CPU以及内存的分配,都是性能的损耗。
CSDN:原文链接:https://blog.csdn.net/qq_32868167/article/details/83211355