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<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("------------------------");
    }
}






版权声明:本文为JAVASCHOOL原创文章,未经本站允许不得转载。