概念
ArrayList类继承于抽象类AbstractList,实现了List接口,内部是一个可变的数组。
继承结构
因为其底层数据结构是一个数组,所以ArrayList的数据访问特性和Array相似:随机访问元素速度快,插入或者删除元素速度慢。
另外,ArrayList线程不安全,建议在单线程中才使用ArrayList,而在多线程中可以选择Vector或者CopyOnWriteArrayList。
构造方法
ArrayList()
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
说明
- 使用无参构造方法实例化对象时,ArrayList会构建一个默认容量为10的数组。
实例化
ArrayList<String> arrayList1 = new ArrayList<>();
ArrayList(int initialCapacity)
public ArrayList(int initialCapacity) {
if (initialCapacity > 0) {
this.elementData = new Object[initialCapacity];
} else if (initialCapacity == 0) {
this.elementData = EMPTY_ELEMENTDATA;
} else {
throw new IllegalArgumentException("Illegal Capacity: "+
initialCapacity);
}
}
说明
- 传入一个int型的参数,指定ArrayList的初始数组长度,传入参数如果是大于等于0,则使用用户的参数初始化,如果用户传入的参数小于0,则抛出异常。
实例化
ArrayList<String> arrayList2 = new ArrayList<>(5);
ArrayList(Collection<? extends E> c)
public ArrayList(Collection<? extends E> c) {
elementData = c.toArray();
if ((size = elementData.length) != 0) {
// c.toArray might (incorrectly) not return Object[] (see 6260652)
if (elementData.getClass() != Object[].class)
elementData = Arrays.copyOf(elementData, size, Object[].class);
} else {
// replace with empty array.
this.elementData = EMPTY_ELEMENTDATA;
}
}
说明
- 参数是一个集合类
- 用 toArray() 方法将集合转换成数组
- 判断数组长度是否为0
- 不为 0 则将数组的数据 copy到ArrayList内部数组
- 为0 设置为默认数组 EMPTY_ELEMENTDATA
实例化
ArrayList<String> arrayList3 = new ArrayList<>(arrayList2);
其它
当不使用泛型指定类型时,ArrayList的Item默认类型为Object。
比如
ArrayList arrayList1 = new ArrayList();
ArrayList的常用方法
- add(object value)
将指定元素object value追加到集合的末尾。 - add(int index, Object element)
在集合中指定index位置,添加新元素obj。 - size()
返回列表中的元素个数。
*get(int index)
返回列表中指定位置的元素,index从0开始。 - set(int i, Object element)
将索引i位置元素替换为元素element并返回被替换的元素。 - clear()
从列表中移除所有元素。 - isEmpty()
判断列表是否包含元素,不包含元素则返回 true,否则返回false。 - contains(Object o)
如果列表包含指定的元素,则返回 true。 - remove(int index)
移除列表中指定位置的元素,并返回被删元素。 - remove(Object o)
移除集合中第一次出现的指定元素,移除成功返回true,否则返回false。 - iterator()
返回按适当顺序在列表的元素上进行迭代的迭代器,用于遍历集合。
遍历方式
for循环遍历
for(int i = 0 ; i < arrayList1.size() ; i++){
printfln(arrayList1.get(i));
}
Iterator迭代器遍历
Iterator<String> it = arrayList1.iterator();
while (it.hasNext()){
printfln(it.next());
}
for each循环遍历
for (String item : arrayList1){
printfln(item);
}
demo
public class ArrayListTest {
ArrayList<String> arrayList1 = new ArrayList<>();
ArrayList<String> arrayList2 = new ArrayList<>(5);
ArrayList<String> arrayList3 = new ArrayList<>(arrayList1);
public void fun(){
//添加item
arrayList1.add("小绿");
arrayList1.add("小黄");
arrayList1.add("小红");
//增删改以及三种遍历方式
println("添加item“小明”:");
arrayList1.add("小明");
for(int i = 0 ; i < arrayList1.size() ; i++){
print(arrayList1.get(i));
}
println("");
println("小明修改成大明:");
arrayList1.set(3,"大明");
Iterator<String> it = arrayList1.iterator();
while (it.hasNext()){
print(it.next());
}
println("");
println("删除大明:");
arrayList1.remove(3);
for (String item : arrayList1){
print(item);
}
println("");
}
public void print(String str){
System.out.print("["+str+"] ");
}
public void println(String str){
System.out.println(str);
}
public static void main(String[] args){
ArrayListTest test = new ArrayListTest();
test.fun();
}
}