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原创文章,未经本站允许不得转载。