ArrayList是一个基于数组上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
遍历
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<String> list = new ArrayList<String>();
list.add("lwc");
list.add("nxj");
// 遍历方法一
Iterator<String> ite1 = list.iterator();
while (ite1.hasNext()) {
String str = ite1.next();
System.out.println(str);
}
System.out.println("---------------------");
// 遍历方法二(方法一的变形)
for (Iterator<String> 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<Info> 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<Info> subList = infosList.subList(1, 3);
subList.add(new Info(30, "fly"));
printList(subList);
ArrayList<Info> newInfosList=new ArrayList<>();
newInfosList.add(new Info(11, "qqq"));
newInfosList.add(new Info(12, "www"));
ArrayList<String> 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<Info> 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<String> asList = Arrays.asList(a);
//asList.add("gogogo"); //不可修改asList,会抛出UnsupportedOperationException
// 泛型使用
// ArrayList<Object> l=new ArrayList<String>();// 不行
// ArrayList<ArrayList> lll=new ArrayList<List>(); // 不行
// ArrayList<List> lll=new ArrayList<ArrayList>(); // 不行
// ArrayList l=new ArrayList<String>(); // 可行
// ArrayList<String> l=new ArrayList<>(); // 可行
// ArrayList ll=new ArrayList(); // 可行
}
// 打印输出
public static <E> void printList(List<E> list) {
for (E e : list) {
System.out.println(e);
}
System.out.println("------------------------");
}
}
网友评论