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

翻译 2016年06月01日 13:37:41

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

集合工具类CollectionUtils、ListUtils、SetUtils、MapUtils探究

之前一直以为集合工具类只有CollectionUtils,主要用它的isEmpty(final Collection coll)静态方法来判断一个给定的集合是否为null或者是否长度为0。最近才发现此...
  • koushr
  • koushr
  • 2015年12月10日 19:05
  • 6192

【Java基础】——集合工具类Collections和数组工具类Arrays

android培训------我的java笔记,期待与您交流! 一、集合工具类Collections 1、什么是Collections? Collections是对集合框架的一个工具类。它里边的方法都...
  • u010873512
  • u010873512
  • 2015年06月17日 22:11
  • 2621

java集合常用的工具类

这里整理一个java集合中常用的一个工具类具体有如下几个功能 1.取集合中对象的某两个属性封装成map,一个属性作为key,一个属性作为value 2.取集合对象中的某一个属性值封装成List ...
  • u014001866
  • u014001866
  • 2016年06月02日 18:09
  • 2076

Collections集合操作(List、Set、Map)-巧用工具类

这是我的第一篇技巧性文章,虽然我技术不是很牛,但是在很多操作的时候使用一些java提供的util会大大的减少代码时间,提高代码效率,希望可以分享给一些比我还小白的小白,在本篇文章中,这些util不会深...
  • lueeast
  • lueeast
  • 2017年03月01日 13:45
  • 284

Java类集 _集合工具类:Collections

掌握Collections 与 Collection 接口的区别 掌握Collections 类中提供的主要操作方法 在面试题目中有可能会问这样一个问题,请回答, Collections 和 Co...
  • hanshileiai
  • hanshileiai
  • 2011年09月09日 15:25
  • 7941

Java集合框架:Collections工具类

java.util.Collections工具类提供很多有用的方法,使得程序猿操作集合类的时候更加的方便容易,这些方法都是静态的。整个Collections工具类源码差不多有4000行,我们针对一些典...
  • u013256816
  • u013256816
  • 2016年03月18日 16:44
  • 5089

集合工具类 Collections 、Arrays

------- android培训、java培训、期待与您交流! ----------   Collections集合框架的工具类。里面定义的都是静态方法。Collections和Collecti...
  • lovelife521
  • lovelife521
  • 2013年03月13日 14:44
  • 4236

几种常见的算法排序

前言:我们常用的排序算法有插入排序(直接插入排序、希尔排序)、选择排序(简单选择排序、堆排序)、交换排序(冒泡排序、快速排序)、归并排序、基数排序。 1、插入排序   (1)直接插...
  • mrlin6688
  • mrlin6688
  • 2016年09月10日 00:02
  • 523

排序

1 public class Test1 {    publicstatic void main(String[] args) {       Stringstring = "hello";  ...
  • JJ_nan
  • JJ_nan
  • 2016年10月03日 21:31
  • 68

JAVA——集合框架的工具类Collections

Collections:它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法。Collections.sort(list);//list集合进行元素的自然顺序排序。Coll...
  • Jungle_hello
  • Jungle_hello
  • 2016年05月15日 21:39
  • 1260
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:[疯狂Java]集合:Collections工具类、Enumeration(摒弃)
举报原因:
原因补充:

(最多只允许输入30个字)