写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.ArrayList<E>的4个批量操作进行介绍,主要内容包括:

1、ArrayList的批量操作

参考内容:

1、JDK源码(1.7)

-------------------------------------------------------------------- 

1. ArrayList常用的4个批量操作

批量操作:

(1) boolean addAll(Collection<? extends E> c)

功能: 将子列表c中的元素全部添加到列表中去

示例代码:

 public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0,44);
list.add(1,33);
list.add(2,22);
list.add(1,66);
list.add(4,99);
list.add(2,66);
list.add(1,44);
System.out.println("list :" + list);
//测试ArrayList的'boolean addAll(Collection<? extends E> c)'方法的使用
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(51);
list2.add(52);
list2.add(53);
list2.add(54);
list.addAll(list2);
System.out.println("list2 : " + list2);
System.out.println("list :" + list);
}
} 运行结果:
list :[44, 44, 66, 66, 33, 22, 99]
list2 : [51, 52, 53, 54]
list :[44, 44, 66, 66, 33, 22, 99, 51, 52, 53, 54]

源代码如下:

 public boolean addAll(Collection<? extends E> c) {
//将子列表c转换为数组
Object[] a = c.toArray();
//子列表中元素的个数
int numNew = a.length;
//进行容量检查,如果需要扩容则进行扩容处理
ensureCapacityInternal(size + numNew); // Increments modCount
//将子列表c添加到列表的size开始的位置处
System.arraycopy(a, 0, elementData, size, numNew);
size += numNew;
return numNew != 0;
}

(2) boolean addAll(int index,Collection<? extends E> c)

功能: 将子列表c添加到列表的index索引位置

示例代码:

 public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0,44);
list.add(1,33);
list.add(2,22);
list.add(1,66);
list.add(4,99);
list.add(2,66);
list.add(1,44);
System.out.println("list :" + list);
//测试ArrayList的'boolean addAll(int index,Collection<? extends E> c)'方法的使用
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(51);
list2.add(52);
list2.add(53);
list2.add(54);
System.out.println("list2 : " + list2);
list.addAll(3,list2);
System.out.println("list :" + list);
list.addAll(30,list2);//将会抛出IndexOutOfBoundsException异常
System.out.println("list :" + list);
}
} 运行结果:
list :[44, 44, 66, 66, 33, 22, 99]
list2 : [51, 52, 53, 54]
list :[44, 44, 66, 51, 52, 53, 54, 66, 33, 22, 99]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 30, Size: 11
at java.util.ArrayList.rangeCheckForAdd(Unknown Source)
at java.util.ArrayList.addAll(Unknown Source)
at ArrayListTest.main(ArrayListTest.java:24)

源代码如下:

     public boolean addAll(int index, Collection<? extends E> c) {
//检查index是否合法,如果不合法,则抛出异常
rangeCheckForAdd(index);
//将子列表转换为数组
Object[] a = c.toArray();
//记录子列表中元素的个数
int numNew = a.length;
//进行扩容检查,如果需要扩容则进行扩容处理
ensureCapacityInternal(size + numNew); // Increments modCount
//计算出列表中元素需要移位的个数
int numMoved = size - index;
//进移位操作
if (numMoved > 0)
System.arraycopy(elementData, index, elementData, index + numNew,numMoved);
//将子列表c放置到集合index位置开始处
System.arraycopy(a, 0, elementData, index, numNew);
//列表中元素个数加numNew
size += numNew;
return numNew != 0;
}

(3) void clear()

功能: 将列表中的元素清空

示例代码:

 public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(0,44);
list.add(1,33);
list.add(2,22);
list.add(1,66);
list.add(4,99);
list.add(2,66);
list.add(1,44);
System.out.println("list :" + list);
//测试ArrayList的'void clear()'方法的使用
list.clear();
System.out.println("list :" + list);
}
} 运行结果:
list :[44, 44, 66, 66, 33, 22, 99]
list :[]

源代码如下:

     public void clear() {
//fast-fail机制标识
modCount++;
//利用循环将列表中全部元素置为null
// Let gc do its work
for (int i = 0; i < size; i++)
elementData[i] = null;
//将属性size设置为0
size = 0;
}

(4) public boolean removeAll(Collection<?> c)、public boolean retainAll(Collection<?> c)

功能:

  removeAll(Collection<?> c)移除列表中那些也包含在指定子列表c中的所有元素

  retainAll(Collection<?> c)移除列表中那些不包含在指定子列表c中的所有元素

示例代码: removeAll(Collection<?> c)

 public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(22);
list.add(33);
list.add(44);
list.add(11);
list.add(15);
list.add(12);
list.add(7);
list.add(3);
System.out.println("list :" + list);
//测试ArrayList的'public boolean removeAll(Collection<?> c)'方法的使用
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(44);
list2.add(15);
list2.add(13);
System.out.println("list2 :" + list2);
list.removeAll(list2);
System.out.println("list.removeAll(list2) :" + list);
}
} 运行结果:
list :[22, 33, 44, 11, 15, 12, 7, 3]
list2 :[44, 15, 13]
list.removeAll(list2) :[22, 33, 11, 12, 7, 3]

示例代码: retainAll(Collection<?> c) ,从运行结果可以看出运行这个方法的结果是:原列表和子列表c取交集后的结果

 public class ArrayListTest {
public static void main(String[] args) {
ArrayList<Integer> list = new ArrayList<Integer>();
list.add(22);
list.add(33);
list.add(44);
list.add(11);
list.add(15);
list.add(12);
list.add(7);
list.add(3);
System.out.println("list :" + list);
//测试ArrayList的'public boolean removeAll(Collection<?> c)'方法的使用
ArrayList<Integer> list2 = new ArrayList<Integer>();
list2.add(44);
list2.add(15);
list2.add(13);
System.out.println("list2 :" + list2);
list.retainAll(list2);
System.out.println("list.retainAll(list2) :" + list);
}
} 运行结果:
list :[22, 33, 44, 11, 15, 12, 7, 3]
list2 :[44, 15, 13]
list.retainAll(list2) :[44, 15]

源代码如下:(感觉JDK的源代码就是写的好呀,batchRemove()方法写的很棒)

 public boolean removeAll(Collection<?> c) {
return batchRemove(c, false);
} public boolean retainAll(Collection<?> c) {
return batchRemove(c, true);
} private boolean batchRemove(Collection<?> c, boolean complement) {
final Object[] elementData = this.elementData;
int r = 0, w = 0;
boolean modified = false;
try {
//利用循环查询列表元素是否在子列表c
for (; r < size; r++)
if (c.contains(elementData[r]) == complement)
elementData[w++] = elementData[r];
} finally {
// Preserve behavioral compatibility with AbstractCollection,
// even if c.contains() throws.
if (r != size) {
System.arraycopy(elementData, r,
elementData, w,
size - r);
w += size - r;
}
if (w != size) {
for (int i = w; i < size; i++)
elementData[i] = null;
modCount += size - w;
size = w;
modified = true;
}
}
return modified;
}

---------------------------------------------------------------------------------------

java.util.ArrayList系列文章

java.util.ArrayList<E>(1)  java.util.ArrayList<E>(2)  java.util.ArrayList<E>(3)

java.util.ArrayList<E>(4)  java.util.ArrayList<E>(5)  java.util.ArrayList<E>(6)

相关知识                                                                                              

java.util.Collection<E>   java.util.AbstractCollection<E>   java.util.List<E>

java.util.AbstractList<E>   java.util.Iterator<E>   java.util.ListIterator<E>

Java中的标记接口   迭代器模式   Java中的深拷贝和浅拷贝  java.util.Arrays

内功心法 -- java.util.ArrayList<E> (4)的更多相关文章

  1. 内功心法 -- java.util.ArrayList<E> (1)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  2. 内功心法 -- java.util.ArrayList<E> (2)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  3. 内功心法 -- java.util.ArrayList<E> (3)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  4. 内功心法 -- java.util.ArrayList<E> (5)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  5. 内功心法 -- java.util.ArrayList<E> (6)

    写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...

  6. 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题

    一.背景 最近闲来无事,想自己搭建一套Spring+SpringMVC+Mybatis+Mysql的环境(搭建步骤会在以后博客中给出),结果运行程序时,适用@ResponseBody注解进行返回Lis ...

  7. Java.util.ArrayList详解

    java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...

  8. java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)

    package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...

  9. java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)

    一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...

随机推荐

  1. H5手机开发锁定表头和首列(惯性滚动)解决方案

    前端时间移动端在做表格的时候需要这个功能,由于还有实现类似原生的惯性滚动功能,于是使用了iscroll插件. iscroll插件下载地址:iscroll5 该功能demo github地址: http ...

  2. 加载window事件

    $(document).ready()和window.onload的区别 发表于 2012-08-29 由 admin 以浏览器装载文档为例,在页面加载完毕后,浏览器会通过JavaScript为DOM ...

  3. sql数据库中查询第几条到第几条的数据

    通用方法: select top 500 * from (select top 1000 * from UserSearchDatas order by ID) a order by ID desc ...

  4. LPC2478时钟模块详解

    时钟框图如上图,系统时钟来源分别是内部4M的RC振荡器和外置晶振,RTC模块在某些情况下也可以作为主时钟,经过系统时钟选择s\de时钟需要经过PLL倍频(或者不倍频),处理过的PLL输出USB时钟分频 ...

  5. leetcode--011 copy list with random pointer

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAA3UAAABjCAIAAACzC75sAAAMTElEQVR4nO3cyYHivBYG0D8n0nIojo ...

  6. java 获取指定日期

    //可以设置指定那一天:例如,最近一周,参数传入-7,最近一月,参数传入-30...private String getBeginDate(int date) throws ParseExceptio ...

  7. 关于学习方法的借鉴和有关C语言学习的调查

    专长的高超技能获取的成功经验 在游戏方面,我相对于大多数人来说可能更为出色.首先是我投入了大量的时间进行游戏:其次,我几乎每天都会看一会教学视频来模仿:最后应该还是跟个人的天赋有点关系. 如果把这个类 ...

  8. gridview里item是textView、Button单击事件相应,以及按下效果的取去除

    1.响应事件的区别: gridview的item是textView的时候,gridview的itemonclick事件可以正常相应,但是换了Button后不能,原因如下: public class B ...

  9. OpenCV点滴2

    明天回家了-- 昨天去见了老师,去之前告诉自己不要紧张,去了后还是紧张了,语无伦次,很没礼貌--(不敢看老师的眼睛) 刚才妈打电话说让我早点回去,不知道为什么,在空荡荡的宿舍里听到妈的声音,眼泪会夺眶 ...

  10. 请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库

    转载请使用支持 JDBC 4.0 的 sqljdbc4.jar 类库 1.下载最新的JDBC(2012/3/6) http://www.microsoft.com/downloads/zh-cn/de ...