Android中几种常用的集合类

澳门新葡亰手机版 1

一、List回顾

序列(List),有序的Collection,正如它的名字一样,是一个有序的元素列表。确切的讲,澳门新葡亰手机版,列表通常允许满足 e1.equals(e2) 的元素对 e1 和 e2,并且如果列表本身允许
null 元素的话,通常它们允许多个 null
元素。实现List的有:ArrayList、LinkedList、Vector、Stack等。值得一提的是,Vector在JDK1.1的时候就有了,而List在JDK1.2的时候出现,待会我们会聊到ArrayList和Vector的区别。

1.集合 Collection

Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements)。一些Collection允许相同的元素而另一些不行。一些能排序而另一些不行。Java
SDK不提供直接继承自Collection的类,Java
SDK提供的类都是继承自Collection的“子接口”如List和Set。(这段话是抄来的)
咳咳,大体的意思的就是Collection是所有List的国际标准了,那我们可以看一下Collection接口需要记一下的方法。

二、ArrayList vs. Vector

ArrayList是一个可调整大小的数组实现的序列。随着元素增加,其大小会动态的增加。此类在Iterator或ListIterator迭代中,调用容器自身的remove和add方法进行修改,会抛出ConcurrentModificationException并发修改异常。

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

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

下面演示下相关ArrayList例子。

ArrayList基本方法代码:

@SuppressWarnings({ "rawtypes", "unchecked" })
    public static void listMethods()
    {

        List a1 = new ArrayList<String>();

        a1.add("List01");
        a1.add("List03");
        a1.add("List04");
        System.out.print("原来集合:/n/t"+a1+"/n");

        a1.add(1,"List02");
        System.out.print("指定角标1插入:/n/t"+a1+"/n");

        a1.remove(2);
        System.out.print("指定角标2删除:/n/t"+a1+"/n");

        System.out.print("指定角标2查询:/n/t"+a1.get(2)+"/n");

        Iterator i1 = a1.iterator();
        System.out.println("用迭代器查询全部元素:");
        while (i1.hasNext())
        {
            System.out.print(i1.next()+",");
        }
    }

可以从控制台可以看出:

原来集合:
    [List01, List03, List04]
指定角标1插入:
    [List01, List02, List03, List04]
指定角标2删除:
    [List01, List02, List04]
指定角标2查询:
    List04
用迭代器查询全部元素:
List01,List02,List04

在上面我们可以根据角标来增加(add)、删除(remove)、获取(get)列表里面元素。ArrayList提供了Iterator迭代器来遍历序列。值得注意的是,迭代器的就相当于一个指针指向角标,next()方法就相当于指针往后移一位。所以切记,用迭代器中一次循环用一次next()。

下面演示下在ConcurrentModificationException的出现,及处理方案。泥瓦匠用Iterator演示这个异常的出现:

@SuppressWarnings({ “unchecked”, “rawtypes” })
    public static void iteratorTest()
    {
        List a1 = new ArrayList<String>();

        a1.add(“List01″);
        a1.add(“List02″);
        a1.add(“List04″);
        a1.add(“List05″);

        Iterator i1 = a1.iterator();
        while (i1.hasNext())
        {
            Object obj = i1.next();
            if (obj.equals(“List02″))
                a1.add(“List03″);
        }

        System.out.print(“集合:/n/t”+a1+”/n”);
    }

运行,我们可以在控制台看到:

澳门新葡亰手机版 1

怎么解决的,先看清楚这个问题。问题描述很清楚,在创建迭代器之后,除非通过迭代器自身的 remove 或 add 方法从结构上对列表进行修改,否则在任何时间以任何方式对列表进行修改,迭代器都会抛出ConcurrentModificationException

因此我们应该这样修改代码,用ListIterator迭代器提供方法:

@SuppressWarnings({ "unchecked", "rawtypes" })
    public static void listIterator()
    {

        List a1 = new ArrayList<String>();

        a1.add("List01");
        a1.add("List");
        a1.add("List03");
        a1.add("List04");

        ListIterator l1 = a1.listIterator();
        while (l1.hasNext())
        {
            Object obj = l1.next();
            if (obj.equals("List"))
            {
                l1.remove();
                l1.add("List02");
            }
        }
        System.out.print("集合:/n/t"+a1+"/n");
    }

运行下,我们可以看到:

集合:
    [List01, List02, List03, List04]

这样,我们成功解决了这个并发修改异常。把其中‘List’元素删除,新增了一个‘List02’的元素。

Vector非常类似ArrayList。早在JDK1.1的时候就出现了,以前没有所谓的List接口,现在此类被改进为实现List接口。但与新的Collection不同的是,Vector是同步的。泥瓦匠想说的是Vector,在像查询的性能上会比ArrayList开销大。下面演示下Vector的基本例子:

@SuppressWarnings({ "unchecked", "rawtypes" })
    public static void vectorMethods()
    {
        Vector v1 = new Vector<String>();

        v1.add("Vector001");
        v1.add("Vector002");
        v1.add("Vector003");
        v1.add("Vector004");
        v1.add("Vector005");

        Enumeration e1 =v1.elements();
        while (e1.hasMoreElements())
        {
            Object object = e1.nextElement();
            System.out.println(object);
        }
    }

从方法上看几乎没差别,同样注意的是:此接口的功能与 Iterator
接口的功能是重复的。此外,Iterator
接口添加了一个可选的移除操作,并使用较短的方法名。新的实现应该优先考虑使用
Iterator 接口而不是 Enumeration 接口。

iterator()

这个方法是用来遍历Collection中所有的元素的,用法如下:

Iterator it = collection.iterator();
while(it.hasNext()){
           Object ob = it.next();
}

这个可以遍历出一个Collection中所有的元素。

  • Iterator
    迭代器的作用就是遍历Collection,Iterator接口里面规定了三个方法,hasNext()、next()、remove()。看方法名就知道他们的功能了。
  • 在Iterator出现之前,也就是Java1.0版本的时候,遍历还是用的Enumeration这个枚举类,后来Iterator出来之后就取代了Enumeration。
  • Iterator支持fail-fast机制,直白的理解就是快速错误,就是相当于一种报错机制,当遍历的集合发生了结构性的修改的时候就会发生fail-fast.而真正实现检测结构性修改的原因就是在集合中增加一个modcount成员变量,当每次对集合进行add或者remove的时候我们就进行modcount++操作。