先来个各个类与接口的关系:
Collection
├ List
├ LinkedList
├ ArrayList
└Vector
└Stack
└Set
├ HashSet
└ LinkedHashSet
└ TreeSet
- java.util.Collection
- java.util.Collections
- java.util.Arrays
(一)List和Set集合的总结
(二)常用类的使用
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框架。
- import java.util.ArrayList;
- import java.util.Collections;
- import java.util.List;
-
- public class TestCollections {
-
- public static void main(String args[]) {
- //注意List是实现Collection接口的
- List list = new ArrayList();
- double array[] = { 112, 111, 23, 456, 231 };
- for (int i = 0; i < array.length; i++) {
- list.add(new Double(array[i]));
- }
- Collections.sort(list);
- for (int i = 0; i < array.length; i++) {
- System.out.println(list.get(i));
- }
- // 结果:23.0 111.0 112.0 231.0 456.0
- }
- }
复制代码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进行集合的去重)- //转换一下:
- List list;
- HashSet set=new HashSet();
- for(Object e:list){
- set.add(e);
- }
复制代码 |