Java基础知识四

标签: 无 分类: 未分类 创建时间:2022-10-10 01:24:22 更新时间:2024-11-15 10:49:43

1.Collections排序

使用Collections.sort可以对list进行排序,指定排序的规则

1
2
3
4
5
6
7
8
9
10
List<JSONObject> siteList=new ArrayList<JSONObject>(re);
// 进行排序
Collections.sort(siteList,new Comparator<JSONObject>() {
@Override
public int compare(JSONObject j1,JSONObject j2){
String RecordDate1=j1.getString("RecordDate");
String RecordDate2=j2.getString("RecordDate");
return RecordDate1.compareTo(RecordDate2);
}
});

直接使用Lambda表达式进行了排序

1
2
3
4
5
6
7
8
dataResult.sort((a,b)->{
JSONObject a1=(JSONObject) a;
JSONObject b1=(JSONObject) b;
Integer siteNo1=a1.getInteger("SiteNo");
Integer siteNo2=b1.getInteger("SiteNo");

return siteNo1-siteNo2;
});
参考文章:
1.Java中Collections.sort()排序详解
2.Java使用Collections.sort()排序的示例详解
3.Java中如何比较两个字符串类型日期的大小
4.java中集合Collection转list对象
5.java中Collections.sort排序详解 compare(a,b)方法:根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数。equals(obj)方法:仅当指定的对象也是一个 Comparator,并且强行实施与此 Comparator 相同的排序时才返回 true。
6.jsonArray中按字段排序 这里直接使用了lambda表达式进行了排序
7.java 8 对JSONArray 按指定字段排序,升序和倒序,经典

2.线程池

我使用了 ExecutorService 创建了线程池,然后执行了 文件上传的任务,最后通过检查是否全部线程结束了,再进行下一步操作。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
private int NUM_THREADS=30;
public boolean uploadFolder(String filePath,String bizPath){
File dir=new File(filePath);
File[] fs = dir.listFiles(); //遍历path下的文件和目录,放在File数组中
if(fs.length>100){
NUM_THREADS=100;
}
boolean result=false;
// 类似于 list, 线程安全的
Vector<String> vector=new Vector<>();

try {
ExecutorService executorService= Executors.newFixedThreadPool(NUM_THREADS);
for(File f:fs){
executorService.submit(new Callable<String>() {
@Override
public String call() throws Exception {
String url=uploadMinio(f,bizPath);
log.info(url);
if(url!=null&&!url.isEmpty()){
vector.add(url);
}
return url;
}
});
}
executorService.shutdown();
// 每隔10秒钟检查是否执行完毕
while (!executorService.awaitTermination(10, TimeUnit.SECONDS)) {
log.info("文件上传中....");
}
if(vector.size()==fs.length){
log.info("全部文件上传成功");
result=true;
}else{
log.info("部分文件上传失败");
}
}catch (Exception e){
log.error("uploadFolder",e);
result=false;
}
return result;
}
参考文章:
【1】.线程池如何保证所有子线程运行完再执行主线程
【2】.ExecutorService多线程同步,待所有线程执行结束后主线程继续运行 这里用了 Future f : fuList 的方法。
【3】.ExecutorService——shutdown方法和awaitTermination方法 这里用了一个 while 循环检查线程池是否结束
【4】.Cannot resolve symbol ‘TimeUnit‘ 这里也是出现了无法导入 TimeUnit 的问题
【5】.JDK21无法导入TimeUnit类 升级idea版本
【6】.java 并发之awaitTermination的使用 当使用awaitTermination时,主线程会处于一种等待的状态,等待线程池中所有的线程都运行完毕后才继续运行。如果等待的时间超过指定的时间,但是线程池中的线程运行完毕,那么awaitTermination()返回true。如果等待的时间超过指定的时间,但是线程池中的线程未运行完毕,那么awaitTermination()返回false。如果等待时间没有超过指定时间,等待!
【7】.ExecutorService等待线程完成后优雅结束 1.等待现有线程完成执行可以通过使用awaitTermination()方法来实现。2.使用CountDownLatch。3.使用invokeAll()。4.使用ExecutorCompletionService。
【8】.java多线程-向线程传递参数的三种方法 1.通过构造函数进行传递;2.通过变量和方法传递数据;3.通过回调函数传递数据;
【9】.【并发编程】- 线程池使用方法awaitTermination监听关闭状态 方法awaitTermination(long timeout,TimeUnit unit)的作用是查看在指定的时间之间,线程池是否已经终止工作,就是最多等待多少时间后去判断线程池是否已经停止工作了。
【10】.ExecutorService——shutdown方法和awaitTermination方法 shutdown和awaitTermination为接口ExecutorService定义的两个方法,一般情况配合使用来关闭线程池。
【11】.java并发中ExecutorService的使用 submit() 和 invokeAll() 都会返回Future对象。
【12】.Java线程池:ExecutorService 的理解与使用 1.方法 execute(Runnable) 接收壹個 java.lang.Runnable 对象作为参数,并且以异步的方式执行它。2.方法 submit(Runnable) 同样接收壹個 Runnable 的实现作为参数,但是会返回壹個 Future 对象。这個 Future 对象可以用于判断 Runnable 是否结束执行。3.方法 submit(Callable) 和方法 submit(Runnable) 比较类似,但是区别则在于它们接收不同的参数类型。Callable 的实例与 Runnable 的实例很类似,但是 Callable 的 call() 方法可以返回壹個结果。方法 Runnable.run() 则不能返回结果。4.方法 invokeAny() 接收壹個包含 Callable 对象的集合作为参数。调用该方法不会返回 Future 对象,而是返回集合中某壹個 Callable 对象的结果,而且无法保证调用之后返回的结果是哪壹個 Callable,只知道它是这些 Callable 中壹個执行结束的 Callable 对象。如果壹個任务运行完毕或者抛出异常,方法会取消其它的 Callable 的执行。5.方法 invokeAll() 会调用存在于参数集合中的所有 Callable 对象,并且返回壹個包含 Future 对象的集合,你可以通过这個返回的集合来管理每個 Callable 的执行结果。需要注意的是,任务有可能因为异常而导致运行结束,所以它可能并不是真的成功运行了。但是我们没有办法通过 Future 对象来了解到这個差异。

3.接收文件数组

参考文章:
【1】.java上传MultipartFile数组 在Spring框架中,我们可以使用@RequestParam(“files”) MultipartFile[] files来接收上传的多个文件。
【2】.java入门006~springboot实现多文件的上传(java多文件的上传) MultipartFile[] uploadFiles, HttpServletRequest request

4.下载文件中文乱码

1
2
3
String fileName = gTable.entityInfo()+".xls";
String fileNameURL = URLEncoder.encode(fileName, "UTF-8");
response.setHeader("Content-disposition", "attachment;filename="+fileNameURL+";"+"filename*=utf-8''"+fileNameURL);
参考文章:
【1】.Java下载文件,中文文件名乱码问题解决
【2】.【文件下载】Java下载文件的几种方式 1.以流的方式下载;2.下载本地文件;3.下载网络文件;4.支持在线打开的方式;
【3】.下载文件时文件名乱码问题
小额赞助
本人提供免费与付费咨询服务,感谢您的支持!赞助请发邮件通知,方便公布您的善意!
**光 3.01 元
Sun 3.00 元
bibichuan 3.00 元
微信公众号
广告位
诚心邀请广大金主爸爸洽谈合作
每日一省
isNaN 和 Number.isNaN 函数的区别?

1.函数 isNaN 接收参数后,会尝试将这个参数转换为数值,任何不能被转换为数值的的值都会返回 true,因此非数字值传入也会返回 true ,会影响 NaN 的判断。

2.函数 Number.isNaN 会首先判断传入参数是否为数字,如果是数字再继续判断是否为 NaN ,不会进行数据类型的转换,这种方法对于 NaN 的判断更为准确。

每日二省
为什么0.1+0.2 ! == 0.3,如何让其相等?

一个直接的解决方法就是设置一个误差范围,通常称为“机器精度”。对JavaScript来说,这个值通常为2-52,在ES6中,提供了Number.EPSILON属性,而它的值就是2-52,只要判断0.1+0.2-0.3是否小于Number.EPSILON,如果小于,就可以判断为0.1+0.2 ===0.3。

每日三省
== 操作符的强制类型转换规则?

1.首先会判断两者类型是否**相同,**相同的话就比较两者的大小。

2.类型不相同的话,就会进行类型转换。

3.会先判断是否在对比 null 和 undefined,是的话就会返回 true。

4.判断两者类型是否为 string 和 number,是的话就会将字符串转换为 number。

5.判断其中一方是否为 boolean,是的话就会把 boolean 转为 number 再进行判断。

6.判断其中一方是否为 object 且另一方为 string、number 或者 symbol,是的话就会把 object 转为原始类型再进行判断。

每日英语
Happiness is time precipitation, smile is the lonely sad.
幸福是年华的沉淀,微笑是寂寞的悲伤。