首页 > 基础教程 > 集合框架 > ArrayList类
Java ArrayList类
ArrayList是一个基于数组上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
语法
ArrayList()
构造一个初始容量为 10 的空列表(每次递增容量的一半)
ArrayList(Collection extends E> c)
构造一个包含指定 collection 的元素的列表,这些元素是按照该 collection 的迭代器返回它们的顺序排列的
ArrayList(int initialCapacity)
构造一个具有指定初始容量的空列表
特殊方法
void ensureCapacity(int minCapacity)
如有必要,增加此 ArrayList 实例的容量,以确保它至少能够容纳最小容量参数所指定的元素数。
返回此列表中最后一次出现的指定元素的索引,或如果此列表不包含索引,则返回 -1。
protected void removeRange(int fromIndex, int toIndex)
移除列表中索引在 fromIndex(包括)和 toIndex(不包括)之间的所有元素。
遍历
package com.itlwc;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
public class Test {
public static void main(String[] args) {
List list = new ArrayList();
list.add("lwc");
list.add("nxj");
// 遍历方法一
Iterator ite1 = list.iterator();
while (ite1.hasNext()) {
String str = ite1.next();
System.out.println(str);
}
System.out.println("---------------------");
// 遍历方法二(方法一的变形)
for (Iterator ite2 = list.iterator(); ite2.hasNext();) {
String str = ite2.next();
System.out.println(str);
}
System.out.println("---------------------");
// 遍历方法三
for(String s : list){
System.out.println(s);
}
}
}
/*
打印结果:
lwc
nxj
---------------------
lwc
nxj
---------------------
lwc
nxj
*/
总结
ArrayList依赖于数组实现的,初始长度为10的Object[],并且可随需要而增加的动态数组当元素超过10,那么ArrayList底层会新生成一个数组,长度为原来的1.5倍+1,然后将原数组内容复制到新数组中,并且后续增加的内容会放到新数组中,当新数组无法容纳增加的元素,重复该过程。
ArrayList对随机访问性能很好,但进行大量插入,删除操作,性能很差,因为操作之后后续元素需要移动。
实例
public class ArrayListReview {
public static void main(String[] args) {
ArrayList infosList=new ArrayList<>();
infosList.add(new Info(0, "aaa"));
infosList.add(new Info(1, "bbb"));
infosList.add(new Info(2, "ccc"));
infosList.add(new Info(3, "ddd"));
infosList.add(1, new Info(4, "eee")); // 按索引插入到指定位置
// foreach遍历输出
for (Info info : infosList) {
System.out.println(info);
}
System.out.println("------------------------");
// 截取字串
List subList = infosList.subList(1, 3);
subList.add(new Info(30, "fly"));
printList(subList);
ArrayList newInfosList=new ArrayList<>();
newInfosList.add(new Info(11, "qqq"));
newInfosList.add(new Info(12, "www"));
ArrayList ss=new ArrayList<>();
// infosList.addAll(newInfosList); // 添加一个指定集合到原集合最后,注意两个集合的泛型参数一致
infosList.addAll(2,newInfosList); // 将指定集合插入到指定位置
//printList(infosList);
Info info = infosList.get(2); // 取出指定位置的元素
System.out.println(info);
infosList.set(0, new Info(10, "rrr")); // 替换指定索引位置的元素
//printList(infosList);
int index = infosList.indexOf(info); //根据元素获取元素第一次出现的索引,不存在则返回-1
int lastIndex = infosList.lastIndexOf(info); // 取出元素的最后一个匹配项的索引
int indexOf = infosList.indexOf(new Info(4,"eee")); // 重写了Info类的hashCode与equals方法,用于判断两个对象是否相同
System.out.println("index="+indexOf);
//printList(infosList);
// 通过反射拿到的removeRange方法
removeRange(infosList, 1, 3);
//printList(infosList);
// listIterator从前往后迭代
ListIterator listIterator = infosList.listIterator();
while(listIterator.hasNext()){
// 最后抛出错误,java.util.NoSuchElementException,不要每次取都掉用next方法,它每调用一次,迭代器指针向前移动一位
// System.out.println("id="+listIterator.next().getId()
// +"adress="+listIterator.next().getAdress());
Info next = listIterator.next(); // 正确做法,调用一次要取出元素,然后操作属性
System.out.println("id="+next.getId()
+" adress="+next.getAdress());
}
// 往前迭代,必须在往后迭代之后用
while(listIterator.hasPrevious()){ // 当有上一个元素时
Info previous = listIterator.previous(); // 获取上一个元素
System.out.println("id="+previous.getId()+" adresss="+previous.getAdress());
}
// 通过数组来转化成一个List,虽然可以把数组转成集合,但是集合的长度不能改变。
String[] a=new String[]{"hello","world","just","do","it"};
List asList = Arrays.asList(a);
//asList.add("gogogo"); //不可修改asList,会抛出UnsupportedOperationException
// 泛型使用
// ArrayList l=new ArrayList();// 不行
// ArrayList lll=new ArrayList(); // 不行
// ArrayList lll=new ArrayList(); // 不行
// ArrayList l=new ArrayList(); // 可行
// ArrayList l=new ArrayList<>(); // 可行
// ArrayList ll=new ArrayList(); // 可行
}
// 打印输出
public static void printList(List list) {
for (E e : list) {
System.out.println(e);
}
System.out.println("------------------------");
}
}
版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。