![](https://img-blog.csdnimg.cn/abee740440c94d8d95001a22b70c019c.png?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java
文章平均质量分 55
Java
瑟 王
失业中
展开
-
Java8 Stream(12)Collectors.groupingBy 分组统计详解
1 List 转 Map1.1 使用 groupingBy 分组根据部门分组按照自定义Key分组多级分组根据部门分组,求ID的List根据部门分组,Count人数根据部门分组,求Sex的Set根据部门分组,求Sex的去重个数 它接受两个参数:和。其中1.2 使用 partitioningBy 分区1.3 使用 toMapList 转 MapList 转 Map2 求最大值、最小值、平均值、总和2.1 不分组,直原创 2023-07-26 00:14:54 · 8383 阅读 · 1 评论 -
趣学算法2 哥德巴赫猜想
哥德巴赫1742年给欧拉的信中哥德巴赫提出了以下猜想:*任一大于2的偶数都可写成两个质数之和*。但是哥德巴赫自己无法证明它哥德巴赫1742年给欧拉的信中哥德巴赫提出了以下猜想:任一大于2的偶数都可写成两个质数之和。但是哥德巴赫自己无法证明它,于是就写信请教赫赫有名的大数学家欧拉帮忙证明,但是一直到死,欧拉也无法证明。2. 判断一个数是否为质数质数定义为在大于1的自然数中,除了1和它本身以外不再有其他因数,比如2 3 5 7 11import mathdef isP...原创 2018-09-17 14:47:01 · 1101 阅读 · 0 评论 -
趣学算法1 斐波那契
斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34斐波那契数列:1, 1, 2, 3, 5, 8, 13, 21, 34, …在数学上,斐波纳契数列以如下被以递推的方法定义:F(1)=1,F(2)=1, F(n)=F(n-1)+F(n-2)(n>=3,n∈N*) 下面写函数计算第n个数2. 递归方法-效率低用递归,是爆炸增量函数,效率超级低,算第100个数,等好久基本算不出来,写程序要避免使用递归def...原创 2018-09-17 13:22:22 · 227 阅读 · 0 评论 -
Java设计模式单例 饿汉式 懒汉式
我在软件外包公司,现在甲方项目结束了,我们也没事做了。公司要给我们找新的客户项目,得面试才能进的新的项目组。听说新项目的面试官问的特别多特别细,唉,没想到入职一年了还得内部面试。刷新了一波Boss上的简历,不是中软、软通就是华为OD外包,不想去外包公司了。原创 2022-08-19 11:38:33 · 138 阅读 · 0 评论 -
Java IO(6) 字节流与字符流转换 InputStreamReader和OutputStreamWriter实现文件拷贝
InputStreamReader 是字节流通向字符流的桥梁:它使用指定的charset 读取字节并将其解码为字符。它使用的字符集可以由名称指定或显式给定,或者可以接受平台默认的字符集。OutputStreamWriter 是字符流通向字节流的桥梁:可使用指定的 charset 将要写入流中的字符编码成字节。它的作用的就是,将字符串按照指定的编码表转成字节,在使用字节流将这些字节写出去。@Testpublic void testFileReader() { String filePath =原创 2022-05-01 09:23:43 · 555 阅读 · 1 评论 -
Java IO(5) 字节流 BufferedInputStream和BufferedOutputStream实现文件拷贝
BufferedInputStream方法:BufferedOutputStream方法:@Test@DisplayName("每次读取1024个字节")public void testFileReader() { String inputImgPath = "src/main/resources/static/test1.jpg"; String outputImgPath = "src/main/resources/static/test1_copy.jpg"; tr原创 2022-04-30 14:10:51 · 1135 阅读 · 9 评论 -
Java IO(4) 字符流 BufferedReader和BufferedWriter实现纯文本文件拷贝
BufferedReader和BufferedWriter比较适合处理文本文件,如果是二进制文件,有可能会有错误。一、BufferedReader从字符输入流读取文本,缓冲字符,以提供字符,数组和行的高效读取。可以指定缓冲区大小,或者可以使用默认大小。 默认值足够大,可用于大多数用途。通常,由读取器做出的每个读取请求将引起对底层字符或字节流的相应读取请求。 因此,建议将BufferedReader包装在其read()操作可能昂贵的读取器上,例如FileReaders和InputStreamReade原创 2022-04-30 13:40:14 · 1269 阅读 · 0 评论 -
Java IO(3) 字符流 FileReader和FileWriter实现纯文本文件拷贝
FileWriter(File file) 如果被写文件存在,写数据会覆盖原内容FileWriter(File file, boolean append) append=true,会在原内容后面追加新写的内容1 每次读取一个字符@Test@DisplayName("每次读取一个字符")public void testFileReader() { String filePath = "src/main/resources/json/student_array.json"; Str.原创 2022-04-29 15:18:33 · 644 阅读 · 0 评论 -
Java IO(2) 字节流 FileInputStream和FileOutputStream实现文件拷贝
一、FileInputStreamFileInputStream可以按照字节的单位处理文件。1 构造方法2 方法二、FileOutputStream1 构造方法2 方法原创 2022-04-29 14:29:33 · 1006 阅读 · 1 评论 -
Java IO(1) File类常用方法
Java IO File类常用方法一、File类1 new File对象1.1 new 目录的File对象1.2 new 文件的File对象2 判断目录或文件是否存在3 创建目录3.1 创建单层目录3.2 创建多层目录4 创建文件5 获取目录或文件的属性6 遍历目录6.1 遍历某目录下的目录和文件的Name6.2 遍历某目录下的目录和文件的File对象6.3 根据过滤条件遍历某目录7 删除目录或文件一、File类Java中的File类是很常用的,它可以表示文件也可以表示文件夹(目录)。1 new Fi原创 2022-04-29 13:47:23 · 531 阅读 · 0 评论 -
Java8 CompletableFuture(7) CompletableFuture allOf 获取所有线程结果
一、CompletableFuture allOf的优点场景:当有一批任务交给线程池执行,我们需要获取所有线程的返回结果。Future的get()时阻塞的,如果循环get()每一个线程的结果,一个线程会卡住后面所有线程CompletionService的take().get()虽然不会因为某个线程阻塞后面的线程,但是功能不丰富CompletableFuture提供的功能丰富,使用简单,代码优雅二、测试案例一串数字1, 2, 3, 4, 5, 6, 7, 8, 9, 10开启线程,执行乘以原创 2021-05-07 17:12:58 · 28867 阅读 · 3 评论 -
Java8 CompletableFuture(6) thenCompose和thenCombine的区别
CompletableFuture exceptionally whenComplete handle原创 2021-05-07 14:36:55 · 15326 阅读 · 8 评论 -
Java8 CompletableFuture(5)异常处理 handle
Java8 CompletableFuture handle一、handle的作用和特点1. handle的特点2. handle和thenApply的区别3. handle和whenComplete的区别二、测试案例一、handle的作用和特点1. handle的特点在写代码时,我们常用try…catch…finally这样的代码块处理异常。而handle就像finally,不论正常返回还是出异常都会进入handle,类似whenComplete。handle()一般接收new BiFuncti原创 2021-05-07 14:01:11 · 3644 阅读 · 0 评论 -
Java8 CompletableFuture(4)异常处理 whenComplete
一、whenComplete的作用当CompletableFuture的任务不论是正常完成还是出现异常它都会调用whenComplete这回调函数。正常完成:whenComplete返回结果和上级任务一致,异常为null;出现异常:whenComplete返回结果为null,异常为上级任务的异常;即调用get()时,正常完成时就获取到结果,出现异常时就会抛出异常,需要你处理该异常。二、测试案例1. 只用whenCompletepublic class Thread02_WhenComple原创 2021-05-07 07:58:36 · 20056 阅读 · 0 评论 -
Java8 CompletableFuture(3)异常处理 exceptionally
Java8 CompletableFuture exceptionally一、前言二、测试案例一、前言在写代码时,经常需要对异常进行处理,最常用的就是try catch。在用CompletableFuture编写多线程时,如果需要处理异常,可以用exceptionally,它的作用相当于catch。exceptionally的特点:当出现异常时,会触发回调方法exceptionallyexceptionally中可指定默认返回结果,如果出现异常,则返回默认的返回结果二、测试案例publi原创 2021-05-07 07:25:07 · 17304 阅读 · 4 评论 -
Java8 CompletableFuture(2)回调函数 thenApply thenAccept thenRun
CompletableFuture 串行回调函数 thenApply thenAccept thenRun thenCompose一、前言二、串行的回调函数1. thenApply 转换结果2. thenAccept 消费结果3. thenRun 任务完成后触发的回调4. thenCompose5. thenApply,thenAccept,thenRun,thenCompose的区别一、前言在上一篇介绍了CompletableFuture的创建新线程,本篇博客讲解下串行的回调函数。二、串行的回调函数原创 2021-04-22 18:46:03 · 11534 阅读 · 5 评论 -
Java8 CompletableFuture(1)创建线程 supplyAsync runAsync
CompletableFuture 串行回调函数一、前言二、CompletableFuture创建新线程1. 创建测试用的业务类2. supplyAsync(有返回值)3. runAsync(无返回值)三、串行的回调函数1. thenApply 转换结果2. thenAccept 消费结果3. thenRun 任务完成后触发的回调4. thenCompose5. thenApply,thenAccept,thenRun,thenCompose的区别一、前言Java8推出了CompletableFutur原创 2021-04-22 18:19:29 · 3556 阅读 · 0 评论 -
Java8 Stream(11)List转Map
一、前言开发中,List转Map是非常常见的操作,例如:List<T> 转 Map<String, T>List<T> 转 Map<String, List<T>>List<Map<String, Object>> 转 Map<String, List<Map<String, Object>>>先造点数据:pigs.add(new Pig(1, "猪爸爸", 31, "M.原创 2021-05-06 17:07:59 · 35081 阅读 · 4 评论 -
Java8 Stream(10)Collectors groupingBy partitioningBy 案例详解
Java8 Stream(11)Collectors 案例详解一、获得对象中某1个属性集合1. toList 获取id的List集合2. toSet 获取gender的Set集合二、List 转 Map1. toMap 将List的值转成 id -> name的Map2. 解决key重复后异常三、求和 最大值 最小值 平均值1. 求age最大的对象2. 求age的平局值3. 求age总和4. 求统计信息四、joining 拼接字符串五、groupingBy 分组1. 一级分组2. 一级分组,且统计co原创 2021-04-30 18:17:53 · 1485 阅读 · 2 评论 -
Java8 Stream(9)List集合查找 findFirst、findAny、anyMatch、allMatch、noneMatch
在开发中,经常要判断集合中是否有指定的值,对于在集合中查询匹配数据,可以用到findFirst、findAny、anyMatch、allMatch和noneMatch这些方法。先造点数据pigs.add(new Pig(1, "猪爸爸", 31, "M", false));pigs.add(new Pig(2, "猪妈妈", 28, "F", true));pigs.add(new Pig(3, "乔治", 2, "M", false));pigs.add(new Pig(4, "佩奇", 5,原创 2021-04-30 10:26:06 · 26991 阅读 · 1 评论 -
Java8 Stream(8)List集合统计 求和 最大值 最小值 平均值
对集合数据的统计,是开发中常用的功能,掌握好Java Stream提供的方法,避免自己写代码统计,可以提高工作效率。先造点数据:pigs.add(new Pig(1, "猪爸爸", 31, "M", false));pigs.add(new Pig(2, "猪妈妈", 28, "F", true));pigs.add(new Pig(3, "乔治", 2, "M", false));pigs.add(new Pig(4, "佩奇", 5, "F", false));一、统计个数用Stream原创 2021-04-30 07:05:22 · 22952 阅读 · 2 评论 -
Java8 Stream(7)List集合转换 map flatMap 区别
一、映射 mapmap是映射的意思,可以理解把数据1对1的转换。map方法定义如下<R> Stream<R> map(Function<? super T, ? extends R> mapper);Function<? super T, ? extends R> mapper表示一个函数,输入类型是T,输出类型是R。相当于把Stream流中每一个元素从T类型转换成R类型。1. 造点数据pigs.add(new Pig(1, "猪爸爸", 31原创 2021-04-29 18:29:43 · 1409 阅读 · 1 评论 -
Java8 Stream(6)List集合排序 多字段排序 Null值排序
一、单字段排序先造点数据pigs.add(new Pig(1, "猪爸爸", 31, "M", false));pigs.add(new Pig(2, "猪妈妈", 28, "F", true));pigs.add(new Pig(3, "乔治", 2, "M", false));pigs.add(new Pig(4, "佩奇", 5, "F", false));按照id升序pigs.sort(comparing(Pig::getId));按照id降序pigs.sort(compari原创 2021-04-29 16:00:43 · 8530 阅读 · 3 评论 -
Java8 Stream(5)List集合去重 distinct 和 toSet
一、distinct 去重Stream流的distinct()方法可以轻松实现去重。String[] codes = {"D", "A", "B", "A", "B","C"};List<String> codeList = new ArrayList<>(Arrays.asList(codes)) ;//distinctcodeList.stream() .distinct() .forEach(System.out::println);原创 2021-04-29 14:34:46 · 3157 阅读 · 0 评论 -
Java8 Stream(4)List集合过滤 filter 和 limit
一、过滤filterfilter似乎Stream中最常用的功能,在Java8之前,得在for循环中添加条件判断来过滤数据,非常难看。1. 先造点测试数据pigs.add(new Pig(1, "猪爸爸", 31, "M", false));pigs.add(new Pig(2, "猪妈妈", 28, "F", true));pigs.add(new Pig(3, "乔治", 2, "M", false));pigs.add(new Pig(4, "佩奇", 5, "F", false));2原创 2021-04-29 14:09:46 · 3870 阅读 · 0 评论 -
Java8 Stream(3)遍历 Map
一、Java8之前遍历Map的方式为啥要先介绍Java8之前的方式呢?因为没有对比,就没有伤害。1. 最常用的方式:遍历entrySet//最常见的用法,一般在键值对都需要使用for (Map.Entry<String, Object> entry : map1.entrySet()){ System.out.println(entry.getKey() + " : " + entry.getValue());}2. 在for循环中遍历key或者values一般适用于原创 2021-04-29 11:13:19 · 9932 阅读 · 1 评论 -
Java8 Stream(2)遍历 List
一、Java8之前遍历List方式1. Iterator迭代器Iterator<String> iterator = codeList.iterator();while (iterator.hasNext()){ System.out.println(iterator.next());}2. for循环for (int i = 0; i < codeList.size(); i++){ System.out.println(codeList.get(i));原创 2021-04-29 10:21:33 · 5634 阅读 · 0 评论 -
Java8 Stream(1)创建Stream
Java8 Stream(2)创建Stream一、什么是Stream二、创建Stream的方式1. 使用Stream静态方法创建Stream2. 通过Collection子类获取Stream三、 注意:流只能使用一次四、并行流五、总结一、什么是Stream集合是Java最最常用的API,我们代码里到处都有List、Map和Set等。而Stream可以看成遍历数据集的高级Iterator(迭代器)。Stream的语法优美,性能也还可以,是Java程序员必须要掌握的。二、创建Stream的方式创建S原创 2021-04-28 22:34:01 · 408 阅读 · 1 评论 -
Java8 Stream 详细总结目录
Java8 Stream(2)创建StreamJava8 Stream(3)遍历 ListJava8 Stream(4)遍历 MapJava8 Stream(5)List集合过滤 filter 和 limitJava8 Stream(6)List集合去重 distinct 和 toSetJava8 Stream(7)List集合排序 多字段排序 Null值排序Java8 Stream(8)List集合转换 map flatMap 区别Java8 Stream(9)List集合统计 求和 最大值原创 2021-04-30 22:26:12 · 835 阅读 · 2 评论 -
Java多线程(十四) Java8 newWorkStealingPool 线程池
一、newWorkStealingPool是什么?newWorkStealingPool简单翻译是任务窃取线程池。newWorkStealingPool 是Java8添加的线程池。和别的4种不同,它用的是ForkJoinPool。使用ForkJoinPool的好处是,把1个任务拆分成多个“小任务”,把这些“小任务”分发到多个线程上执行。这些“小任务”都执行完成后,再将结果合并。之前的线程池中,多个线程共有一个阻塞队列,而newWorkStealingPool 中每一个线程都有一个自己的队列。当线程原创 2021-04-21 07:08:50 · 4845 阅读 · 0 评论 -
Java多线程(十三) Java创建线程池,参数详解
一、前言昨天下班后和老婆一起去吃烧烤,老婆一直抱怨工作压力大,在公司快2年也没涨薪,平时给的绩效都是C。所以到明年肯定还是不涨薪,感觉上班非常烦躁。其实她公司福利还可以,就说一直被打压下去,感觉没脸待了。毕竟30+的女同志,在IT行业不容易,她公司加薪都给男的程序员了。聊到最后她说:如果我收入高了,她也轻松点就在这家公司混了,不去考虑跳槽了。今天中午又告诉我之前上一家的同事现在跳槽了几家,现在跳到京东,年薪可高了,比我高很多。也怪我没本事,让老婆有这么大的职场焦虑,她还是个孕妇,每天照顾大宝都原创 2021-04-20 16:50:46 · 1357 阅读 · 3 评论 -
Java多线程(十二) Java中sleep和yield的区别
一、前言昨天大学时宿舍的舍长突然联系,说已经回到大学母校了,说是看望老师。提到以后有时间大家一起回母校聚一聚。时光荏苒,光阴似箭。我已人到中年,这些年我总会偶尔想起我的一位大学舍友。亮仔,大家都这么叫他,他在我对面的床,个子不高,比较瘦,脸很白,再配上天然的卷发。毕业后,没怎么联系过,有一天看到他QQ发了说说,大概是得了什么病,他自己也很奇怪。我问他怎么了,他只是简单的说得了肠道上的病,已经躺床上好久了。后来我也没问过,突然有一天,宿舍里和亮仔同乡的舍友发消息说亮仔已经走了。很惊讶这么突然,原创 2021-04-15 15:49:46 · 752 阅读 · 0 评论 -
Java多线程(十): FutureTask CompletableFuture详解
Java多线程:FutureTask CompletableFuture1. Runnable与Callable2. Future接口和FutureTask3. ExecutorService几种线程池4. 使用Callable+FutureTask获取执行结果5. CompletableFuture5.1 CompletableFuture中4个异步执行任务静态方法5.2 组合方法1. Run...原创 2019-02-14 17:26:30 · 2406 阅读 · 0 评论 -
Java多线程(九) 生产者/消费者模式实现
生产者/消费者模式实现1. 一个生产者和一个消费者:操作值1.1 公共值1.2 生产者1.3 消费者1.4 生产者线程1.5 消费者线程1.6 Test1.7 运行结果1. 一个生产者和一个消费者:操作值1.1 公共值public class ValueObject { public static String value = "";}1.2 生产者public class ...原创 2018-11-09 15:40:06 · 151 阅读 · 0 评论 -
Java多线程(八) 使用Condition实现等待/通知
使用Condition实现等待/通知1. 使用Condition1.1 MyService1.2 ThreadA1.3 Test1.4 运行结果1.5 方法对比2. 使用多个Condition实现通知部分线程2.1 MyService2.2 ThreadA2.3 ThreadB2.4 Test2.5 运行结果1. 使用Condition在使用notify()/notifyAll()方法进行通知...原创 2018-11-07 16:12:17 · 229 阅读 · 0 评论 -
Java多线程(七) 使用ReentrantLock实现同步
1. 测试11.1 MyServiceimport java.util.concurrent.locks.Lock;import java.util.concurrent.locks.ReentrantLock;public class MyService { private Lock lock = new ReentrantLock(); public void te...原创 2018-11-07 11:45:33 · 209 阅读 · 0 评论 -
Java多线程(六) wait/notify
1.wait()wait()的作用是使当前执行代码的线程进行等待, 知道接到通知(notify)或者中断为止wait()是Object类的方法当线程处于wait,调用interrupt()会出现InterruptedException在调用wait()之前,线程必须获得该对象的对象级别锁在调用wait()之后,线程释放锁wait(long),等待超过这个时间自动唤醒2.notif...原创 2018-11-01 17:04:46 · 136 阅读 · 0 评论 -
Java多线程(五) 静态同步synchronized方法与synchronized(class)代码块
静态同步synchronized方法与synchronized(class)代码块1. 静态同步synchronized方法1.1 Service1.2 ThreadA1.3 ThreadB1.4 ThreadC1.5 Test1.6 运行结果2. synchronized(class)代码块2.1 修改Service2.2 修改Test2.3 运行结果1. 静态同步synchronized方法...原创 2018-11-08 15:57:42 · 362 阅读 · 0 评论 -
Java多线程(四) synchronized(非this对象)同步语句块
synchronized(非this对象)同步语句块1. 将任意对象作为对象的监视器1.1 在多个线程持有“对象监视器”为同一对象的前提下,同一时间只有一个线程可以执行synchronized(非this对象)同步代码块的代码。1.1.1 Service1.1.2 ThreadA1.1.3 ThreadB1.1.4 Test1.1.5 运行结果1.2 验证如果多个线程持有“对象监视器”不是同一对象...原创 2018-11-08 14:47:17 · 1065 阅读 · 0 评论 -
Java多线程(三) synchronized(this)同步语句块
synchronized (this)同步语句块1. 一半异步,一半同步1.1 Task1.2 ThreadA1.3 ThreadB1.4 Test1.5 运行结果2. synchronized代码块间的同步性2.1 ObjectService2.2 ThreadA2.3 ThreadB2.4 ThreadC2.5 Test2.6 运行结果1. 一半异步,一半同步不在synchronized块...原创 2018-11-08 11:39:40 · 664 阅读 · 0 评论