java collections读书笔记(11) Lists

时间:2024-05-22 14:37:38

继续这个系列,好久没学习了,懒惰呀。

Set接口,实际上是collection 类别中最简单的一个接口,因为它并没有比Collection 接口增加任何的内容,相对而言,大家可能更喜欢List接口和它的扩展:ArrayList和LinkedList。

List加入了位置属性,从而,可以有多种的排序可能。因此,除了可以使用Iterator获取元素之外,还可以使用ListIterator<E> ,通过index,获取指定位置的元素。

java collections读书笔记(11) Lists

在新的框架里,ArrayList,是用来替代vector的。

ArrayList is the replacement for Vector in the new framework. It represents an
unsynchronized vector where the backing store is a dynamically growable array. On the other hand is
LinkedList, which, as its name implies, is backed by the familiar linked list data structure.

ArrayList:

显然,ArrayList是替代Vector的,相对Vector而言,ArrayList是非同步的。另外,如果想快速的,随机的访问其中的元素,ArrayList是可以的(前提是不要有大量频繁的元素插入和删除等操作,否则,考虑LinkedList)。

ArrayList是扩展自AbstractList.而且,支持重复的元素。

1)ArrayList的初始化

主要是这么几个构造函数:

public ArrayList(int initialCapacity) {
        super();
        if (initialCapacity < 0)
            throw new IllegalArgumentException("Illegal Capacity: "+
                                               initialCapacity);
        this.elementData = new Object[initialCapacity];
    }

/*newCapacity= (oldCapacity * 3)/2 + 1.*/

public ArrayList() {
        this(10);
    }

public ArrayList(Collection<? extends E> c) {
        elementData = c.toArray();
        size = elementData.length;
        // c.toArray might (incorrectly) not return Object[] (see 6260652)
        if (elementData.getClass() != Object[].class)
            elementData = Arrays.copyOf(elementData, size, Object[].class);
    }

一个容易犯错的例子:

String elements[] = {"Schindler's List", "Waiting List", "Shopping List",
"Wine List"};
List list = new ArrayList(Arrays.asList(elements));

这个时候,aslist返回的arraylist,是arrays的内部类,不是java.util下的arraylist,具体见:

http://www.cnblogs.com/hashmap/articles/2162444.html

2)增加元素

public boolean add(Object element)
public boolean add(int index, Object element)

java collections读书笔记(11) Lists

3)删除元素

ArrayList mylist=new ArrayList();
        mylist.add("wcf1");
        mylist.add("wcf2");
        mylist.add("wcf3");
        mylist.add("wcf4");
        mylist.add("wcf5");
        mylist.add("wcf6");
        System.out.println(mylist);
        mylist.add("wcf3");
        System.out.println(mylist);
        mylist.remove("wcf3");
        System.out.println(mylist);

[wcf1, wcf2, wcf3, wcf4, wcf5, wcf6]
[wcf1, wcf2, wcf3, wcf4, wcf5, wcf6, wcf3]
[wcf1, wcf2, wcf4, wcf5, wcf6, wcf3]

4)列举

public Iterator iterator()
public ListIterator listIterator()
public ListIterator listIterator(int index)

因为list是排序的,因此,iterator和listIterator的操作结果是一样的。

他们的区别,见:http://www.cnblogs.com/aomi/p/3166292.html

LinkedList

ArrayList和LinkedList在作为List接口 使用的时候,主要区别就是随机访问(按照index进行查找删除等等操作)效率,ArrayList的随机访问效率当然会高;如果你的程序很少应用随机访 问,那使用LinkedList不会是比ArrayList更差的选择。ArrayList最没有效率的地方就是频繁的添加操作,这个操作可能会引起 ArrayList的扩容,扩容的时候会copy数组浪费点时间,而LinkedList没有扩容时的问题。
还有一个地方不同:LinkedList实现了Deque接口,如果我们需要队列操作,那声明LinkedList的实现为Deque类型是非常方便的,ArrayList没有实现这个接口。

这是个链表结构。

ListIterator

 java collections读书笔记(11) Lists

 a)来自Iterator

    ListIterator iter = list.listIterator();
while (iter.hasNext()) {
System.out.println(iter.next());
}

 b)可以倒序

  ListIterator iter = list.listIterator(list.size());
while (iter.hasPrevious()) {
System.out.println(iter.previous());
}