集合工具类——CollectionUtils、ArrayUtils

1.CollectionUtils

1.Collections.sort(list);//升序
2.Collections.reverse(list);//降序  注意:单独使用只会根据插入顺序反过来排序,需要结合升序一起使用
3.Collections.max(list);//获取最大值
4.Collections.min(list);//获取最小值
5.Collections.emptyList();//空集合
6.Collections.binarySearch(list, 3);//二分查找
    要查找某个元素,必须提供集合,而且这个集合必须实现List接口
    集合必须有序,如果没有序,应该先排序再二分查找
    如果要查找的元素的类型没有实现Comparable接口的compareTo方法进行排序,就还要提供一个比较器。(此处说明的是二分查找的2种方式)
    例如:
    import java.util.Arrays;
	import java.util.Collections;
	import java.util.List;
	
	class tea implements Comparable<tea>{
	    private int id;
	    public tea(int id){
	        this.id=id;
	    }
	    public int getId() {
	        return id;
	    }
	
	    @Override
	    public String toString() {
	        return id+"";
	    }
	
	    @Override
	    public int compareTo(tea o) {
	        return o.getId()-id;
	    }
	
	}
	
	
	public class Main {
	
	    public static void main(String[] s) {
	        tea[] arr = {new tea(2), new tea(3), new tea(1),new tea(5)};
	        List<tea> list = Arrays.asList(arr);
	        System.out.println(list);
	        
	         Collections.sort(list);
	        System.out.println(list);
	        
	        int i= Collections.binarySearch(list,new tea(3));
	        System.out.println(i);
	 
	    }
	    
	}
	结果:
	[2,3,1,5]
	[1,2,3,5]
	2
7.Collections.unmodifiableList(list);//转换成不可修改集合
	Collections.unmodifiableList() 方法,让 getter 方法返回一个不可被修改的UnmodifiableList 集合容器,而这个容器类重写了 List 容器中跟修改数据相关的方法,比如 add()clear() 等方法。
	一旦我们调用这些修改数据的方法,代码就会抛出UnsupportedOperationException 异常,这样就避免了容器中的数据被修改
	List<Integer> integers = Collections.unmodifiableList(list);//转换成不可修改集合
    integers.add(1);
    异常信息:
    Exception in thread "main" java.lang.UnsupportedOperationException
	at java.util.Collections$UnmodifiableCollection.add(Collections.java:1055)
	at DateTest.main(DateTest.java:29)

2.转换线程安全集合
可以用Collections的synchronizedxxx方法,将线程不安全的集合,直接转换成线程安全集合。

  List<Integer> list = new ArrayList<>();
  list.add(2);
  list.add(1);
  list.add(3);

  List<Integer> integers = Collections.synchronizedList(list);//将ArrayList转换成线程安全集合
  System.out.println(integers);
  它的底层会创建SynchronizedRandomAccessList或者SynchronizedList类,这两个类的很多方法都会用synchronized加锁

3.更多

CollectionUtils.addAll(strList, strArray);//添加数组到集合
	ex:
	String[] strArray = {"aaa", "bbb", "ccc"};
	List strList = new ArrayList();
	CollectionUtils.addAll(strList, strArray);
	[aaa, bbb, ccc]
CollectionUtils.isEmpty(list);//集合判空,只对Collection及子类有效
CollectionUtils.isNotEmpty(list);//集合判不为空,只对Collection及子类有效
CollectionUtils.addIgnoreNull(list3, 1);//如果1处不为null,把1添加到list3集合中
CollectionUtils.removeAll(list1, list2);//从list1中删除list2
CollectionUtils.union(list, list2);//获取并集
CollectionUtils.intersection(list, list2);//获取交集
CollectionUtils.disjunction(list, list2);//获取交集的补集
CollectionUtils.subtract(list, list2);//获取差集
CollectionUtils.retainAll(list1, list2);//返回list2在list1中的数据
CollectionUtils.reverseArray(arr);//数组反转
CollectionUtils.getCardinalityMap(list1); //返回每个元素出现的个数
CollectionUtils.cardinality("9", list2) //返回对象在集合中出现的次数
CollectionUtils.get(list2, 0) //返回结合指定位置的数
CollectionUtils.isEqualCollection(list1, list2);//判断两个集合是否相等
CollectionUtils.isProperSubCollection(testList2,testList);//判断集合1是否小于集合2
CollectionUtils.isSubCollection(testList2, testList);//判断是否存在交集
CollectionUtils.containsAny(list1, list2)//判断是否存在交集
CollectionUtils.select:根据条件筛选集合元素
CollectionUtils.transform:根据指定方法处理集合元素,类似List的map()
CollectionUtils.find:基本和select一样
CollectionUtils.forAllDo:调用每个元素的指定方法
CollectionUtils.isEqualCollection:判断两个集合是否一致
一、对集合中某些些元素进行操作,并返回操作后的元素集合
	Collection collect = CollectionUtils.collect(list2.iterator(), input -> {
	    return input += "a";
	});
	Collection collect2 = CollectionUtils.collect(list2, input -> {
	    return input += "a";
	});
二、集合中某些些元素进行操作,并将操作后的元素封装带第3个参数集合中,第3个集合返回
	Collection collect = CollectionUtils.collect(list2.iterator(), input -> {
    return input += "a";
	},new ArrayList());
	Collection collect2 = CollectionUtils.collect(list2, input -> {
	    return input += "a";
	},new ArrayList());
三、条件过滤,如果testList为null,不进行任何操作
	CollectionUtils.filter(testList, itm->{
	    return Integer.valueOf(itm.toString())>2;
	});
四、返回符合条件的个数
	int resultMatchNum= CollectionUtils.countMatches(testList, itm->{
    return Integer.valueOf(itm.toString())>1;
	});
五、判断是否存在符合条件的元素
	boolean resultExists=CollectionUtils.exists(testList, itm->{
	    return Integer.valueOf(itm.toString())>2;
	});
六、返回符合条件的数据,注意:只返回一个
	Object reusltFindObject=CollectionUtils.find(testList, itm->{
	    return Integer.valueOf(itm.toString())>1;
	});
七、返回符合条件的数据,返回一个集合
	Collection resultSelect=CollectionUtils.select(testList, itm->{
	    return Integer.valueOf(itm.toString())>1;
	});
八、返回符合条件的数据,并封装到传入的集合中
	CollectionUtils.select(testList, itm->{
	    return Integer.valueOf(itm.toString())>1;
	}, testList2);
九、和select结果相反,返回不符合条件的collection
	Collection resultSelectReject=CollectionUtils.selectRejected(testList, itm->{
	    return Integer.valueOf(itm.toString())>1;
	});
十、和select结果相反,将不符合条件的元素,封装到传入的集合
	Collection resultSelectReject=CollectionUtils.selectRejected(testList, itm->{
	    return Integer.valueOf(itm.toString())>1;
	});
十一、断言,都符合返回集合,否则返回 java.lang.IllegalArgumentException 异常
	Collection resultCollect=CollectionUtils.predicatedCollection(testList, itm->{
	    return Integer.valueOf(itm.toString())>1;
	});
十二、对每个元素进行操作,操作直接影响传入的集合
	CollectionUtils.transform(list1, input -> input+"@");

更全

二、ArrayUtils

ArrayUtils.toString(new int[] { 1, 4, 2, 3 });// {1,4,2,3} 将一个数组转换成String,用于打印数组
ArrayUtils.EqualsBuilder(array1,array2) //只有当两个数组的数据类型,长度,数值顺序都相同的时候,该方法才会返回True
ArrayUtils.equal(array1,array2)
	一、// 两个数组完全相同
	ArrayUtils.isEquals(new int[] { 1, 2, 3 }, new int[] { 1, 2, 3 });// true
	二、// 数据类型以及长度相同,但各个Index上的数据不是一一对应
	ArrayUtils.isEquals(new int[] { 1, 3, 2 }, new int[] { 1, 2, 3 });// true
	三、// 数组的长度不一致
	ArrayUtils.isEquals(new int[] { 1, 2, 3, 3 }, new int[] { 1, 2, 3 });// false
	四、// 不同的数据类型
	ArrayUtils.isEquals(new int[] { 1, 2, 3 }, new long[] { 1, 2, 3 });// false
	ArrayUtils.isEquals(new Object[] { 1, 2, 3 }, new Object[] { 1, (long) 2, 3 });// false
	五、// Null处理,如果输入的两个数组都为null时候则返回true
	ArrayUtils.isEquals(new int[] { 1, 2, 3 }, null);// false
	ArrayUtils.isEquals(null, null);// true
 ArrayUtils.clone(new int[] { 3, 2, 4 });// {3,2,4},拷贝数组
 截取数组
 ArrayUtils.subarray(new int[] { 3, 4, 1, 5, 6 }, 2, 4);// {1,5}// 起始index为2(即第三个数据)结束index为4的数组
 ArrayUtils.subarray(new int[] { 3, 4, 1, 5, 6 }, 2, 10);// {1,5,6}// 如果endIndex大于数组的长度,则取beginIndex之后的所有数据
 ArrayUtils.isSameLength(new Integer[] { 1, 3, 5 }, new Long[] { 2L, 8L, 10L });// true,判断两个数组的长度是否相等
 ArrayUtils.getLength(new long[] { 1, 23, 3 })//获得数组的长度
 ArrayUtils.isSameType(new int[] { 1, 3 }, new long[] { 8, 5, 6 });// false,判段两个数组的类型是否相同
 ArrayUtils.reverse(array)//数组反转
 
 //查询某个Object在数组中的位置,可以指定起始搜索位置,找不到返回-1
	  // 从正序开始搜索,搜到就返回当前的index否则返回-1
	  ArrayUtils.indexOf(new int[] { 1, 3, 6 }, 6);// 2
	  ArrayUtils.indexOf(new int[] { 1, 3, 6 }, 2);// -1
	  // 从逆序开始搜索,搜到就返回当前的index否则返回-1
	  ArrayUtils.lastIndexOf(new int[] { 1, 3, 6 }, 6);// 2

 ArrayUtils.contains(new int[] { 3, 1, 2 }, 1);// true,查询某个Object是否在数组中

//基本数据类型与包装类互转
ArrayUtils.toObject(new int[] { 1, 2 });// new Integer[]{Integer,Integer}
ArrayUtils.toPrimitive(new Integer[] { new Integer(1), new Integer(2) });// new int[]{1,2}	 

//判断数组是否为空(null和length=0的时候都为空)
ArrayUtils.isEmpty(new int[0]);// true
ArrayUtils.isEmpty(new Object[] { null });// false 

ArrayUtils.addAll(new int[] { 1, 3, 5 }, new int[] { 2, 4 });// {1,3,5,2,4} //合并两个数组
ArrayUtils.add(new int[] { 1, 3, 5 }, 4);// {1,3,5,4},添加一个数据到数组
ArrayUtils.remove(new int[] { 1, 3, 5 }, 1);// {1,5},删除数组中某个位置上的数据
ArrayUtils.removeElement(new int[] { 1, 3, 5 }, 3);// {1,5},删除数组中某个对象(从正序开始搜索,删除第一个)
 

三、Arrays

// (1) 创建一维数组, 三种创建方式
        int[] iarr=new int[20];
        String[] sarr={"a","b","c","d"};
        double[] darr=new double[]{1.0,3.0,2.0};
        Integer[] Iarr={1,2,3,4};
        // (2) 创建二维数组: 维度固定与可变维度
        int[][] iiarr=new int[20][20];
        String[][] ssarr=new String[3][];
        ssarr[0]=new String[3];
        ssarr[1]=new String[4];
        ssarr[2]=new String[5];

        // (3) 数组赋初值
        Arrays.fill(iarr,1);
        // (3) 打印数组元素  Arrays.toString(arr)  [arr[0],arr[1]...arr[n]]
        System.out.println(Arrays.toString(darr));
        // (4) 数组排序
        Arrays.sort(darr);
        System.out.println(Arrays.toString(darr));
        // (5) 数组Array转换为集合Collection: 使用Arrays.asList方法转变为list,再初始化集合
        ArrayList<String> sal=new ArrayList<String>(Arrays.asList(sarr));
        HashSet<String> shs=new HashSet<>(Arrays.asList(sarr));
        LinkedList<String> sll=new LinkedList<>(Arrays.asList(sarr));
        //   注意: 集合需要使用Integer等类型,而不是int等基本类型 故int数组需要先转换为Integer类型
        ArrayList<Integer> ial=new ArrayList<>(Arrays.asList(ArrayUtils.toObject(iarr)));
        // (6) 集合转换为数组: 先定义数组arr,再Collection.toArray(arr)为数组赋值
        String[] sarr3=new String[sal.size()];
        sal.toArray(sarr3);
        // (7) 合并两个数组  ArrayUtils.addAll(arr1,arr2);
        // (8) 数组反序     ArrayUtils.reverse(sarr3);
        // (9) 移除元素      ArrayUtils.remove(sarr3,3);
        /*  Arrays类方法
           Arrays.toString(arr) 以字符串形式展示数组元素
           Arrays.asList(arr)   将数组转化为一个列表
           Arrays.fill(arr,val) 将数组中所有元素都赋值为val
           Arrays.sort(arr)     数组元素排序
           Arrays.equals(arr1,arr2)  判断两个数组(元素)是否相同
           Arrays.binarySearch(arr,target)  在数组中二分查找元素target
           Arrays.binarySearch(arr,begin,end,target)  在数组中从begin到end区间二分查找target
           Arrays.copyOf(arr,arr.length)   数组复制
         */
        /*  ArrayUtils类方法
            ArrayUtils.add(arr,val)   数组末尾位置添加元素
            ArrayUtils.add(arr,index,val)   数组指定位置处添加元素
            ArrayUtils.addAll(arr1,arr2)  两个数组元素相加;
            ArrayUtils.clone(arr1)  数组拷贝;
            ArrayUtils.reverse(arr1) 数组反转/逆序;
            ArrayUtils.contains(arr1,val) 数组中是否包含特定值;
            ArrayUtils.indexOf(arr1,val)  指定元素在数组中第一次出现位置;
            ArrayUtils.indexOf(arr1,val,start)  从start位置开始查找,指定元素在数组中第一次出现位置;
            ArrayUtils.lastIndexOf(arr1,val) 指定元素在数组中最后一次出现位置;
            ArrayUtils.lastIndexOf(arr1,val,start) 从start位置开始查找,指定元素在数组中最后一次出现位置;
            ArrayUtils.remove(arr,pos)  删除指定下标的元素;
            ArrayUtils.removeElement(arr,val)  删除数组中指定元素(第一次出现位置);
            ArrayUtils.subarray(arr1,start,end)  截取数组 左闭右开;
            // 基本数据类型数组转换为对应封装类型数组
            Integer[] arr_Integer=ArrayUtils.toObject(new int[]{1,2,3});
            // 包装数据类型数组转换为对应的基本数据类型数组
            int[] arr_int=ArrayUtils.toPrimitive(arr_Integer);
         */
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值