小林求职记(二):说好的问基础,为啥我感觉一点也不基础呢?
在上一轮的面试中,小林在mysql方面因为作答不够完善,被面试官吊打了一番。经过两天的自我复习之后,新的一轮面试又开始了。
面试官:你好,请简单介绍下自己吧。
小林:你好,我是xxxxxx,之前在深圳的xxx公司负责了xxx系统的研发设计。
面试官:嗯嗯,那我先来问你一些基础问题吧。
小林:嗯嗯,好的。
面试官:你了解arraylist吧,请说下内部的一些特性。
小林此时心里一下子乐开了花,这个简单啊。
小林:arraylist的底层主要是由数组组成,它和普通数组不太一样,arraylist具有自动扩容的功能。每次当我们add一个元素到队列里面的时候,都会有一步确认容量的机制判断(对应源码里面的ensureCapacityInternal函数)如果当数组内部的元素达到了数组阈值的时候,就会以1.5倍的体积去做扩容,底层是调用了才做系统内部的一个System.arraycopy方法。
又由于arraylist是采用数组存储的,在读取数据的时候可以借助数组位的下标去快速定位,写数据的时候需要涉及到挪动数组,所以读的性能平均要比写的性能更高一些。
面试官:嗯嗯,回答地挺全面的。那你觉得在使用arraylist的时候一般会注意些什么吗?
小林:嗯嗯,有的。一般我会根据代码的上下文给arraylist附一个初始值来定位这个数组的大小,防止其做过多不必要的扩容操作。另外在循环中进行删除操作的时候需要注意会有坑,一般建议采用迭代器的模式来处理。
ps:
如果使用以下这种方式进行元素的移除可能会导致出现删除元素不完整的情况:
public static void main(String[] args) { ArrayListApplication arrayListApplication = new ArrayListApplication(); List<String> list = new ArrayList(3); list.add("a"); list.add("c"); list.add("c"); list.add("d"); list.add("e"); System.out.println(list); System.out.println("=========="); removeV1(list, "c"); System.out.println(list); } public static void removeV1(List<String> list, String deleteItem) { for (int i = 0; i < list.size(); i++) { String item = list.get(i); if (item.equals(deleteItem)) { list.remove(item); } } }