[疯狂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

相关文章推荐

Java基础---泛型、集合框架工具类:collections和Arrays (黑马程序员)

一、概述 1、JDK1.5版本以后出现的新特性。用于解决安全问题,是一个类型安全机制。 2、JDK1.5的集合类希望在定义集合时,明确表明你要向集合中装入那种类型的数据,无法加入指定类型以外的数据...

9.9-全栈Java笔记:遍历集合的N种方式总结&Collections工具类

遍历集合的N种方式总结 【示例1】遍历List方法1,使用普通for循环 for(int i=0;i//list为集合的对象名     String temp...

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

Collections:它的出现给集合操作提供了更多的功能。这个类不需要创建对象,内部提供的都是静态方法。Collections.sort(list);//list集合进行元素的自然顺序排序。Coll...

java中的集合工具类Collections中的常用方法

java中的集合工具类Collections中的常用方法 下面是集合中常用的方法 //static void swap(List list, int i, int j) :将指定列表中...

Bag集合工具类(apache-commons-collections3.2工具包)在java中的使用

 Bag 是在 org.apache.commons.collections 包中定义的接口 ,也是集合的一种扩充工具类,当然结合用JDK中的map类进行相应的逻辑处理,也能实现Bag类的功能,...

黑马程序员--Java面向对象——集合工具类(Collections)

面向对象 集合框架的工具类。 Collections:集合框架的工具类。里面定义的都是静态方法。(相信Java的新手们都知道,如果一个类全都是静态方法的话,那么这个类肯定不能创建对象,也不需要给...

Java类集 _集合工具类:Collections

掌握Collections 与 Collection 接口的区别 掌握Collections 类中提供的主要操作方法 在面试题目中有可能会问这样一个问题,请回答, Collections 和 Co...

java 中的Collections集合工具类

Collections此类完全由在 collection 上进行操作或返回 collection 的静态方法组成。它包含在 collection 上操作的多态算法,即“包装器”,包装器返回由指定 co...

Java类集 _集合工具类:Collections

Java类集 _集合工具类:Collections 分类: Java编程2011-09-09 15:25 97人阅读 评论(0) 收藏 举报 掌握Collections 与 Col...

线程高级应用-心得8-java5线程并发库中同步集合Collections工具类的应用及案例分析

1.  HashSet与HashMap的联系与区别?    区别:前者是单列后者是双列,就是hashmap有键有值,hashset只有键;    联系:HashSet的底层就是HashMap,可...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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