我以面试官的身份参加过不少Java的面试,如下是五个比较有技巧的问题,我发现有些初级到中级的Java研发人员在这些问题上没有彻底弄明白,似懂非懂。因此我写了一篇相关的文章,帮助初级Java研发人员弄清楚这些问题。文章列举了和Java ArrayList相关的5个比较具备迷惑性的问题,我相信若是面试者可以很好的回答出这些问题,那么在面试的时候你必定可以获得不错的分数。若是你赞成个人见解,或者除了下面的问题,你还有其余比较好的问题,那么就请联系我吧。 html
这是最有技巧性的的一个问题,大多数人都没法回答。事实上,当有人试图在arraylist中增长一个对象的时候,Java会去检查arraylist,以确保已存在的数组中有足够的容量来存储这个新的对象。若是没有足够容量的话,那么就会新建一个长度更长的数组,旧的数组就会使用Arrays.copyOf方法被复制到新的数组中去,现有的数组引用指向了新的数组。看以下的代码段(摘自GrepCode.com中的Java ArrayList Code): java
public boolean add(E e) { ensureCapacity(size + 1); // Increments modCount!! elementData[size++] = e; return true; } public void ensureCapacity(int minCapacity) { modCount++; int oldCapacity = elementData.length; if (minCapacity > oldCapacity) { Object oldData[] = elementData; int newCapacity = (oldCapacity * 3)/2 + 1; if (newCapacity < minCapacity) newCapacity = minCapacity; // minCapacity is usually close to size, so this is a win: elementData = Arrays.copyOf(elementData, newCapacity); } }
请注意这样一个状况:新建了一个数组;旧数组的对象被复制到了新的数组中,而且现有的数组指向新的数组。 面试
这又是一个大多数面试者都会困惑的问题。多数状况下,当你遇到访问元素比插入或者是删除元素更加频繁的时候,你应该使用ArrayList。另一方面,当你在某个特别的索引中,插入或者是删除元素更加频繁,或者你压根就不须要访问元素的时候,你会选择LinkedList。这里的主要缘由是,在ArrayList中访问元素的最糟糕的时间复杂度是”1″,而在LinkedList中可能就是”n”了。在ArrayList中增长或者删除某个元素,一般会调用System.arraycopy方法,这是一种极为消耗资源的操做,所以,在频繁的插入或者是删除元素的状况下,LinkedList的性能会更加好一点。 数组
当array被当作参数传递到某个方法中,若是array在没有被复制的状况下直接被分配给了成员变量,那么就可能发生这种状况,即当原始的数组被调用的方法改变的时候,传递到这个方法中的数组也会改变。下面的这段代码展现的就是安全违规以及如何修复这个问题。 安全
ArrayList被直接赋给成员变量——安全隐患: ide
修复这个安全隐患: 性能
下面就是把某个ArrayList复制到另外一个ArrayList中去的几种技术: this
注意1和2,3是浅拷贝(shallow copy)。 spa
在ArrayList中增长或者是删除元素,要调用System.arraycopy这种效率很低的操做,若是遇到了须要频繁插入或者是删除的时候,你能够选择其余的Java集合,好比LinkedList。看一下下面的代码: code
在ArrayList的某个索引i处添加元素:
删除ArrayList的某个索引i处的元素: