模拟集合元素的扩容过程:
package arrayList; /** * 模拟ArrayList容器进行JDK扩容 * @author Drew * */ public class MyArrayList { Object [] value; int size; public MyArrayList() { // value = new Object[16]; this(16);//调用本地构造方法 } public MyArrayList(int size) { value = new Object[size]; } /** * 添加数组元素 * @param obj 任何java的数据类型 */ public void add(Object obj) { value[size] = obj; size ++; if(size >= value.length) { //dilation int newCapacity = value.length * 2; /*关键的一步*/ Object[] newList = new Object[newCapacity]; for(int i = 0; i < value.length; i++) { newList[i] = value[i]; } value = newList; } } public Object get(int index) {//数组的大小. /*if(index < 0 || index > size - 1) { try { throw new Exception(); }catch (Exception e) {//异常一抛出,程序就停止了。 e.printStackTrace(); } }*/ rangeCheck(index); return value[index]; } /** * 返回元素的索引 * @param obj 元素 * @return 返回一个int类型的索引 */ public int indexOf(Object obj) { if(obj == null) { return -1; }else { for(int i = 0; i < value.length; i++){ if(obj == value[i]) { return i; } } return -1; } } public int LastindexOf(Object obj) { if(obj == null) { return -1; }else { for(int i = value.length; i >= 0 ; i--){ if(obj == value[i]) { return i; } } return -1; } } /** * 在指定位置上插入元素 * @param index 需要插入元素的索引 * @param obj 插入的元素类型·任意 * @return 返回一个Object类型 */ public Object set(int index, Object obj) { /*if(index < 0||index >size - 1) { try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } }*/ rangeCheck(index); Object old = value[index]; value[index] = obj; return old; } /** * 检查数组的最大的长度,是否需要扩充。 * @param index */ public void rangeCheck(int index) { if(index < 0||index >size - 1) { try { throw new Exception(); } catch (Exception e) { e.printStackTrace(); } } } /** * main方法,用于测试。 * @param args */ public static void main(String[] args) { MyArrayList list = new MyArrayList(2); list.add("size"); list.add("length"); list.add("sizeandlength"); list.add("sizeorlength"); System.out.println(list.get(1)); System.out.println(list.get(2)); // System.out.println(list.get(-1));//抛出异常,超出范围。 // int string = list.LastindexOf(0); // System.out.println(string); } }
结果展示:
这是自己学着玩的,有兴趣也可以尝试其他的java底层源码做做玩玩。