<span style="font-size:14px;">ArrayList 所有以实现的接口:Serializable,Cloneable,Iterable<E>,Collection<E>,list<E>,RandomAccess
* 直接已知子类:AttributeList, RoleList, RoleUnresolvedList
* public class ArrayList<E>extends AbstractList<E>implements List<E>, RandomAccess, Cloneable, Serializable
List 接口的大小可变数组的实现。实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)
size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。其他所有操作都以线性时间运行(大体上讲)。与用于 LinkedList 实现的常数因子相比,此实现的常数因子较低。
每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。
在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。
注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:
List list = Collections.synchronizedList(new ArrayList(...)); 此类的 iterator 和 listIterator 方法返回的迭代器是快速失败的:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。
注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。
此类是 Java Collections Framework 的成员。 </span>
package org.collection;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
/**
* @author 沧海奈何
*
*/
public class arrayListDemo {
public static void main(String[] args) {
List list= new ArrayList();
List list1= new ArrayList();
List listObj = new ArrayList<City>();
//如果此列表中没有元素,则返回 true
boolean isEmpty = list.isEmpty();
System.out.println("isEmpty:"+isEmpty);
//结果 isEmpty:true
//add(e)将指定的元素添加到此列表的尾部
list.add("java");
list.add("php");
list.add("C#");
list.add("C++");
list.add("Js");
list.add("Html");
System.out.println("添加元素后的list"+list.toString());
//结果 添加元素后的list[java, php, C#, C++, Js, Html]
//add(index,e)将指定的元素插入此列表中的指定位置。超出会抛出IndexOutOfBoundsException异常
list.add(2, "你好");
System.out.println("指定的元素插入后的list"+list.toString());
//结果 指定的元素插入后的list[java, php, 你好, C#, C++, Js, Html]
//size()返回集合的长度
int size = list.size();
System.out.println("size:"+size);
//结果 size:7
//isEmpty 返回false
isEmpty = list.isEmpty();
System.out.println("添加元素后是否为空:"+isEmpty);
//结果 添加元素后是否为空:false
list1.add("BJ");
list1.add("TJ");
list1.add("SH");
list1.add("GZ");
//按照指定 collection 的迭代器所返回的元素顺序,将该 collection 中的所有元素添加到此列表的尾部。
//如果正在进行此操作时修改指定的 collection ,那么此操作的行为是不确定的
list.addAll(list1);
System.out.println("添加集合后的list:"+list.toString());
//结果 添加集合后的list:[java, php, 你好, C#, C++, Js, Html, BJ, TJ, SH, GZ]
//从指定的位置开始,将指定 collection 中的所有元素插入到此列表中。
//向右移动当前位于该位置的元素(如果有)以及所有后续元素(增加其索引)。
//新元素将按照指定 collection 的迭代器所返回的元素顺序出现在列表中
list.addAll(3, list1);
System.out.println("添加集合到指定位置后的list:"+list.toString());
//结果 添加集合到指定位置后的list:[java, php, 你好, BJ, TJ, SH, GZ, C#, C++, Js, Html, BJ, TJ, SH, GZ]
//contains如果此列表中包含指定的元素,则返回 true。
//更确切地讲,当且仅当此列表包含至少一个满足 (o==null ? e==null : o.equals(e)) 的元素 e 时,则返回 true。
boolean contains = list.contains("TJ");
System.out.println("是否包含指定的元素:"+contains);
//结果 是否包含指定的集合元素:true
boolean containsAll = list.containsAll(list1);
System.out.println("是否包含指定的集合:"+contains);
//结果 是否包含指定的集合:true
//clear 移除此列表中的所有元素
// list.clear();
// System.out.println("移除此列表中的所有元素:"+list.toString());
//结果 移除此列表中的所有元素:[]
//get()返回此列表中指定位置上的元素。
Object obj = list.get(2);
System.out.println("获取指定的元素:"+obj);
//结果 获取指定的元素:你好
//用指定的元素替代此列表中指定位置上的元素
obj = list.set(2, "世界");
System.out.println("以前位于该指定位置上的元素:"+obj);
//结果 以前位于该指定位置上的元素:你好
System.out.println("替换后的list:"+list.toString());
//结果 替换后的list:[java, php, 世界, BJ, TJ, SH, GZ, C#, C++, Js, Html, BJ, TJ, SH, GZ]
//indexOf
//返回此列表中首次出现的指定元素的索引,或如果此列表不包含元素,则返回 -1。
//更确切地讲,返回满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引 i ,如果不存在此类索引,则返回 -1。
int index = list.indexOf("TJ");
System.out.println("首次出现的指定元素的索引:"+index);
//结果 首次出现的指定元素的索引:4
//lastIndexOf
//返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。
//更确切地讲,返回满足 (o==null ? get(i)==null : o.equals(get(i))) 的最高索引 i,如果不存在此类索引,则返回 -1
index = list.lastIndexOf("TJ");
System.out.println("首次出现的指定元素的索引:"+index);
//结果 首次出现的指定元素的索引:12
//remove(int index)
//移除此列表中指定位置上的元素。向左移动所有后续元素(将其索引减 1)。
obj = list.remove(4);
System.out.println("移除指定的元素:"+obj);
//结果 移除指定的元素:TJ
//remove(object o)
//移除此列表中首次出现的指定元素(如果存在)。如果列表不包含此元素,则列表不做改动。更确切地讲,移除满足 (o==null ? get(i)==null : o.equals(get(i))) 的最低索引的元素(如果存在此类元素)。
//如果列表中包含指定的元素,则返回 true(或者等同于这种情况:如果列表由于调用而发生更改,则返回 true)。
obj = list.remove("TJ");
System.out.println("移除指定的元素:"+obj);
//结果 移除指定的元素:TJ
System.out.println("移除指定的元素:"+list.toString());
//结果中没有TJ 移除指定的元素:[java, php, 世界, BJ, SH, GZ, C#, C++, Js, Html, BJ, SH, GZ]
City c = new City();
c.setArea(1234.78);
c.setDesc("这里是天堂");
c.setSchool(100);
listObj.add(c);
System.out.println(listObj.toString());
//[City [school=100, area=1234.78, desc=这里是天堂]]
System.out.println("---------方法一-----------------");
//遍历集合:方法一
for(int i = 0;i< list.size(); i++){
System.out.println(list.get(i));
}
System.out.println("---------方法二-----------------");
//遍历集合:方法二
for(Object o : list){
System.out.println(o);
}
//遍历集合:方法三
System.out.println("--------方法san------------------");
Iterator<String> it = list.iterator();
while(it.hasNext()){
String value = it.next();
System.out.println(value);
}
}
}
package org.collection;
public class City {
private Integer school;
private Double area;
private String desc;
public Integer getSchool() {
return school;
}
public void setSchool(Integer school) {
this.school = school;
}
public Double getArea() {
return area;
}
public void setArea(Double area) {
this.area = area;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
@Override
public String toString() {
return "City [school=" + school + ", area=" + area + ", desc=" + desc
+ "]";
}
}
方法一遍历:
内部不锁定,
方法二遍历:
内部调用第一种
List接口的两种主要实现类ArrayList和LinkedList都可以采用这样的方法遍历
方法三遍历:
执行过程中会进行数据锁定,关于ArrayList与LinkedList的比较分析
a) ArrayList底层采用数组实现,LinkedList底层采用双向链表实现。
b) 当执行插入或者删除操作时,采用LinkedList比较好。
c) 当执行搜索操作时,采用ArrayList比较好。