Java集合框架:Collections工具类
2016-03-18 16:44
513 查看
java.util.Collections工具类提供很多有用的方法,使得程序猿操作集合类的时候更加的方便容易,这些方法都是静态的。整个Collections工具类源码差不多有4000行,我们针对一些典型的方法进行阐述。
案例2-1:
运行结果:
public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
利用二分法在指定的集合中查找元素,至于Comparable以及Comparator相信看过前面一些列博文的朋友应该很清楚了,具体的也可以参考《Comparable与Comparator浅析》
public static <T> void sort(List<T> list, Comparator<? super T> c)
具体举例可以参考《Comparable与Comparator浅析》
public static void shuffle(List<?> list, Random rnd)
混排。混排算法所做的正好与sort相反:它打乱在一个List中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排list,这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的Game中非常有用。
案例5-1:
每次运行结果都不同。
public static void reverse(List<?> list)直接反转集合的元素
public static <T> Comparator<T> reverseOrder();返回可以使集合反转的比较器Comparator
public static <T> Comparator<T> reverseOrder(Comparator<T> cmp);如果cmp不为null,返回cmp的反转的比较器,即集合的反转的反转,最后就是没反转。如果cmp为null,效果等同于第二个方法.
举几个案例来说明下用法。
案例6-1:
运行结果:
案例6-2:
运行结果:(同上)
案例6-3:
运行结果:
如果把Comparator<String> comp2 = Collections.reverseOrder(comp);改成Comparator<String> comp2 = Collections.reverseOrder(null);运行结果:
public static <T> Collection<T> synchronizedCollection(Collection<T> c)
public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
public static <T> List<T> synchronizedList(List<T> list)
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
public static <T> Set<T> unmodifiableSet(Set<? extends T> s)
public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
public static <T> List<T> unmodifiableList(List<? extends T> list)
public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m)
public static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m)
参考资料:
1. 《Comparable与Comparator浅析》
1. 调用一个空List,Set,Map
public static final List EMPTY_LIST = new EmptyList<>(); public static final Map EMPTY_MAP = new EmptyMap<>(); public static final Set EMPTY_SET = new EmptySet<>();
2. addAll
public static <T> boolean addAll(Collection<? super T> c, T… elements):向指定的集合c中加入特定的一些元素elements案例2-1:
List<String> list = new ArrayList<>(); list.add("s2"); list.add("s4"); list.add("s1"); list.add("s3"); System.out.println(list); Collections.addAll(list, "s5","s7",null,"s9"); System.out.println(list);
运行结果:
[s2, s4, s1, s3] [s2, s4, s1, s3, s5, s7, null, s9]
3. binarySearch
public static <T> int binarySearch(List<? extends Comparable<? super T>> list, T key)public static <T> int binarySearch(List<? extends T> list, T key, Comparator<? super T> c)
利用二分法在指定的集合中查找元素,至于Comparable以及Comparator相信看过前面一些列博文的朋友应该很清楚了,具体的也可以参考《Comparable与Comparator浅析》
4. sort
public static <T extends Comparable<? super T>> void sort(List<T> list) 需要泛型T类本身支持Comparable接口public static <T> void sort(List<T> list, Comparator<? super T> c)
具体举例可以参考《Comparable与Comparator浅析》
5. shuffle
public static void shuffle(List<?> list)public static void shuffle(List<?> list, Random rnd)
混排。混排算法所做的正好与sort相反:它打乱在一个List中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排list,这样的排列具有相同的可能性(假设随机源是公正的)。这个算法在实现一个碰运气的Game中非常有用。
案例5-1:
public static void test3() { List<String> list = new ArrayList<>(); list.add("s1"); list.add("s2"); list.add("s3"); list.add("s4"); Collections.shuffle(list); System.out.println(list); }
每次运行结果都不同。
6. 反转
有关反转主要有这三个方法:public static void reverse(List<?> list)直接反转集合的元素
public static <T> Comparator<T> reverseOrder();返回可以使集合反转的比较器Comparator
public static <T> Comparator<T> reverseOrder(Comparator<T> cmp);如果cmp不为null,返回cmp的反转的比较器,即集合的反转的反转,最后就是没反转。如果cmp为null,效果等同于第二个方法.
举几个案例来说明下用法。
案例6-1:
List<String> list = new ArrayList<>(); list.add("s1"); list.add("s2"); list.add("s3"); list.add("s4"); System.out.println(list); Collections.reverse(list); System.out.println(list);
运行结果:
[s1, s2, s3, s4] [s4, s3, s2, s1]
案例6-2:
List<String> list = new ArrayList<>(); list.add("s1"); list.add("s2"); list.add("s3"); System.out.println(list); Comparator<String> comp = Collections.reverseOrder(); Collections.sort(list,comp); System.out.println(list);
运行结果:(同上)
案例6-3:
List<String> list = new ArrayList<>(); list.add("s1"); list.add("s2"); list.add("s3"); list.add("s4"); System.out.println(list); Comparator<String> comp = Collections.reverseOrder(); Collections.sort(list,comp); System.out.println(list); Comparator<String> comp2 = Collections.reverseOrder(comp); Collections.sort(list,comp2); System.out.println(list);
运行结果:
[s1, s2, s3, s4] [s4, s3, s2, s1]
[s1, s2, s3, s4]
如果把Comparator<String> comp2 = Collections.reverseOrder(comp);改成Comparator<String> comp2 = Collections.reverseOrder(null);运行结果:
[s1, s2, s3, s4] [s4, s3, s2, s1]
[s4, s3, s2, s1]
7.synchronized系列
确保所封装的集合线程安全(强同步)public static <T> Collection<T> synchronizedCollection(Collection<T> c)
public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
public static <T> List<T> synchronizedList(List<T> list)
public static <K,V> Map<K,V> synchronizedMap(Map<K,V> m)
public static <K,V> SortedMap<K,V> synchronizedSortedMap(SortedMap<K,V> m)
public static <T> SortedSet<T> synchronizedSortedSet(SortedSet<T> s)
8. unmodifiable系列
确保所封装的集合不能修改。public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c)
public static <T> Set<T> unmodifiableSet(Set<? extends T> s)
public static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T> s)
public static <T> List<T> unmodifiableList(List<? extends T> list)
public static <K,V> Map<K,V> unmodifiableMap(Map<? extends K, ? extends V> m)
public static <K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K, ? extends V> m)
9.其他
Collections工具类的功能不止上面这些,还有诸如fill(), rotate(), max(), min()等方法,不可能一下子就能全部记住,使用的时候多查查API即可。参考资料:
1. 《Comparable与Comparator浅析》
相关文章推荐
- Java集合框架:Collections工具类
- Java多线程系列--“基础篇”07之 线程休眠
- Java 异常处理
- eclipse黑色高亮主题下载和配置
- Java基本数据类型
- Java NIO
- spring 拦截器
- java成神之路
- Java利用 AES/ECB/PKCS5Padding 算法加解密
- Java集合框架:Arrays工具类
- Java集合框架:Arrays工具类
- 3、ExtJs写的js页面中的输入框的值如何传输到Java后台Controller控制层?
- java代理模式、动态代理(JDK,CGLIB)
- Intellij Idea下运行Spring Boot关于provided依赖不加入classpath的bug与解决方案
- eclipse下安装NDK开发jni
- Java多线程系列--“基础篇”06之 线程让步
- SpringAOP拦截Controller,Service实现日志管理(自定义注解的方式)
- Leetcode:67. Add Binary(JAVA)
- Java反射机制<1>
- Java 基本问题