A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 张林敏 中级黑马   /  2013-5-11 10:36  /  1580 人查看  /  3 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

先来个各个类与接口的关系:
Collection   
├ List   
   ├ LinkedList   
   ├ ArrayList   
   └Vector   
       └Stack   
└Set

    ├ HashSet
   └  LinkedHashSet
    └ TreeSet

  • java.util.Collection
  • java.util.Collections
  • java.util.Arrays



(一)List和Set集合的总结
  • 对于 List ,关心的是顺序, 它保证维护元素特定的顺序(允许有相同元素),使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在 List 中的位置,类似于数组下标)来访问 List 中的元素。 Java中的List是对数组的有效扩展,它是这样一种结构,如果不使用泛型,它可以容纳任何类型的元素,如果使用泛型,那么它只能容纳泛型指定的类型的元素。和数组相比,List的容量是可以动态扩展的。
  • 对于 Set ,只关心某元素是否属于 Set (不 允许有相同元素 ),而不关心它的顺序。 Set 和List类似,都是用来存储单个元素,单个元素的数量不确定。但Set不能包含重复元素,如果向Set中插入两个相同元素,那么后一个元素不会被插入。
    Set可以大致分为两类:不排序Set和排序Set,不排序Set包括HashSet和LinkedHashSet,排序Set主要指TreeSet。其中HashSet和LinkedHashSet可以包含null。



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

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

  • ArrayList是最常用的List实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要讲已经有数组的数据复制到新的存储空间中。当从ArrayList的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。
  • Vector与ArrayList一样,也是通过数组实现的,不同的是它支持线程的同步,即某一时刻只有一个线程能够写Vector,避免多线程同时写而引起的不一致性,但实现同步需要很高的花费,因此,访问它比访问ArrayList慢。


相同点:都继承自接口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的区别
  • java.util.Collection 是一个集合接口。它提供了对集合对象进行基本操作的通用接口方法。Collection接口在Java 类库中有很多具体的实现。Collection接口的意义是为各种具体的集合提供了最大化的统一操作方式。
  • java.util.Collections 是一个包装类。它包含有各种有关集合操作的静态多态方法。此类不能实例化,就像一个工具类,服务于Java的Collection框架。
  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类中方法:
  • 排序(Sort)
    使用sort方法可以根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此列表内的所有元素都必须是使用指定比较器可相互比较的。
  • 混排(Shuffling)
    混排算法所做的正好与 sort 相反: 它打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该 List, 这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的游戏中是非常有用的。例如,它可被用来混排代表一副牌的 Card 对象的一个 List 。另外,在生成测试案例时,它也是十分有用的。
  • 反转(Reverse)
    使用Reverse方法可以根据元素的自然顺序 对指定列表按降序进行排序。
  • 替换所有的元素(Fill)
    使用指定元素替换指定列表中的所有元素。
  • 拷贝(Copy)
    用两个参数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖它的内容。目标 List 至少与源一样长。如果它更长,则在目标 List 中的剩余元素不受影响。
    Collections.copy(list,li): 后面一个参数是目标列表 ,前一个是源列表
  • 返回Collections中最小元素(min)
    根据指定比较器产生的顺序,返回给定 collection 的最小元素。collection 中的所有元素都必须是通过指定比较器可相互比较的
  • 返回Collections中最大元素(max)
    根据指定比较器产生的顺序,返回给定 collection 的最大元素。collection 中的所有元素都必须是通过指定比较器可相互比较的
  • lastIndexOfSubList
    返回指定源列表中最后一次出现指定目标列表的起始位置
  • IndexOfSubList
    返回指定源列表中第一次出现指定目标列表的起始位置
  • rotate
    根据指定的距离循环移动指定列表中的元素




3、Arrays工具类
在java.util类库中可以找到Arrays类,它有一套static方法,提供了操作数组的实用功能。
其中有四种基本方法:
  • equals()用于比较两个数组是否相等;
  • fill()用于以某个值填充整个数组;
  • sort()用于对数组排序;
  • binarySearch()用于在已经排序的数组中查找元素。

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

Collections与Arrays操作对象不同:
  • java.util.Collections:主要是对进行操作
  • java.util.Arrays:主要对数组进行操作




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

评分

参与人数 1技术分 +2 收起 理由
曹睿翔 + 2 25了

查看全部评分

3 个回复

倒序浏览
顶一下。
回复 使用道具 举报
本帖最后由 Neverbelazy 于 2013-5-12 09:31 编辑

清晰,简洁

不太同意对<线程安全性上的比较>, 容器本身同步与否已经不重要, java已经提供了同步代码的方法,就可以通过对代码的同步对 ArrayList等容器的“存查改删”进行人工的同步干预, 一方面这样可以优化多线程的执行效率,另一方面思考何时同步何时不同步也是在写多线程代码必需的步骤。
回复 使用道具 举报
哈哈,有人提出不同观点了,对了,还有一个跟你领同一任务的, 你们相互对比啊
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马