区别如下:
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只能删除元素。
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集合,程序只能遍历访问该集合的元素,不可增加删除该集合里的元素。
它是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既实现了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。
以上建议和结论做参考,转自:http://www.finalblog.net/archives/1865