Java集合框架(三)—— List、ArrayList、Vector、Stack

  • List接口

  List集合表明一个有序集合,集合中每个元素都有其对应的顺序索引。List集合允许使用重复元素能够经过索引来访问指定位置的集合对象。java

  • ArrayList和Vector实现类

  ArrayListVector作为List的类的两个典型实现,彻底支持list集合的所有功能。程序员

  ArrayList和Vector类都是基于数组实现的List类,因此ArrayList和Vector类封装了一个动态再分配的Object[]数组。每一个ArrayList或Vector对象有一个capacity属性,这个capacity表示它们所封装的Object[]数组的长度。当向ArrayList或Vector中添加元素时,它们的capacity会自动增长。编程

  对于一般编程场景,程序员无须关心ArrayList或Vector的capacity属性。但若是向ArrayList集合或Vector集合中添加大量元素时,可以使用ensureCapacity方法一次性地增长capacity。这能够减小增长重分配的次数,从而提升性能。数组

  若是开始就知道ArrayList或Vector须要保存多少个元素,则能够在建立该它们时就指定它们的capacity大小。若是建立空的ArrayList和Vector时不指定capacity属性,该属性默认为10安全

  除此以外,ArrayList和Vector还提供了以下两个方法来操做capacity属性:数据结构

    void ensureCapacity(int minCapacity);  将ArrayList或Vector集合的capacity增长minCapacity。框架

    void trimToSize();   调整ArrayList或Vector集合的capacity为列表当前大小。程序可调用该方法来减小ArrayList或Vector集合对象存储空间。工具

  ArrayList和Vector在用法上几乎彻底相同,但因为Vector是一个古老的集合(从JDK1.0就有了),最开始的时候,Java没有提供系统的集合框架,因此Vector里面提供一些方法名很长的方法:例如addElement(Object obj);实际上这个方法与add(Object obj)没有任何区别。从JDK1.2以后,Java提供了系统的集合框架,就将Vector改成实现List接口,作为List的实现之一,从而致使Vector里面有一些功能重复的方法。性能

  除此以外,ArrayList和Vector的显著区别是ArrayList是线程不安全的,当多条线程访问同一个ArrayList集合时,若是有超过一条线程修改了ArrayList集合,则程序必须受到保证该集合的同步性。但Vector是线程安全的,无须程序保证该集合的同步性。由于Vector是线程安全的,因此Vector的性能要比ArrayList的效率要低实际上即便须要保证list集合线程安全,一样不推荐使用Vector实现类,而是使用Collections工具类,它能够将一个ArrayList变的线程安全。spa

  Vector还提供了一个Stack子类,它用于模拟了“”这种数据结构,“栈”一般是指“后进先出”的容器。最后“push”进栈的元素,将最早被“pop”出栈。与Java中其余集合同样,进栈出栈的都是Object。

    Object peek();   //返回“栈”的第一个元素,但并不将该元素“pop”出栈。

    Object pop();    //返回“栈”的第一个元素,并将该元素“pop”出栈。

    void push(Object obj);    //将一个元素“push”进栈,最后一个进“栈”的元素老是位于“栈”顶。

public class Test {
    public static void main(String[] args){
        Stack<Integer> s = new Stack<Integer>();
        s.push(6);
        s.push(5);
        s.push(4);
        //输出:[6, 5, 4]
        System.out.println(s);
        //访问第一个元素,但并不将其pop出栈,输出:4
        System.out.println(s.peek());
        //pop出第一个元素,输出:4
        System.out.println(s.pop());
        //输出: [6, 5]
        System.out.println(s);
    }
}
  • 固定长度的List

  咱们知道有一个操做数组的工具类Arrays,该工具类里提供了asList(Object...  a)方法该方法能够把一个数组或指定个数的对象转换成一个List集合,这个List集合既不是ArrayList实现类的实例,也不是Vector实现类的实例,而是Arrays的内部类ArrayList的实例

  Arrays.ArrayList是一个固定长度的List集合程序只能遍历访问该集合里的元素,不可增长、删除该集合里的元素。以下:

 public class Test {
    public static void main(String[] args){
        String str[] = {"北京", "上海", "深圳"};
        List<String> list = Arrays.asList(str);
        for(String s : list){
            System.out.println(s);
        }
        //如下两句都将引发错误java.lang.UnsupportedOperationException
        list.add("南京");
        list.remove(0);
    }
}

   上面最后两行代码对于普通List集合彻底正常,但若是试图经过这两个方法来增长、删除Arrays.ArrayList集合里的元素,将会引起异常。因此上面代码在编译时彻底正常,但在运行时抛出java.lang.UnsupportedOperationException异常。

相关文章
相关标签/搜索