List接口之ArrayList、vector、stack、LinkedList

List集合代表一个有序的集合,里面的元素可以重复。可以通过索引来访问指定集合元素,因为它默认按元素的添加顺序设置元素的索引。List作为Collection接口的子接口,可以使用Collection里的全部方法,List还增加了一些根据索引操作元素的方法:

1、void add(int index,object element):将element插入List的index中。

2、boolean addAll(int index,Collection c):将集合c所包含的所有元素都插入List集合的index处。

3、Object get(int index):返回集合index处的元素。

4、int indexOf(Object o):返回对象o在List中出现的位置索引。

5、int lastIndexOf(Object o):返回对象o在List集合中最后一次出现的位置索引。

6、Object remove(int index):删除并返回index索引处的元素。

7、Object set(int index,Object element):将index处的元素替换成element对象,返回新的元素。

8、List subList(int fromIndex,int toIndex):返回从索引fromIndex(包含)到索引toIndex(不包含)处所有集合元素组成的子集合。

 

public static void main(String[] args) {
  List books=new ArrayList();
 books.add("一");
 books.add("二");
 books.add("三");
 System.out.println(books);    //输出[一, 二, 三]
 books.add(1,new String("四"));  //将新字符串对象插入第二个位置上
 for(Object i:books){
  System.out.println(i);    //输出[一,四, 二, 三]
 }
 books.remove(2);    //删除第三个元素
 System.out.println(books.indexOf("四"));    //输出“四”的索引
 books.set(1,new String("二"));      //将第二个元素替换成新的字符串
 System.out.println(books);        //输出[一, 二, 三]
 System.out.println(books.subList(1, 2));    //输出:二
}

注意:当调用List的set方法来改变集合指定索引的元素时,指定的索引必须是List集合的有效索引,即set方法不会改变List集合的长度。

 

与Set只提供一个iterator()方法不同,List还额外提供了一个listIterator()方法,它继承了Iterator接口,在Iterator接口基础上增加了如下方法:

1、boolean hasPrevious():返回该迭代器关联的集合是否还有上一个元素。

2、Object previous():返回该迭代器的上一个元素。

3、void add():在指定位置插入一个元素。

注意:ListIterator增加了向前迭代的功能,Iterator只能向后迭代;ListIterator还可以通过add方法想list中添加 元素,Iterator只能删除元素。

 

ArrayList和Vector实现类:

1、ArrayLIst和Vector封装了一个动态再分配的Object[]数组。

2、每个ArrayLIst和Vector对象 有一个capacity属性用来表示它们所封装的Object[]数组的长度,当向ArrayLIst和Vector添加元素时,capacity会自动增加。

如果需向ArrayLIst和Vector添加大量元素时,可使用ensureCapacity方法一次性地增加capacity。

*void ensureCapacity(int i):把ArrayLIst和Vector的capacity增加i;

*void trimTOSize():调整ArrayLIst和Vector的capacity为列表当前大小,程序可调用方法来减少ArrayLIst和Vector对象存储空间。

 

ArrayList的例子

import java.util.ArrayList;

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {

       Manager m1=new Manager();

    while(true){

       System.out.println("请选择操作");

       System.out.println("1:添加一个雇员");

       System.out.println("2:查找员工");

       System.out.println("3:修改雇员工资");

       System.out.println("4:删除一个员工");

       System.out.println("5:退出");

       Scanner s1=new Scanner(System.in);

       int a=s1.nextInt();

    if(a==5){

       System.exit(0);}

    switch (a) {

    case 1:System.out.println("请输入编号");

           String a1=s1.next();

           System.out.println("请输入姓名");

           String a2=s1.next();

           System.out.println("请输入工资");

           float a3=s1.nextFloat();

           Clerk clerk=new Clerk(a1, a2, a3);

           m1.add(clerk);

       break;

    case 2:System.out.println("请输入编号");

           String b1=s1.next();

           m1.show(b1);

    case 3:System.out.println("请输入编号");

           String c1=s1.next();

           System.out.println("请输入工资");

           float c2=s1.nextFloat();

           m1.updateSal(c1, c2);

    case 4:System.out.println("请输入编号");

          String d1=s1.next();

          m1.del(d1);}}}}

class Manager{

    private ArrayList a2=null;

    public Manager(){

       a2=new ArrayList();}

    //加入员工

    public void add(Clerk clerk){

       a2.add(clerk);}

    //显示信息

    public void show(String no){

       //遍历arraylist

       for (int i = 0; i <a2.size(); i++) {

           Clerk temp=(Clerk)a2.get(i);

           //比较编号

           if(temp.getNo().equals(no)){

              System.out.println("找到员工,他的信息是");

              System.out.println("编号="+no);

              System.out.println("名字="+temp.getName());

              System.out.println("薪水="+temp.getSal());}}}

    //修改工资

    public void updateSal(String no,float newSal){

       for (int i = 0; i <a2.size(); i++) {

           Clerk temp=(Clerk)a2.get(i);

           if(temp.getNo().equals(no)){

              temp.setSal(newSal);}}}

    //删除员工

    public void del(String no){

       for (int i = 0; i <a2.size(); i++) {

           Clerk temp=(Clerk)a2.get(i);

           if(temp.getNo().equals(no)){

               a2.remove(i);}}}}

 

ArrayList和Vector的区别:

1、 同步性:Vector是同步的,ArrayList是异步的

2、 数据增长:从内部实现机制来讲ArrayList和Vector都是使用数组来控制集合中的对象。当你向着两种类型增加元素的时候,如果元素的数目超出了内部数据目前的长度它们都需要扩展内部数据的长度,Vector缺省的情况下自动增长原来一倍的数组长度,ArrayList增长原来的50%,所以最后你获得的这个集合所占的空间总是比你实际需要的要大。所以如果你要在集合中国保存大量的数据那么使用Vector有一些优势。

 

固定长度的List--Arrays.ArrayList:

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

 

Stack:

它是vector的子类,用于模拟栈这种数据结构,即“后进先出”。进栈出栈的都是Object,因此从栈中取出元素后必须做类型转换,除非你只是使用Object具有的操作。Stack提供了如下方法:

1、Object peek():返回栈的第一个元素,但并不将该元素出栈。

2、Object pop():返回栈的第一个元素,并将该元素出栈。

3、void push(Object item):将一个元素push进栈。

 

public static void main(String[] args) {
  // TODO Auto-generated method stub
  //新建一个stack集合
  Stack v=new Stack();
  //依次将3个元素push进栈
  v.push("指南");
  v.push("实战");
  v.push("开发");
  System.out.println(v);//输出[指南, 实战, 开发]
  System.out.println(v.peek());//输出:开发
  System.out.println(v);//依然输出[指南, 实战, 开发]
  System.out.println(v.pop());//输出:开发
  System.out.println(v);//输出[指南, 实战]

 

LinkedList:

LinkedList既实现了List接口,又实现了Deque接口。即可以根据索引来随机访问集合中的元素,而Deque代表一个双向队列。

Deque接口里定义了一些可以双向操作队列的方法:

 1、void addFirst(Object e):将指定元素插入该双向队列的开头。

2、void addLast(Object e):将指定元素插入该双向队列的末尾。

3、Iterator descengingIterator():返回以该双向队列对应的迭代器,该迭代器以逆向顺序来迭代元素。

4、Object getFirst():获取但不删除双向队列的第一个元素。

5、Object getLast():获取但不删除双向队列的最后一个元素。

6、boolean offerFirst(Object e):将指定的元素插入该队列的开头。

7、boolean offerLast(Object e):将指定的元素插入队列的末尾。

8、Object peekFirst():获取但不删除该队列的第一个元素,如果队列为空,则返回null。

9、Object peekLast():获取但不删除该队列的最后一个元素,如果队列为空,则返回null。

10、Object pollFirst():获取并删除该队列的第一个元素,如果队列为空,则返回null。

11、Object pollLast():获取并删除该队列的最后一个元素,如果队列为空,则返回null。

12、Object pop():pop出该队列所表示栈中的第一个元素。

13、void push z(Object e):将一个元素push进该队列所表示的栈中。

14、Object removeFirst():获取并删除该队列的第一个元素。

15、Object removeFirstOccurrence(Object o):删除该队列第一次出现的o对象。

16、removeLast():获取并删除该队列的最后一个元素。

17、Object removeLastOccurrence(Object o):删除该队列最后一次出现的o对象。

 

 比较:

1、LinkedList与ArrayList、Vector的实现机制完全不同,ArrayList、Vector内部以数组的形式来保存集合中的元素,因此随机访问集合元素上有较好的性能

2、LinkedList内部以链表的形式来保存集合中的元素,因此随机访问集合元素时性能差;但插入、删除时性能出色,因为只需改变指针地址即可。

3、Vector因为实现了线程同步功能,所以各方面性能都有所下降。

4、对于基于数组的集合,如ArrayList、Vector,其随机访问的速度比使用Iterator迭代访问的性能好,因随机访问会被映射成数组元素的访问。

 

 建议:

1、如需遍历List集合,对于ArrayList、Vector集合,则应使用随机访问方法(get)来遍历;对于LinkedList,则应使用迭代器(Iterator)来遍历。

2、如需经常插入、删除元素,则应使用LinkedList。

3、如有多条线程需同时访问List集合中元素,可以用Vector。

 

 

 

 

 

 

 

posted @ 2012-02-08 16:54  广东仔-学习ing  阅读(1487)  评论(1编辑  收藏  举报