内功心法 -- java.util.ArrayList<E> (2)
写在前面的话:读书破万卷,编码如有神
--------------------------------------------------------------------
下文主要对java.util.ArrayList<E>的构造方法和5个修改操作进行介绍,主要内容包括:
1、ArrayList构造方法介绍
2、ArrayList常用5个修改操作介绍
参考内容:
1、JDK源码(1.7)
--------------------------------------------------------------------
1. ArrayList三个构造方法
1.1 ArrayList构造方法(提供了三种构造方法)
//第一种: 无参数构造方法
public ArrayList() {
//调用带初始化列表大小参数的构造方法
this(10);
} //第二种: 带初始化列表大小参数的构造方法
public ArrayList(int initialCapacity) {
super(); //如果初始化列表大小参数小于0,则抛出异常
if (initialCapacity < 0)
throw new IllegalArgumentException("Illegal Capacity: "+initialCapacity); //创建一个大小为initialCapacity参数的Object类型数组
this.elementData = new Object[initialCapacity];
} //第三种: 带子列表参数的构造方法
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
size = elementData.length;
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
}
下面通过默认的构造方法来创建一个java.util.ArrayList<E>的实例
ArrayList<Integer> list = new ArrayList<Integer>();
2. ArrayList中5个常用的修改操作
2.1 ArrayList常用方法
修改操作:
(1) public boolean add(E e)
功能: 向ArrayList列表中添加一个元素e
示例代码:
ArrayList<Integer> list = new ArrayList<Integer>();
//测试ArrayList的add(E e)方法的使用,向列表中添加5个元素
list.add(1);
list.add(11);
list.add(8);
list.add(99);
list.add(12);
//输出ArrayList列表中的元素
System.out.println("list :" + list); 输出结果为:
list :[1, 11, 8, 99, 12]
源代码如下:
public boolean add(E e) {
//列表容量检查,如果需要扩容,则进行扩容
ensureCapacityInternal(size + 1);
//将元素e放置在集合的size位置,size的值加1
elementData[size++] = e;
//此方法添加元素成功则返回true
return true;
}
(2) void add(int index,E element)
功能: 向ArrayList列表中的index位置添加一个元素element
示例代码:
ArrayList<Integer> list = new ArrayList<Integer>();
//测试ArrayList的add(int index,E element)方法的使用,向列表中添加5个元素
list.add(0,44);//将元素44添加到列表中的第0个位置
list.add(1,33);//将元素33添加到列表中的第1个位置
list.add(2,22);//将元素22添加到列表中的第2个位置
list.add(1,66);//将元素66添加到列表中的第1个位置
list.add(4,99);//将元素99添加到列表中的第4个位置
System.out.println("list :" + list);
list.add(9,88);//将元素88添加到列表中的第9个位置(此方法将会抛出抛出) 运行结果:
list :[44, 66, 33, 22, 99]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 9, Size: 5
at java.util.ArrayList.rangeCheckForAdd(Unknown Source)
at java.util.ArrayList.add(Unknown Source)
at ArrayListTest.main(ArrayListTest.java:14)
源代码如下:
public void add(int index, E element) {
//检查index参数是否合法
rangeCheckForAdd(index);
//检查是否需要扩容,如果有必要则进行扩容处理
ensureCapacityInternal(size + 1); // Increments modCount!!
//将列表中的元素从Index位置往后移动
System.arraycopy(elementData, index, elementData, index + 1,size - index);
//将元素element放置在列表的index位置上
elementData[index] = element;
//列表中元素个数加1
size++;
}
(3) E remove(int index)
功能: 删除列表中index位置的元素,并且返回被删除的元素
示例代码:
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);
System.out.println("list :" + list);
//测试ArrayList的remove(Object o)方法的使用
list.remove(2);//删除下标索引为2的元素
System.out.println("list :" + list);
list.remove(29);//删除下标索引为29的元素(此方法将会抛出异常) 运行结果:
list :[44, 66, 33, 22, 99]
list :[44, 66, 22, 99]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 29, Size: 4
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.remove(Unknown Source)
at ArrayListTest.main(ArrayListTest.java:16)
源代码如下:
public E remove(int index) {
//对参数index进行合法性检查,如果不合法则抛出异常
rangeCheck(index);
//fast-fail机制标识加1
modCount++;
//用临时变量来记录列表index位置的元素值
E oldValue = elementData(index);
//计算列表中元素需要移位的数量
int numMoved = size - index - 1;
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index, numMoved);
//将列表中size除的元素设置为null,便于GC回收
elementData[--size] = null; // Let gc do its work
//返回被删除的元素
return oldValue;
}
(4) boolean remove(Object o)
功能: 删除列表中的o元素
示例代码:
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);
System.out.println("list :" + list);
//测试ArrayList的remove(Object o)方法的使用
list.remove(new Integer(22));
System.out.println("list :" + list);
list.remove(new Integer(88));
System.out.println("list :" + list); 运行结果:
list :[44, 66, 33, 22, 99]
list :[44, 66, 33, 99]
list :[44, 66, 33, 99]
源代码如下:
public boolean remove(Object o) {
if (o == null) {
//如果元素o为null,则循环在列表中查询null
for (int index = 0; index < size; index++)
if (elementData[index] == null) {
//在列表中找到对象为null的index位置后,调用fastRemove()方法进行删除
fastRemove(index);
return true;
}
} else {
//如果元素o不为null,则循环在列表中查询元素o
for (int index = 0; index < size; index++)
if (o.equals(elementData[index])) {
//在列表中找到对象o的index位置后,调用fastRemove()方法进行删除
fastRemove(index);
return true;
}
}
return false;
}
//私有方法 : 快速删除列表index位置上的元素
private void fastRemove(int index) {
//fast-fail机制标识加1
modCount++;
//计算出列表需要移位的数量
int numMoved = size - index - 1;
//进行移位操作
if (numMoved > 0)
System.arraycopy(elementData, index+1, elementData, index,numMoved);
//将列表中size位置的元素置为null,方便GC回收
elementData[--size] = null; // Let gc do its work
}
(5)E set(int index,E element)
功能: 将列表中index位置的元素替换为element,并且返回老值
示例代码:
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);
System.out.println("list :" + list);
//测试ArrayList的set(int index,E element)方法的使用
list.set(3, 123);
System.out.println("list :" + list);
list.set(31, 333);//此方法将会抛出异常
System.out.println("list :" + list); 运行结果:
list :[44, 66, 33, 22, 99]
list :[44, 66, 33, 123, 99]
Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 31, Size: 5
at java.util.ArrayList.rangeCheck(Unknown Source)
at java.util.ArrayList.set(Unknown Source)
at ArrayListTest.main(ArrayListTest.java:16)
源代码如下:
public E set(int index, E element) {
//检查index参数是否合法
rangeCheck(index);
//用临时变量记录列表中原index位置的值
E oldValue = elementData(index);
//将列表index位置的值设置为element
elementData[index] = element;
//返回原来的老值
return oldValue;
}
---------------------------------------------------------------------------
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> (2)的更多相关文章
- 内功心法 -- java.util.ArrayList<E> (1)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (3)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (4)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (5)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 内功心法 -- java.util.ArrayList<E> (6)
写在前面的话:读书破万卷,编码如有神--------------------------------------------------------------------下文主要对java.util ...
- 解决springmvc报No converter found for return value of type: class java.util.ArrayList问题
一.背景 最近闲来无事,想自己搭建一套Spring+SpringMVC+Mybatis+Mysql的环境(搭建步骤会在以后博客中给出),结果运行程序时,适用@ResponseBody注解进行返回Lis ...
- Java.util.ArrayList详解
java.util.ArrayList就是传说中的动态数组. 继承了关系,有此可看出ArrayList与list的collection的关系 public class ArrayList<E&g ...
- java@ 利用ArrayList实现dijkstra算法以及topological 排序算法(java.util.ArrayList)
package dataStructure; import java.util.ArrayList; import java.util.LinkedList; import java.util.Que ...
- java.util.ArrayList、java.util.vector和java.util.LinkedList (JDK 1.8.0_111)
一.java.util.ArrayList 1.1 ArrayList 继承结构 ArrayList实现了RandomAccess,可以随机访问(其实就是通过数组下标访问):实现了Cloneable, ...
随机推荐
- (简单) POJ 3984 迷宫问题,BFS。
Description 定义一个二维数组: int maze[5][5] = { 0, 1, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, ...
- 系统里有Courier New字体 Eclipse没有这个字体选项
问题状态: 系统里有Courier New字体 Eclipse没有这个字体选项问题原因: windows(xp)中的系统字体分为"显示"和"隐藏"两种状态,当为 ...
- VS2010 中 error 2732: 链接规范与的早期规范冲突 的解决
在实验室做项目的时候遇到了这个问题,终于整明白了. 一般来说这个错误出现在类似以下的语句中 extern "C" int yylex(void); extern "C&q ...
- X-001 FriendlyARM Tiny4412 uboot移植前奏
版权声明:本文为博主原创文章,转载请注明出处 开发环境:win7 64位 + VMware12 + Ubuntu14.04 64位 工具链:linaro提供的gcc-linaro-6.1.1-2016 ...
- AFNetworking content type not support
ref:http://blog.csdn.net/nyh1006/article/details/25068255 1.错误信息:Error:Error Domain=AFNetworkingErro ...
- Java XML解析器
使用Apache Xerces解析XML文档 一.技术概述 在用Java解析XML时候,一般都使用现成XML解析器来完成,自己编码解析是一件很棘手的问题,对程序员要求很高,一般也没有专业厂商或者开源组 ...
- 谈谈如何从Apache官网扒文档
学习java的猴子至少要会看文档, 一.从Apache官网下载文档 进入官网--components--例如点击FileUpload--点击最下面browser download area--点击bi ...
- db2 将原表列notnull属性修改为null属性的方法 (查看主键约束,唯一约束去syscat.tabconst)
好久没机会写点东西了,今天把自己遇到的一个小问题跟大家分享一下如何修改db2数据库表中列的属性--将列的非空属性改为允许空的属性,修改数据表的某一列属性其实很简单但是里面有需要细节需要dba注意,毕竟 ...
- 2.11. 创建托管对象(Core Data 应用程序实践指南)
到现在为止,还没有创建过托管对象,回顾了一下,只是创建了托管对象模型,持久化存储区,持久化存储协调器,托管对象上下文. 那么,现在就来创建托管对象吧. 使用NSEntityDescription 的 ...
- social relation & recommender system
由于社交网络盛行,现在许多关于推荐系统的研究都考虑了如何使用social relation来改进推荐系统.虽然有很多论文都成功的使用social relation改进了推荐效果,然而,也有一些尝试失败 ...