JDK API阅读体会 1-为什么大家都不推荐删除List中值


昨天,想起之前看过的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数据,虽然感觉很棒,但是为开销考虑,还是不要轻易删除,会影响性能的哦.亲.

你可能感兴趣的:(java,jdk,list,api,ArrayList)