For Interview

前言 仅供本人面试前准备,其他人还是别看了,没意义。有很多我缩写,省去了很多易理解的部分。 我尽量找别人已经总结过的东西,而不是自己写,无意义,面试的八股文罢了。都是靠努力就能实现的东西。 常见容器 ArrayList 详解 https://note.youdao.com/ynoteshare1/index.html?id=efd2a3a29d2626acea2b053e56bae5cc&type=notebook#/04F1A0EFF8F241C2A89E2234AAF0A36A 底层基于数组实现 创建 ArrayList 如果不指定大小,会先创建一个大小为 0 的 Object[ ] 数组 , 第一次添加数据时,会扩容成 ArrayList 的 默认大小 default_capacity:10**;** 创建时如果指定大小,直接创建指定大小的Object[ ]数组 add() 对 size+1,去判断数组是否满了,如果满了就调用 grow()方法扩容,扩容大小为,原数组大小 + 原数组大小右移一位。也就是扩容到原来的1.5倍。JDK 1.6 是 1.5 倍 +1 ,JDK 1.7,1.8 是 1.5 倍。 然后把老数组拷贝到新数组里 elementData = Arrays.copyOf(elementData, newCapacity); 最后 elementData[ size++ ] = e,对数组赋值,(并且size+1) add(index,e) 首先对index做数组越界检查rangeCheck(index); 如果越界了,抛数组越界异常 如果没越界,还是对 size + 1,判断是否需要扩容,如果需要扩容,调用grow方法 如果需要扩容,调用System.arraycopy(1,2,3,4,5)方法。参数解释1:原来的数组,2:从哪里开始复制。3:复制的目标数组。4:目标数组的第几位开始复制。5:一共复制几个数。 System.arraycopy(elementData, index, elementData, index + 1, size - index); 假设把数字6插入到第3位,复制过后的数组是,1 2 3 4 5 -> 1 2 3 3 4 5 然后再把目标的位置的值修改,变为 1 2 6 3 4 5 最后size++; set(index,e) 首先解释,set这个方法是替换该位置原来的元素,所以不会使数组变大,不会做扩容判断 然后对index做数组越界检查,如果越界了,抛数组越界异常 把e替换到数组的index位置 返回数组index位置的原始值 remove(index) 首先对index做数组越界检查rangeCheck(index);,如果越界了,抛数组越界异常 然后进行数组拷贝 System.arraycopy(elementData, index+1, elementData, index,size - index - 1); 假设把第三位数字删除,1 2 3 4 5 6 - > 1 2 4 5 6 6 然后 element[size–] = null; 最后返回被删除的值 get(index) 首先对index做数组越界检查rangeCheck(index);,如果越界了,抛数组越界异常 return elementData(index); 总结来说,AraayList的get方法效率非常高,直接返回对应下标值,add方法和remove方法,效率就有点低了,需要考虑数组扩容和数组拷贝的问题**。** ...

July 29, 2020