①创建ArrayList()
默认通过调用其构造方法ArrayList(int i)来完成ArrayLIst的创建,如:
ArrayList list = new ArrayList(12);
这时候在其构造方法内部其实是创建了一个大小为12的Object的数组。
当没有传入数组容量值得时候 默认会创建一个为10的Object数组。因此ArrayList的实现是基于数组的方式来实现元素的存储。
②插入对象:add(E)
由于ArrayList是基于数组实现的,那么当调用add()方法的时候,其实质就是向数组内添加新的元素。接下来看看其怎么实现动态改变ArrayList大小的原理吧。
当调用ArrayList的add()方法的时候 ,首先会ArrayList中已有的元素的数量增加1,产生一个最小容量值 minCapacity的变量,然后会将此值与ArrayList内部数组
的大小进行比较,如果此值小于数组的大小 ,那么会将次对象直接插入到数组的末尾处(自己猜测),如果此minCapacity的值大于数组的值 ,那么说明该数组有可能已经不能
容纳更多的元素了,那么这时候ArrayList会怎么做呢?它会将原来的数组赋值给一个新的数组对象,但是这个新的数组数组对象的元素的个数的确定是怎么实现的
呢 ?计算方法为 :会将原来的数组的大小*1.5+1,如果此值仍然小于之前的minCapacity的值,那么就会以minCapacity的值作为新的数组对象的大小,最后通过
调用Arrays.copyOf()来生成新的数组对象。
ArrayList还提供add(int,E)方法 。允许你添加特定为的元素对象,但是前提这个位置是存在的,数组的容量是够用的,实现方式上,会将index和其之后的元素向后挪动以为,让出原来的index的位置 来插入新的元素,可见这种方式是多付出一次数组的复制的。
③删除对象 remove(E)
当执行此方法的时候,会检查要删除的对象是否为null,如果为null会遍历数组中已有的值,比较里面的值是否为null 如果为null会删除相应位置的对象,接着会将删除对象位置之后的对象向前复制以为,并将数组最后一个元素的值设置为null来释放对此对象的引用,如果里面的值不为null的话,会调用对象的equals方法比较对象是否相同 (也是要遍历整个数组的),如果相同会删除这个位置的对象,剩下的操作和为null的操作一样。
另外ArrayList还提供了romove(int index)方法来删除制定为的对象 ,首先会检查其是否会数组越界 ,但是不会遍历整个数组,因此性能会比较好。
④获取对象get(int index)
传入的值就是对象在数组中的位置 ,但是前提会检查数组是否越界 ,如果没有,那么就会返回数组中位于此位置的对象。
⑤ 遍历对象iterator()
iterator是有ArrayList的父类AbstractList实现,当每次调用iterator()方法时,都会创建一个新的Itr实例,当调用此实例的hasNext()时,会比较当前数组的位置和数组中已经元素 的个数是否相等,如果相等说明到达末尾 ,返回false ,否则返回true。
当调用next方法时候则会调用get(int) 来获得相应的对象。
⑥判断是否包含某个对象contains(E)
这个操作会遍历整个数组中已有的对象,如果E为null,则直接判断数组中是否有null 如果有就返回true,否则返回false。如果E不为null,会调用equals方法来比较是否相等, 相等返回true 否则返回false。
indexOf和lastIndexOf是获取对象所在的位置,其中前者是从前往后寻找,后者正好相反。
总结:
ArrayList是基于数组实现的,没有容量的限制。
再删除元素的时候,并不会减少数组的容量大小,可以调用ArrayList的trimeToSize()来缩小数组的容量。
ArrayList是非线程安全的。