Java基础之集合框架--ArrayList

来源:互联网 发布:外国人来中国后被淘宝 编辑:程序博客网 时间:2024/06/05 04:07



实现了所有可选列表操作,并允许包括 null 在内的所有元素。除了实现 List 接口外,此类还提供一些方法来操作内部用来存储列表的数组的大小。(此类大致上等同于 Vector 类,除了此类是不同步的。)

size、isEmpty、get、set、iterator 和 listIterator 操作都以固定时间运行。add 操作以分摊的固定时间 运行,也就是说,添加 n 个元素需要 O(n) 时间。其他所有操作都以线性时间运行(大体上讲)。与用于 LinkedList 实现的常数因子相比,此实现的常数因子较低。


每个 ArrayList 实例都有一个容量。该容量是指用来存储列表元素的数组的大小。它总是至少等于列表的大小。随着向 ArrayList 中不断添加元素,其容量也自动增长。并未指定增长策略的细节,因为这不只是添加元素会带来分摊固定时间开销那样简单。


在添加大量元素前,应用程序可以使用 ensureCapacity 操作来增加 ArrayList 实例的容量。这可以减少递增式再分配的数量。


注意,此实现不是同步的。如果多个线程同时访问一个 ArrayList 实例,而其中至少一个线程从结构上修改了列表,那么它必须 保持外部同步。(结构上的修改是指任何添加或删除一个或多个元素的操作,或者显式调整底层数组的大小;仅仅设置元素的值不是结构上的修改。)这一般通过对自然封装该列表的对象进行同步操作来完成。如果不存在这样的对象,则应该使用 Collections.synchronizedList 方法将该列表“包装”起来。这最好在创建时完成,以防止意外对列表进行不同步的访问:


        List list = Collections.synchronizedList(new ArrayList(...)); 

此类的 iterator 和 listIterator 方法返回的迭代器是快速失败:在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出 ConcurrentModificationException。因此,面对并发的修改,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。


注意,迭代器的快速失败行为无法得到保证,因为一般来说,不可能对是否出现不同步并发修改做出任何硬性保证。快速失败迭代器会尽最大努力抛出 ConcurrentModificationException。因此,为提高这类迭代器的正确性而编写一个依赖于此异常的程序是错误的做法:迭代器的快速失败行为应该仅用于检测 bug。


/*Collection|--List:元素是有序的,元素可以重复。因为该集合体系有索引。|--ArrayList:底层的数据结构使用的是数组结构。特点:查询速度很快。但是增删稍慢。线程不同步。|--LinkedList:底层使用的链表数据结构。特点:增删速度很快,查询稍慢。线程不同步。|--Vector:底层是数组数据结构。线程同步。被ArrayList替代了。因为效率低。|--Set:元素是无序,元素不可以重复。List:特有方法。凡是可以操作角标的方法都是该体系特有的方法。增add(index,element);addAll(index,Collection);删remove(index);改set(index,element);查get(index):subList(from,to);listIterator();int indexOf(obj):获取指定元素的位置。ListIterator listIterator();List集合特有的迭代器。ListIterator是Iterator的子接口。在迭代时,不可以通过集合对象的方法操作集合中的元素。因为会发生ConcurrentModificationException异常。所以,在迭代器时,只能用迭代器的方法操作元素,可是Iterator方法是有限的,只能对元素进行判断,取出,删除的操作,如果想要其他的操作如添加,修改等,就需要使用其子接口,ListIterator。该接口只能通过List集合的listIterator方法获取。*/import java.util.*;class ListDemo {public static void sop(Object obj) {System.out.println(obj);}public static void method() {ArrayList<String> al = new ArrayList<>();// 添加元素al.add("java01");al.add("java02");al.add("java03");sop("原集合是:" + al);// 在指定位置添加元素。al.add(1, "java09");// 删除指定位置的元素。// al.remove(2);// 修改元素。// al.set(2,"java007");// 通过角标获取元素。sop("get(1):" + al.get(1));sop(al);// 获取所有元素。for (int x = 0; x < al.size(); x++) {System.out.println("al(" + x + ")=" + al.get(x));}Iterator<String> it = al.iterator();while (it.hasNext()) {sop("next:" + it.next());}// 通过indexOf获取对象的位置。sop("index=" + al.indexOf("java02"));List sub = al.subList(1, 3);sop("sub=" + sub);}public static void main(String[] args) {// 演示列表迭代器。ArrayList<String> al = new ArrayList<>();// 添加元素al.add("java01");al.add("java02");al.add("java03");sop(al);ListIterator<String> li = al.listIterator();// sop("hasPrevious():"+li.hasPrevious());while (li.hasNext()) {Object obj = li.next();if (obj.equals("java02"))// li.add("java009");li.set("java006");}while (li.hasPrevious()) {sop("pre::" + li.previous());}// sop("hasNext():"+li.hasNext());// sop("hasPrevious():"+li.hasPrevious());sop(al);/* * //在迭代过程中,准备添加或者删除元素。 *  * Iterator it = al.iterator(); *  * while(it.hasNext()) { Object obj = it.next(); *  * if(obj.equals("java02")) //al.add("java008"); * it.remove();//将java02的引用从集合中删除了。 *  * sop("obj="+obj); *  *  * } sop(al); */}}

JDK1.8 List新增方法

package newFeatures8;import java.util.ArrayList;import java.util.Arrays;import java.util.List;import java.util.Spliterator;import java.util.stream.Stream;public class NewlyAdded{public static void main(String[] args) {List<String> list=new ArrayList<>();list.add("14hh");list.add("23hh");list.add("3hh");//遍历list集合/*对比 * for (String s : list) {System.out.println(s);}*/list.forEach((s)->{System.out.println(s);});//也可以是使用这种方式(这种方式叫:方法引用)遍历list.forEach(System.out::println);Stream<String> stream=list.parallelStream();stream.forEach(System.out::println);//对于list中的每一个元素s 如果是以"3"开头,则删除list.removeIf((s)->s.startsWith("3"));System.out.println(list);//将list中的每个元素替换成其本身截取0~2后的值System.out.println("---------------");list.replaceAll((s)->s.substring(0, 2));System.out.println(list);//stream():将list集合变成流的形式          //map(功能函数):对集合里的元素进行运算、操作  List<Double> costBeforeTax = Arrays.asList(100.08, 200.0, 300.0, 400.0, 500.0);costBeforeTax.stream().map((cost) -> cost + .12 * cost).forEach(cost -> {System.out.println(String.format("%.2f", cost));});//也不知道为什么,突然写出这么奇怪的代码for (Spliterator<String> sp=list.spliterator();sp.tryAdvance(System.out::println););}}



原创粉丝点击