集合工具类Colletions

来源:互联网 发布:林忆莲 野风 知乎 编辑:程序博客网 时间:2024/06/03 21:19
package com.zhangtao.collections;import java.util.*;/* * 方法分类:常规操作(查找,最大,最小等)、排序、线程安全(同步)操作、不可变集合 */public class TestCollections {public static void main(String[] args) {List l = new ArrayList();l.add(100);l.add(-66);l.add(0);l.add(88);System.out.println("list:"+l);//Collections.reverse(l);//System.out.println("反转后的list:"+l);////Collections.shuffle(l);//随机排序,洗牌,每次排序的结果都不一样//System.out.println("乱序后的list:"+l);////Collections.swap(l, 1, 3);//System.out.println("互换序号是1,3元素后的list:"+l);//Collections.sort(l);//自然排序//System.out.println("排序后的list:"+l);//////二分查找,必须保证list处于有序状态,查询成功返回序号,查不到返回负数  //Collections.binarySearch(l, 88);////System.out.println("list中最小的元素是:"+Collections.min(l));//System.out.println("list中最大的元素是:"+Collections.max(l));////上面两个方法 是自然排序,当然您可以自己实现一个Comparator的实现类作为第二个参数//l.add(88);//System.out.println("88在list中出现了:"+Collections.frequency(l, 88)+"次");////Collections.replaceAll(l, 88, 66);//将88用66去替代 //System.out.println("替代后的list:"+l);////Collections.fill(l, 66);//使用66(第二个参数)替换list中的所有元素。//System.out.println("list所有元素都被替换成为66:"+l);//下面写法的意思是创建一个l这么大的l1,不这么写会报异常,因为copy的时候不会自动扩容 List l1 = new ArrayList(Arrays.asList(new Object[l.size()]));Collections.copy(l1, l);System.out.println("拷贝l的l1:"+l1);//System.out.println("l和l1是否相等?"+l.equals(l1));//true//System.out.println("l和l1是否是一个引用?"+(l==l1));//false//l1 = l;//System.out.println("l和l1是否相等?"+l.equals(l1));//true//System.out.println("l和l1是否是一个引用?"+(l==l1));//true//l1 = new ArrayList(l);//这个是一个浅拷贝,l和l1的引用虽然不同,但是l和l1内部的元素引用还是一样的  //System.out.println("l和l1是否相等?"+l.equals(l1));//true//System.out.println("l和l1是否是一个引用?"+(l==l1));//flase//创建一个类型安全的集合,下面的意思是这个集合只能是再添加Integer类型数据 //l.add("abc");//try {//Collections.checkedList(l, Integer.class).add("abc");//} catch (Exception e) {//System.out.println("类型安全操作后,当你试图添加非Integer类型数据时,发生了异常");//}System.out.println("======================================");        /*          * 注意常用的这些集合(HashSet、HashMap、ArrayList、TreeMap、TreeSet、LinkedList等),          * 都不是线程安全的,如果您的程序是在多线程环境下 并且有可能会同时修改同一个集合,那么          * 您就需要使用Collections.synchronizedXxx 方法来保证线程安全          *///List sl = Collections.synchronizedList(new ArrayList());//Map sm = Collections.synchronizedMap(new HashMap());//Set ss = Collections.synchronizedSet(new HashSet());//Set sts = Collections.synchronizedSortedSet(new TreeSet());        /*          * 不可变集合(空集合、指定元素集合、不可变状态)          * 1.使用Collections.emptyXxx 方法来创建一个不可变化的空集合          * 2.空不可变集合的意义:不会因为赋值null那样带来不可预期的异常,个人理解就是初始化的最佳实践。          * 3.指定元素集合:返回一个只包含指定元素的集合,同时也是不可变化的集合          *   应用:创建一个不可变化的特殊对象集合,例如:管理员集合,这样这个管理员对象就可以拥有一些集合的方法了          *       例如:我判断这个用户对象是否是管理员(adminList.contains(user))          * 4.不可变状态:获得这个集合的不可变视图(只读)          * 3.这里之用list举例,其他集合类似         */ List<String> el = Collections.emptyList();System.out.println(el.isEmpty());//truetry {el.add("l");//如果试图改变它 那么就会抛出UnsupportedOperationException异常} catch (Exception e) {System.out.println("UnsupportedOperationException");}List<String> el1 = null;try {el1.contains("abc");} catch (Exception e) {System.out.println("null异常");}//指定元素集合List<String> singletonL = Collections.singletonList("abcd");System.out.println(singletonL);//通过下面的方式就能得到一个不可变化的(只读)集合List<String> listView = Collections.unmodifiableList(l);System.out.println(listView.equals(l));System.out.println(listView == l);//flase}}