[疯狂Java]集合:Collections工具类、Enumeration(摒弃)

来源:互联网 发布:tv域名价值 编辑:程序博客网 时间:2024/06/05 17:11

1. Collections工具类简介:

    1) Java提供的专门用来操作集合的工具类(全部都是静态工具方法),可以操作Set、List、Map;

    2) 主要功能包括:

         i. 对集合元素进行排序(包括改变集合元素的原有顺序)、查询、修改;

         ii. 设置集合的属性(只读、可变等);

         iii. 对集合进行同步控制(使普通集合进化成线程安全的集合);


2. 排序操作:

    1) 这里的排序是指改变集合的原有顺序;

    2) 由于Set和Map本身就是无序的,而SortedSet和SortedMap本身就是时刻保持顺序的,因此排序操作对它们都是无效的,因此排序操作只能应用于List集合;

    3) Collections为List提供的排序操作:

         i. 反转:static void reverse(List list);

         ii. 排序:

             a. static void sort(List list);  // 按照元素的自然顺序排序(compareTo)

             b. static void sort(List list, Comparator c); // 自定义排序

         iii. 洗牌:static void shuffle(List list); // 随机打乱顺序

         iv. 交换元素:static void swap(List list, int i, int j);  // 将i、j两处的元素交换

         v. 旋转:static void rotate(List list, int distance);  // 如果distance为正,则将最后distance个元素整体移到前面,否则将前distance个元素整体移到后面


3. 查找、替换:

    1) 很多查找、替换的操作只能应用线性结构,像二分查找之类的操作,只能应用于线性结构,像Set、SortedXxx之类的不是线性结构(哈希结构和树形结构);

    2) 因此这里大多数的操作只能操作List;

    3) 只能应用于List的操作:

         i. 二分查找:static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key);  // 返回key所在的索引,失败返回-1

!!该方法明显要求元素是可比的(要求自然排序compareTo);

         ii. static <T> void fill(List<? super T> list, T obj);  // 将整个list用obj填充

         iii. static <T> boolean replaceAll(List<T> list, T oldVal, T newVal);  // 将list中所有的oldVal替换成newVal

         iv. static int indexOfSubList(List<?> source, List<?> target);  // 找到子集合target在source中第一次出现的位置,不存在就返回-1

         v. static int lastIndexOfSubList(List<?> source, List<?> target);  // 找到target在source中最后一次出现的位置,复存在就返回-1

    4) 适用于所有类型集合的查找方法:

         i. 找出最大/最小的元素:static <T extends Object & Comparable<? super T>> T max | min(Collection<? extends T> coll[, Comparator<? super T> comp]);

!!没有Comparator就是根据自然大小比较(必须实现compareTo),否则就是定制的大小比较

         ii. 返回集合中指定元素的出现个数:static int frequency(Collection<?> c, Object o); // 一般应用于可重复的集合


4. 同步控制:

    1) Java集合框架的所有集合Collection、Map全部都是线程不安全的,因为线程不安全的效率更高,应用更广泛,然而并没有为它们提供相应的线程安全的版本;

    2) 只有老版本的几个集合Vector、Stack等是线程安全的(默认就是线程安全,连线程不安全的版本都没有),但是实现较差,已经没人用了;

    3) 还好Collections工具类提供了synchronizedXxx(Xxx<T> c)方法可以将一个线程不安全的集合包装成线程安全的集合并返回:Xxx支持Collection、Set、List、Map

         i. static <T> Collection<T> synchronizedCollection(Collection<T> c);

         ii. static <T> Set<T> synchronizedSet(Set<T> s);

         iii. static <T> List<T> synchronizedList(List<T> list);

         iv. static <K,V> Map<K,V> synchronizedMap(Map<K,V> m);

!!可以看到包装后的返回类型并不是什么新类型(没有synchronized之类的前缀),还是原有的类型,只不过底层多支持了线程安全的功能,用法和线程不安全的普通版本一模一样!!非常方便,就像变魔术一样!

!!注意:返回类型都是Collection、Set、List、Map这样的上层接口,如果需要使用具体的实现类则需要强制类型转换一下;

    3) 示例:ArrayList<String> list = (ArrayList<String>)Collections.synchronizedCollection(new ArrayList<String>());  // 返回值一定要(ArrayList<String>)转换一下

!!虽然List是ArrayList的父类,但List<T>并不是ArrayList<T>的父类!这个问题会在泛型中具体讲到!!


5. 设置只读集合:以下方法产生的集合都是不可变的只读集合(任何修改集合的行为都是导致运行时异常

    1) 产生一个空的不可变集合:static final <T> Xxx<T> emptyXxx();  // Xxx支持Set、List、Map、SortedSet、SortedMap

!!泛型类型根据返回值的接受引用推断,例如:Set<String> set = Collections.emptySet();  // 泛型参数由Set<String>推断出来

    2) 产生一个只包含一个元素的不可变集合:

        i. static <T> Set<T> singleton(T o);  // 产生只包含一个元素o的Set不可变集合

        ii. static <K,V> Map<K,V> singletonMap(K key, V value);  // 产生只包含一对key-value的Map不可变集合

        iii. static <T> List<T> singletonList(T o);

!!注意!只有Set不符合singletonXxx的命名规范,需要记忆一下!

    3) 返回指定集合的不可变版本(只读版本):static <T> Xxx<T> unmodifiableXxx(Xxx<? extends T> c); // Xxx支持Collection、Set、List、Map、SortedSet、SortedMap

0 0