1.Javaä¸CollectionåCollectionsçåºå«
2.不要再重复造轮子了!这17个Java常用工具类,让生产力爆表!
3.用java程序编写使123 321逆序输出
4.跟着 Guava 学 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。