黑马程序员技术交流社区

标题: “第五贴”之List和Set集合的总结 [打印本页]

作者: 张林敏    时间: 2013-5-11 10:36
标题: “第五贴”之List和Set集合的总结
先来个各个类与接口的关系:
Collection   
├ List   
   ├ LinkedList   
   ├ ArrayList   
   └Vector   
       └Stack   
└Set

    ├ HashSet
   └  LinkedHashSet
    └ TreeSet




(一)List和Set集合的总结


(二)常用类的使用
1、ArrayList与Vector区别

   首先看这两类都实现List接口,而List接口一共有三个实现类,分别是ArrayList、Vector和LinkedList。List用于存放多个元素,能够维护元素的次序,并且允许元素的重复。具体实现类的相关区别如下:



相同点:都继承自接口List、内部都是通过数组实现

不同点:
            <1> 线程安全
Vector是同步的, 而ArrayList不是.因为Vector是同步的, 所以它是线程安全的.同样, 因为Vecotr是同步的, 所以他需要额外的开销来维持同步锁, 所以它要比ArrayList要慢.(理论上来说)
当然, 如果你对ArrayList有偏好, 你也可以用Collection.synchronizedList(List)来得到一个线程安全的List.
<2> 容量增长
Vector允许用户设置capacityIncrement这样在每次需要扩充数组的size的时候, Vector会尝试按照预先设置的capacityIncrement作为增量来设置, 而ArrayList则会把数组的大小扩大一倍.
如果capacityIncrement设为0或者负值, Vector就会做和ArrayList一样, 每次都将数组大小扩大一倍.
<3> 性能比较
刚刚在上面已经说过了, 由于Vector是同步的, 而ArrayList不是, 所以Vector的性能要比ArrayList                要稍第一点, 用性能换安全。

速度 多线程安全性适用方面
ArrayList不安全多线程不安全
Vector安全提供了线程序同 步,在多线程是安全的



2、Collection与Collections的区别
  1. import java.util.ArrayList;  
  2. import java.util.Collections;  
  3. import java.util.List;  
  4.   
  5. public class TestCollections {  
  6.       
  7.     public static void main(String args[]) {  
  8.         //注意List是实现Collection接口的  
  9.         List list = new ArrayList();  
  10.         double array[] = { 112, 111, 23, 456, 231 };  
  11.         for (int i = 0; i < array.length; i++) {  
  12.             list.add(new Double(array[i]));  
  13.         }  
  14.         Collections.sort(list);  
  15.         for (int i = 0; i < array.length; i++) {  
  16.             System.out.println(list.get(i));  
  17.         }  
  18.         // 结果:23.0 111.0 112.0 231.0 456.0  
  19.     }  
  20. }
复制代码
java.util.Collections类中方法:




3、Arrays工具类
在java.util类库中可以找到Arrays类,它有一套static方法,提供了操作数组的实用功能。
其中有四种基本方法:

所有这些方法对各种基本类型和object类而重载过。此外,方法asLis()接受任意的数组为参数,并将其转变为List容器。

Collections与Arrays操作对象不同:




4、 集合去重(可以使用Set进行集合的去重)
  1. //转换一下:  
  2. List list;  
  3. HashSet set=new HashSet();  
  4. for(Object e:list){  
  5. set.add(e);  
  6. }
复制代码

作者: 小陈期待逆袭    时间: 2013-5-11 10:47
顶一下。
作者: Neverbelazy    时间: 2013-5-12 09:25
本帖最后由 Neverbelazy 于 2013-5-12 09:31 编辑

清晰,简洁

不太同意对<线程安全性上的比较>, 容器本身同步与否已经不重要, java已经提供了同步代码的方法,就可以通过对代码的同步对 ArrayList等容器的“存查改删”进行人工的同步干预, 一方面这样可以优化多线程的执行效率,另一方面思考何时同步何时不同步也是在写多线程代码必需的步骤。
作者: 曹睿翔    时间: 2013-5-12 10:06
哈哈,有人提出不同观点了,对了,还有一个跟你领同一任务的, 你们相互对比啊




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2