package com.java;import java.util.Arrays;public class MyArrayList {private final static int DEFAULT_SIZE = 10;private Object[] arr;// 首先是构造方法// 查询api发现arraylist有三个构造方法// 第一个构造初始容量为10的空列表int size;public MyArrayList() {this(DEFAULT_SIZE);}// 第二个指定元素类型的 ,使用泛型的暂时不做了// 第三个构造具有指定容量的空列表public MyArrayList(int arrlenght) {if (arrlenght arr.length) {// 当size表示这次要添加的位置,判断size+1是不是大于数组的长度了 大于就要扩充数组expand(size);}}private static final int MAX_ARRAY_SIZE = Integer.MAX_VALUE - 8;public void expand(int size) {int oldsize = arr.length;int newsize = oldsize + (oldsize >> 1);// 位运算 向右移动一位,相当于原来的1/2// 将数组扩大到原来的1.5倍if (newsize MAX_ARRAY_SIZE)newsize = (size > MAX_ARRAY_SIZE) ? Integer.MAX_VALUE : MAX_ARRAY_SIZE;// 当list长到大于上面定义的最大的长度,就把长度扩展到int的最大值,否则使用上面定义的那个arr = Arrays.copyOf(arr, newsize);}// 第二个方法 在此列表中的指定位置插入指定元素public void add(int index, Object o) {// 首先判断要插入的位置在不在有效的范围judgeAddRange(index);// 然后判断需不需要扩容judgeRange(size + 1);// 将index及以后的元素向后移动一位System.arraycopy(arr, index, arr, index + 1, size - index);arr[index] = o; // index下标的内容改为osize++;}// 判断范围public void judgeAddRange(int index) {if (index size) {throw new IndexOutOfBoundsException("index越界");}}// 从列表中删除所有元素public void clear() {for (int i = 0; i -1;}// 返回此列表中指定元素的第一次出现的索引,如果此类表不包含元素,则返回-1public int indexOf(Object o) {if (o == null) {for (int i = 0; i 0) // 判断删除的是不是最后一个元素,覆盖System.arraycopy(arr, index + 1, arr, index, size - index - 1);arr[--size] = null; // 后面的赋值为nullreturn oldo;}// 从列表中删除指定元素的第一个出现(如果存在)public boolean remove(Object o) {// 首先看有没有这个元素if (contains(o)) {remove(indexOf(o));return true;}return false;}// 从这个列表中删除所有索引在intfromIndex(含)和toIndex之间的元素protected void removeRange(int intFromIndex, int toIndex) {System.arraycopy(arr, toIndex, arr, intFromIndex, size - toIndex);int newsize = size - toIndex + intFromIndex;for (int i = newsize; i = size || index
收获
arraylist默认的大小是10.
arraylist扩充容量会是原来的1.5倍,如果1.5被不够那么就扩招到需要的容量,当然最大的范围是Integer的最大值.但是为什么会默认保留8位呢,或许保存着一些东西,或许是为了跨平台???防止在有些机器上出问题,为什么要默认-8,又能个扩展到最大啊
判断元素的时候先判断是不是为null 也就是说这个集合支持存null的
底层是数组的话,是不是意味着他在增加和删除方面比较慢,在查询方面比较快.但是好像和其他的对象也有点关系.
用System.arraycopy来是实现元素的覆盖.增删.
用Arrays.copyOf来实现扩容.