昨天,想起之前看过的JDK API,发觉又生疏了不少.又开始看,就当是回顾一下,之前也是囫囵吞枣看过一遍主要的类.
有人肯定会想,JDK API,那不是神一般的存在,该顶礼膜拜.我觉得到也不必如此.写这些的也是人,他也会犯人的错误,不用把他们当神一样崇拜.
昨天第一站,我看的当然是容器类鼎鼎有名的ArrayList.
1,在这里,我发觉我们之前都忽略了一个方法 add(int index, E element).当然其中和他类似的方法还有两个,干脆我一起说说吧.
public E set(int index, E element)
public boolean add(E e)
public void add(int index, E element)
第一个意思是用当前替代现在Index位置的内容,还有就是在List尾部添加当前元素, 这两个方法我们平常用的真的不少,但是第三个,还真不太常见.它的意思是在指定Index为添加当前元素,当前Index - 1以后的元素都向后挪一个位置.从代码上看,也能看出为啥平常用的很少,因为第三个add存在一个底层的Copy动作,无形中加大开销,所以才会用的少吧.
从上面的返回值看,我也不明白返回值为什么啥类型都有,同样都是add动作,返回值还不同,也可以看出他们也不是神吧.(小小吐槽一下)
2,有增加,当然有删除了,接下来我们看看删除方法.
public E remove(int index)
public boolean remove(Object o)
这两个方法,平常都看见有人用.不过看完代码之后从开销上看的话,第二个方法有一个遍历的过程,再进行底层Copy,比第一个方法多一个遍历过程,因此在能确定Index的情况,删除还是用第一种吧.
3,有单个增加,肯定有懒人说,我不要一个个增加,我要一次性搞定,那就请看接下来的方法.
public boolean addAll(Collection<? extends E> c)
public boolean addAll(int index, Collection<? extends E> c)
第一个方法呢,应该是单个add的翻版吧,就是在List尾部把传入的集合给添加进去,没有啥好说,这个里面也用到底层Copy.第二个方法呢,就是按坐标添加翻版,就是将当前Index - 1往后面移动c.length位置,通过底层Copy将c的数据Copy到当前Index -> Index + c.length - 1位置.当然极端情况就是Index就是最后的位置,这样就变成第一种情况了.
4,有批量增加,就要批量删除,人的惰性,没有法子呀.
protected void removeRange(int fromIndex, int toIndex)
这个方法的意思,是将toIndex以后的元素利用底层Copy到fromIndex后面,并利用遍历将size -> size - (toIndex - fromIndex)置空.
由于删除这个动作发生的时候,每次都是需要底层Copy数据,虽然感觉很棒,但是为开销考虑,还是不要轻易删除,会影响性能的哦.亲.