欢迎来到皮皮网官网

【linux 进程调度 源码】【云顶源码】【移植源码】Collections 源码 java

时间:2024-12-28 11:55:14 来源:中值滤波python源码

1.Java中Collection和Collections的区别
2.不要再重复造轮子了!这17个Java常用工具类,让生产力爆表!
3.用java程序编写使123 321逆序输出
4.跟着 Guava 学 Java 之 集合工具类

Collections 源码 java

Java中Collection和Collections的区别

       ã€€ã€€1. Collection是集合类的一个顶级接口,其直接继承接口有List与Set

       ã€€ã€€è€ŒCollections则是集合类的一个工具类/帮助类,其中提供了一系列静态方法,用于对集合中元素进行排序、搜索以及线程安全等各种操作。

       ã€€ã€€

       ã€€ã€€1) 排序(Sort)

       ã€€ã€€ä½¿ç”¨sort方法可以根据元素的自然顺序 对指定列表按升序进行排序。列表中的所有元素都必须实现 Comparable 接口。此列表内的所有元素都必须是使用指定比较器可相互比较的

       double array[] = { , , , , };

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       Collections.sort(list);

       for (int i = 0; i < array.length; i++) {

       System.out.println(li.get(i));

       }

       //结果:,,,,

       ã€€ã€€2) 混排(Shuffling)

       ã€€ã€€æ··æŽ’算法所做的正好与 sort 相反: 打乱在一个 List 中可能有的任何排列的踪迹。也就是说,基于随机源的输入重排该 List, 这样的排列具有相同的可能性。这个算法在实现一个碰运气的游戏中是非常有用的。例如,可用来混排代表一副牌的 Card 对象的一个 List 。另外,在生成测试案例时,也是十分有用的。

       Collections.Shuffling(list)

       double array[] = { , , , , };

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       Collections.shuffle(list);

       for (int i = 0; i < array.length; i++) {

       System.out.println(li.get(i));

       }

       //结果:,,,,

       ã€€ã€€3) 反转(Reverse)

       ä½¿ç”¨Reverse方法可以根据元素的自然顺序 对指定列表按降序进行排序。

       Collections.reverse(list)

       double array[] = { , , , , };

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       Collections. reverse (list);

       for (int i = 0; i < array.length; i++) {

       System.out.println(li.get(i));

       }

       //结果:,,,,

       ã€€ã€€4) 替换所以的元素(Fill)

       ã€€ã€€ä½¿ç”¨æŒ‡å®šå…ƒç´ æ›¿æ¢æŒ‡å®šåˆ—表中的所有元素。

       String str[] = { "dd","aa","bb","cc","ee"};

       for(int j=0;j<str.length;j++){

       li.add(new String(str[j]));

       }

       Collections.fill(li,"aaa");

       for (int i = 0; i < li.size(); i++) {

       System.out.println("list[" + i + "]=" + li.get(i));

       }

       //结果:aaa,aaa,aaa,aaa,aaa

       ã€€ã€€5) 拷贝(Copy)

       ã€€ã€€ç”¨ä¸¤ä¸ªå‚数,一个目标 List 和一个源 List, 将源的元素拷贝到目标,并覆盖内容。目标 List 至少与源一样长。如果更长,则在目标 List 中的剩余元素不受影响。

       Collections.copy(list,li): 后面一个参数是目标列表 ,前一个是源列表

       double array[] = { , , , , };

       List list = new ArrayList();

       List li = new ArrayList();

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       double arr[] = { ,};

       String str[] = { "dd","aa","bb","cc","ee"};

       for(int j=0;j<arr.length;j++){

       li.add(new Double(arr[j]));

       }

       Collections.copy(list,li);

       for (int i = 0; i <list.size(); i++) {

       System.out.println("list[" + i + "]=" + list.get(i));

       }

       //结果:,,,,

       ã€€ã€€6) 返回Collections中最小元素(min)

       ã€€ã€€æ ¹æ®æŒ‡å®šæ¯”较器产生的顺序,返回给定 collection 的最小元素。collection 中的所有元素都必须是通过指定比较器可相互比较的

       Collections.min(list)

       double array[] = { , , , , };

       List list = new ArrayList();

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       Collections.min(list);

       for (int i = 0; i <list.size(); i++) {

       System.out.println("list[" + i + "]=" + list.get(i));

       }

       //结果:

       ã€€ã€€7) 返回Collections中最小元素(max)

       ã€€ã€€æ ¹æ®æŒ‡å®šæ¯”较器产生的顺序,返回给定 collection 的最大元素。collection 中的所有元素都必须是通过指定比较器可相互比较的

       Collections.max(list)

       double array[] = { , , , , };

       List list = new ArrayList();

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       Collections.max(list);

       for (int i = 0; i <list.size(); i++) {

       System.out.println("list[" + i + "]=" + list.get(i));

       }

       //结果:

       ã€€ã€€8) lastIndexOfSubList

       ã€€ã€€è¿”回指定源列表中最后一次出现指定目标列表的起始位置

       int count = Collections.lastIndexOfSubList(list,li);

       double array[] = { , , , , };

       List list = new ArrayList();

       List li = new ArrayList();

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       double arr[] = { };

       String str[] = { "dd","aa","bb","cc","ee"};

       for(int j=0;j<arr.length;j++){

       li.add(new Double(arr[j]));

       }

       Int locations = Collections. lastIndexOfSubList (list,li);

       System.out.println(“===”+ locations);

       //结果 3

       ã€€ã€€9) IndexOfSubList

       ã€€ã€€è¿”回指定源列表中第一次出现指定目标列表的起始位置

       int count = Collections.indexOfSubList(list,li);

       double array[] = { , , , , };

       List list = new ArrayList();

       List li = new ArrayList();

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       double arr[] = { };

       String str[] = { "dd","aa","bb","cc","ee"};

       for(int j=0;j<arr.length;j++){

       li.add(new Double(arr[j]));

       }

       Int locations = Collections.indexOfSubList(list,li);

       System.out.println(“===”+ locations);

       //结果 1

       ã€€ã€€) Rotate

       ã€€ã€€æ ¹æ®æŒ‡å®šçš„距离循环移动指定列表中的元素

       Collections.rotate(list,-1);

       å¦‚果是负数,则正向移动,正数则方向移动

       double array[] = { , , , , };

       List list = new ArrayList();

       for (int i = 0; i < array.length; i++) {

       list.add(new Double(array[i]));

       }

       Collections.rotate(list,-1);

       for (int i = 0; i <list.size(); i++) {

       System.out.println("list[" + i + "]=" + list.get(i));

       }

       //结果:,,,,

不要再重复造轮子了!这个Java常用工具类,让生产力爆表!linux 进程调度 源码

       在Java编程的世界里,隐藏着许多实用的工具类,就像轮子一样,能大大提升我们的开发效率。今天,我将分享个在日常工作中不可或缺的Java工具,它们分布在Collections、CollectionUtils、Lists、Objects、StringUtils、Assert、IOUtils、MDC、ClassUtils、BeanUtils、云顶源码ReflectionUtils、BaseUtils、StandardCharsets、DigestUtils、SerializationUtils和HttpStatus等类别中。

       1. Collections

       从java.util.Collections开始,它提供了排序、查找最大值/最小值、线程安全集合转换以及创建/返回空集合等功能。比如,Collections.sort()可以轻松对集合进行排序。

       2. CollectionUtils

       除了Collections,org.apache.commons.collections的CollectionUtils提供了集合判空、交集并集等操作,简化了复杂操作。

       Lists

       引入guava或com.google.common.collect的Lists工具,能快速创建空集合、初始化元素、做笛卡尔积、分页处理,甚至转换流处理。移植源码

       Objects

       Objects工具处理对象判空、空指针异常、相等判断和hashCode计算,让对象操作更加便捷。

       StringUtils

       Apache Commons Lang的StringUtils提供了丰富的字符串操作,如判空、分割、判断纯数字、拼接字符串等。

       Assert

       Spring的Assert类提供了断言工具,用于检查参数、集合和条件,增强代码的健壮性。

       IOUtils

       Apache Commons IO的IOUtils简化了文件读写、拷贝和内容到字节数组的操作,避免了繁琐的异常处理。

       其他工具

       MDC:线程安全的诊断日志容器,用于传递请求信息。

       ClassUtils:获取类信息、判断内部类和代理对象等。

       BeanUtils:对象属性拷贝、点对点源码实例化和方法查找等。

       ReflectionUtils:反射操作,如获取方法、字段和执行方法。

       BaseUtils:提供数据加密和解密。

       StandardCharsets:处理字符编码转换。

       DigestUtils:数据加密,如md5和sha。

       SerializationUtils:序列化和反序列化工具。

       HttpStatus:预定义的HTTP状态码枚举。

       这些工具的合理运用,能让你的代码更加简洁高效。如果你在工作中遇到类似场景,不妨尝试使用它们。感谢你的阅读,如果觉得有帮助,欢迎点赞支持。

用java程序编写使 逆序输出

       写了一个小程序如下:

       package com.baidu.test;

       import java.util.ArrayList;

       import java.util.Collections;

       import java.util.List;

       public class test {

        public static void main(String[] args) {

        List<Integer> numList = getNumList();

        System.out.println("顺序:"+numList);

        Collections.reverse(numList);

        System.out.println("倒叙:"+numList);

        }

       public static List<Integer> getNumList(){

        List<Integer> numList = new ArrayList<Integer>();

        int i =1;

        while(i<4){

        numList.add(i);

        i++;

        }

        return numList;

        }

       }

       一起共同学习,共同进步

跟着 Guava 学 Java 之 集合工具类

       跟着 Guava 学 Java 之 集合工具类

       先来回顾一下 JDK 的Collections,java.util.Collections 提供了一系列静态方法,能更方便地操作各种集合。libtorrent源码

       Guava 沿着 Collections 的思路,提供了更多工具方法,适用于所有集合的静态方法,使之成为更强大的集合工具类。

       Guava 提供的集合工具不止是对 Collections 的扩展和增强,还包括了其他集合类型的工具类。我们把工具类与特定集合接口的对应关系归纳如下:

       静态构造器

       在 JDK 7 之前,构造新的范型集合时要重复声明范型。JDK 7 以后,因为有了钻石操作符(Diamond Operator),可以自动推断参数类型,所以省事儿。用 Guava 可以这样写,你可能觉得这没什么牛的,跟 JDK7 以后没啥区别,人家还是原生的。

       是的,没错,尤其是你用 JDK 9 以后的版本,JDK 从功能上跟 Guava 就基本一样了。比如带元素初始化:

       上面这行是利用了 Guava 的 Lists,JDK 7 没有比这行代码更好的方法,但 JDK9 人家有,比如:

       所以我们说,跟着 Guava 学 Java,随着版本的迭代,你觉得哪个好用,哪个适合你用哪个,重要的是把这里面的知识点讲清楚。

       我们再来看个例子:创建集合时指定初始化集合大小。

       你可能说,哥们,这 JDK 有啊,这不多此一举吗?是的,作用一样,但 Guava 的做法,可以利用工厂方法名称,提高代码的可读性,你不觉得虽然名字长了,但可读性比 JDK 那个好很多吗?代码不止是写给机器的,也是写给人看的,不能指望团队里所有人都是强者。代码可读性越高,越健壮越容易维护。

       Iterables 类包含了一系列的静态方法,来操作或返回 Iterable 对象。看几个常用的方法:

       对于上面这些常用的方法,可能你觉得使用 JDK8 以后的 Stream 一行也都搞定了,是的,还是那句话,Guava 是个工具,尤其在 JDK8 之前用来增强 API 很好用,但工具不止一个,Java 也在发展,有些东西就变成可选项了,看你的需求和习惯使用。Guava 也有对应的流式风格的工具类,比如 FluentIterable。

       Lists 除了静态工厂方法和函数式编程方法,为 List 类型的对象提供了若干工具方法。

       Sets 工具类包含了若干好用的方法。Sets 为我们提供了很多标准的集合运算(Set-Theoretic)方法,比如我们常用的集合的 “交、并、差集” 以及对称差集。

       注意返回的都是 SetView,它可以:

       笛卡儿积

       Maps 有若干很酷的方法。

       uniqueIndex 有一组对象,它们在某个属性上分别有独一无二的值,而我们希望能够按照这个属性值查找对象。

       比方说,我们有一堆字符串,这些字符串的长度都是独一无二的,而我们希望能够按照特定长度查找字符串:

       你可以想到了,我们常见的场景还有把一个 List 的对象集合转成 Map,map 的 key 通常是对象的 ID。用 uniqueIndex 方法可以这样写:

       或者你用 Java8 的 Stream 也一样:

       注意:key 要是唯一的,否则会报错。

       difference 找不同,对比两个 map,告诉你哪里不同。

       Maps.difference(Map, Map)用来比较两个 Map 以获取所有不同点。该方法返回 MapDifference 对象。

       下面是 MapDifference 的一些方法:

       看到这个你能想到什么?我举个场景:审计日志或操作日志,谁什么时间做了什么,数据从旧值变更为新值,这些要记录下来。是不是可以用上面这个 Maps 的方法?适合不适合你自己决定,这里是提供个思路。

       “下面要介绍的工具类都是新集合类型的工具类,比如 MultiSet 和 MultiMap 之类的,有关这些 Guava 的新集合类型,在之前的文章《跟着 Guava 学 Java 之 新集合类型》都有介绍,有不清楚的可以再翻回去看一看。”

       标准的 Collection 操作会忽略 Multiset 重复元素的个数,而只关心元素是否存在于 Multiset 中,如 containsAll 方法。为此,Multisets 提供了若干方法,以顾及 Multiset 元素的重复性:

       举例来说:

       Multisets 中的其他工具方法还包括:

       Multimaps.index “Multimaps 的 index 方法跟前面介绍的 Maps.uniqueIndex 方法是兄弟方法。与 uniqueIndex 方法相反,通常针对的场景是:有一组对象,它们有共同的特定属性,我们希望按照这个属性的值查询对象,但属性值不一定是独一无二的。比方说,我们想把字符串按长度分组:”

       invertFrom Multimap 可以把多个键映射到同一个值,也可以把一个键映射到多个值,反转 Multimap 也会很有用。Guava 提供了 invertFrom(Multimap toInvert, Multimap dest)做这个操作,并且你可以自由选择反转后的 Multimap 实现。

       forMap 想在 Map 对象上使用 Multimap 的方法吗?forMap(Map)把 Map 包装成 SetMultimap。这个方法特别有用,例如,与 Multimaps.invertFrom 结合使用,可以把多对一的 Map 反转为一对多的 Multimap。

copyright © 2016 powered by 皮皮网   sitemap