
Java学习
碧海凌云
从平凡到神奇
展开
-
java 8 去重
// 取差集List<SoDetail> chajiDetails = SoDetailList.stream() .filter(item -> !upSoDetailList.stream() .map(e -> e.getSkuCode()) .collect(Collectors.toList()) .contains(it转载 2022-05-15 21:34:42 · 2489 阅读 · 1 评论 -
java 8 根据map 字段值 去重
java 8 根据map 字段值 去重 List<Map<String, Object>> msgId = list1.stream().filter(distinctByKey(deviceRecord -> deviceRecord.get("msgId"))).collect(Collectors.toList());public static <T> Predicat<T> distinctByKey(Function<? suppe转载 2022-05-15 21:21:05 · 1166 阅读 · 0 评论 -
classpath*作用
classpath*: It refers to a list of resources and loads all such files present in the classpath and list can be empty and if no such file is present in the classpath then application does not throw any exception(just ignores the error).classpath: It refers原创 2021-09-14 14:42:39 · 398 阅读 · 0 评论 -
Java创建线程的三种主要方式
一、继承Thread类创建通过继承Thread并且重写其run(),run方法中即线程执行任务。创建后的子类通过调用 start() 方法即可执行线程方法。通过继承Thread实现的线程类,多个线程间无法共享线程类的实例变量。(需要创建不同Thread对象,自然不共享)/** * 通过继承Thread实现线程 */public class ThreadTest extends Thread{ private int i = 0 ; @Override public void转载 2021-06-01 11:34:22 · 717 阅读 · 0 评论 -
JAVA 系统变量之System.getenv()和System.getProperty() 用法
JAVA 系统变量之System.getenv()和System.getProperty() 用法Java提供了System类的静态方法getenv()和getProperty()用于返回系统相关的变量与属性,getenv方法返回的变量大多于系统相关,getProperty方法返回的变量大多与java程序有关。System.getenv() 方法是获取指定的环境变量的值。System.getenv(String str) 接收参数为任意字符串,当存在指定环境变量时即返回环境变量的值,否则返回null。转载 2021-03-09 16:25:00 · 2670 阅读 · 0 评论 -
生产者消费者模式-Java实现
生产消费者模型生产者消费者模型具体来讲,就是在一个系统中,存在生产者和消费者两种角色,他们通过内存缓冲区进行通信,生产者生产消费者需要的资料,消费者把资料做成产品。生产消费者模式如下图。在日益发展的服务类型中,譬如注册用户这种服务,它可能解耦成好几种独立的服务(账号验证,邮箱验证码,手机短信码等)。它们作为消费者,等待用户输入数据,在前台数据提交之后会经过分解并发送到各个服务所在的url,分发的那个角色就相当于生产者。消费者在获取数据时候有可能一次不能处理完,那么它们各自有一个请求队列,那就是内存缓冲区转载 2021-02-24 11:17:37 · 686 阅读 · 0 评论 -
java-获取比a大,最接近a的2的次方的数(最小二次幂,位运算)
a = 5, 返回 8;a = 13, 返回 16;a = 1021, 返回 1024;位运算知识储备说明 (参考引用地址:https://www.cnblogs.com/yinfj/p/10647393.html):1.左移->左移运算符“<<” - 使指定值的所有位都左移规定的次数。->左移m<<n 代表把数字m在无溢出的前提下乘以2的n次方。2.右移 右移运算符“>>” - 使指定值的所有位都右移规定的次数。右移m>&g转载 2021-02-20 16:59:12 · 1108 阅读 · 0 评论 -
Java检查异常、非检查异常、运行时异常、非运行时异常的区别
Java把所有的非正常情况分为两种:异常(Exception)和错误(Error),它们都继承Throwable父类。Java的异常(Exception和Error)分为检查异常和非检查的异常。其中根据Exception异常进行分类,可分为运行时异常和非运行时异常。检查异常:就是编译器要求你必须处理的异常。比如我们在编程某个文件的读于写时,编译器要求你必须要对某段代码try…catch… 或者 throws exception,这就是检查异常,简单的来说,你代码还没有运行,编码器就会检查你的代码,对转载 2021-01-13 20:37:07 · 213 阅读 · 0 评论 -
java正则表达式忽略大小写
// 第一种:直接用正则,(?!)表示整体忽略大小写,如果单个,则可以写成"^d(?!)oc"表示oc忽略大小写,"^d((?!)o)c"表示只有o忽略大小写String regex1 = "^(?i)doc$";// 第二种,采用Patter编译忽略大小写String regex = "^doc$";String s = "DoC";System.out.println(s.matches(regex1)); //truePattern p = Pattern.compile(regex, P转载 2021-01-05 19:09:43 · 5761 阅读 · 0 评论 -
云端飘 String s=new String(“abc“)创建了几个对象?
String s=new String(“abc”)创建了几个对象?String str=new String(“abc”); 紧接着这段代码之后的往往是这个问题,那就是这行代码究竟创建了几个String对象呢?相信大家对这道题并不陌生,答案也是众所周知的,2个。接下来我们就从这道题展开,一起回顾一下与创建String对象相关的一些JAVA知识。我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的St转载 2021-01-05 14:35:15 · 178 阅读 · 0 评论 -
Java程序员必备:常见OOM异常分析
前言放假这几天,温习了深入理解Java虚拟机的第二章, 整理了JVM发生OOM异常的几种情况,并分析原因以及解决方案,希望对大家有帮助。Java 堆溢出Java堆用于存储对象实例,只要不断地创建对象,并且保证GC Roots到对象之间有可达路径来避免垃圾回收机制清除这些对象,那么在对象数量到达最大堆的容量限制后就会产生内存溢出异常。Java 堆溢出原因无法在 Java 堆中分配对象应用程序保存了无法被GC回收的对象。应用程序过度使用 finalizer。Java 堆溢出排查解决思路查转载 2020-11-29 12:38:58 · 697 阅读 · 0 评论 -
正则表达式 - (?!), (?:), (?=)
正则表达式 - (?!), (?:), (?=)(?:pattern)非获取匹配,匹配pattern但不获取匹配结果,不进行存储供以后使用。这在使用或字符“(|)”来组合一个模式的各个部分是很有用。例如“industr(?:y|ies)”就是一个比“industry|industries”更简略的表达式。(?=pattern)非获取匹配,正向肯定预查,在任何匹配pattern的字符串开始处匹配查找字符串,该匹配不需要获取供以后使用。例如,“Windows(?=95|98|NT|2000)”能匹配“转载 2020-09-27 10:06:05 · 3387 阅读 · 0 评论 -
Java中解析日志
Java中解析日志常用的是Grok,Grok是一个用于解析logs和其它文件的简单易用的API,并且它可以将这些无结构的logs转换成结构化的数据(JSON),使用正则表达式对logs进行解析,常用的是grok和java-grok,下面来具体说说各自的使用grokgrok是io.thekraken组织提供的实现,在mven仓库中输入io.thekraken就可以找到对应的jar包简单Java项目如果是简单Java项目,直接引入依赖的jar包即可,对于0.1.5的版本,必须引入5个jar包:comm转载 2020-07-22 10:09:27 · 2968 阅读 · 0 评论 -
JUnit 5预期异常
在JUnit 5中,我们可以使用assertThrows声明抛出了异常。PS已通过JUnit 5.5.2测试1.未检查的异常1.1捕获运行时异常的JUnit示例。ExceptionExample1.javapackage com.mkyong.assertions; import org.junit.jupiter.api.Test; import static org.junit.jupiter.api.Assertions.*; public class ExceptionExam转载 2020-07-21 15:17:42 · 2585 阅读 · 0 评论 -
java项目中的classpath到底是什么
java项目中的classpath到底是什么在java项目中,你一定碰到过classpath,通常情况下,我们是用它来指定配置/资源文件的路径。在刚开始学习的时候,自己也糊里糊涂,但是现在,是时候弄清楚它到底是指什么了。顾名思义,classpath就是class的path,也就是类文件(*.class的路径)。一谈到文件的路径,我们就很有必要了解一个java项目(通常也是web项目)它在真正运行时候,这个项目内部的目录、文件的结构;这样,我们才好分析、理解classpath。开发时期的web项目结构转载 2020-07-16 19:47:36 · 517 阅读 · 0 评论 -
java读取jar包中的文件
java读取jar包中的文件随手写了一个java小工具,maven打包成功后,发现工具总是读不到打在jar包中的文件信息,要读取的文件位于 /src/main/resources 目录下,打包成功后,文件就在jar包中根目录下,一直以为是路径错误,之后用this.getClass().getClassLoader().getResource("").getPath();发现路径是xxx.jar!/com/demo/…形式,路径总是获取不对。之后试了一下BufferedReader in = new Bu转载 2020-07-15 19:11:58 · 562 阅读 · 0 评论 -
Java8获取当前时间、新的时间日期时区类使用
这里写自定义目录标题主要内容包括一 、先主要是Java8中LocalDate日期的操作1. Date转LocalDate、LocalDateTime2. 13位long类型转LocalDate3. 获取现在的日期4. 获取年月日5. 判断两个日期之间相差多少天6. 获得某个日期所在月的第一天、最后一天7. 某个月有多少天8. 比较两个LocalDate的大小9. 获取下一周的该星期、下个月的这天、下个月的1号10. 比较两个LocalDate相差多少年、月、天11. 通过10位或13位时间戳构建Instan转载 2020-07-09 17:00:51 · 3742 阅读 · 0 评论 -
Jave中使用ZoneDateTime转换时间
最近写代码时遇到需要转换将一个时间进行时区转换的问题,记录一下。问题:由于使用的account不同,从facebook取到的时间是诸如这样的形式"2019-05-05T22:48:52+0800"、“2019-05-05T22:48:52+0700”,但是由于业务需要,时间需要统一使用洛杉矶时区:ZoneId.of(“Asia/Shanghai”)。解决:首先使用ZonedDateTime+DateTimeFormatter将获取到的时间转换为带时区的时间对象;需要注意的是字符T属于时间格式化中的转载 2020-07-08 15:50:48 · 1349 阅读 · 0 评论 -
Java hashCode() 和 equals()的若干问题解答
本章的内容主要解决下面几个问题:1 equals() 的作用是什么?2 equals() 与 == 的区别是什么?3 hashCode() 的作用是什么?4 hashCode() 和 equals() 之间有什么联系?第1部分 equals() 的作用equals() 的作用是 用来判断两个对象是否相等。equals() 定义在JDK的Object.java中。通过判断两个对象的地址是否相等(即,是否是同一个对象)来区分它们是否相等。源码如下:public boolean equals(Ob转载 2020-06-13 21:10:54 · 657 阅读 · 0 评论 -
ThredPoolTaskExcutor的处理流程
ThredPoolTaskExcutor的处理流程:当池子大小小于corePoolSize,就新建线程,并处理请求当池子大小等于corePoolSize,把请求放入workQueue中,池子里的空闲线程就去workQueue中取任务并处理当workQueue放不下任务时,就新建线程入池,并处理请求,如果池子大小撑到了maximumPoolSize,就用RejectedExecutionHandler来做拒绝处理当池子的线程数大于corePoolSize时,多余的线程会等待keepAliveTime原创 2020-06-12 15:57:38 · 181 阅读 · 0 评论 -
Java锁的一些认知
同一个进程重入锁(ReentrantLock)使用ReentrantLock获取锁的时候会判断当前线程是否为获取锁的线程,如果是则将同步的状态+1,释放锁的时候将同步的状态-1,只有将同步状态的次数为0时才会最终释放锁。...转载 2020-05-21 21:37:01 · 146 阅读 · 0 评论 -
Java中Lock,tryLock,lockInterruptibly有什么区别?
lockpublic void lock()获取锁。如果该锁没有被另一个线程保持,则获取该锁并立即返回,将锁的保持计数设置为 1。如果当前线程已经保持该锁,则将保持计数加 1,并且该方法立即返回。如果该锁被另一个线程保持,则出于线程调度的目的,禁用当前线程,并且在获得锁之前,该线程将一直处于休眠状态,此时锁保持计数被设置为 1。指定者:接口 Lock 中的 lock作者:wuxinliulei链接:https://www.zhihu.com/question/36771163/ans转载 2020-05-18 19:09:26 · 546 阅读 · 0 评论 -
lock()与lockInterruptibly()的区别
lock 与 lockInterruptibly比较区别在于:lock 优先考虑获取锁,待获取锁成功后,才响应中断。lockInterruptibly 优先考虑响应中断,而不是响应锁的普通获取或重入获取。详细区别:ReentrantLock.lockInterruptibly允许在等待时由其它线程调用等待线程的Thread.interrupt方法来中断等待线程的等待而直接返回,这时不用获取锁,而会抛出一个InterruptedException。 ReentrantLock.lock方法不允许Thr转载 2020-05-15 15:50:07 · 368 阅读 · 0 评论 -
LinkedBlockingQueue和ArrayBlockingQueue 对比
相同:1、LinkedBlockingQueue和ArrayBlockingQueue都实现了BlockingQueue接口;2、LinkedBlockingQueue和ArrayBlockingQueue都是可阻塞的队列(内部都是使用ReentrantLock和Condition来保证生产和消费的同步;当队列为空,消费者线程被阻塞;当队列装满,生产者线程被阻塞.)不同:1、队列中的同步锁机制不同ArrayBlockingQueue中的锁是没有分离的,即生产和消费用的是同一个锁; 使用一个Reen转载 2020-05-15 14:26:28 · 769 阅读 · 0 评论 -
数据库高并发解决方法总结
前言一个项目刚开始的时候是为了实现基本功能,随着版本和功能的迭代,大数据和高并发成了软件设计必须考虑的问题!本质很简单,一个是慢,一个是等。两者是相互关联的,因为慢,所以要等,因为等,所以慢,解决了慢,也就解决了等,解决了等,也就解决了慢。关键是如何解决慢和等,核心 一个是短,一个是少,一个是分流,最后一个是集群/横向扩张/读写分离/建立主从短是指路径要短页面静态化- 用户可以直接获取页面,不用走那么多流程,比较适用于页面不频繁更新。使用缓存- 第一次获取数据从数据库准提取,然后保存在缓转载 2020-05-14 22:55:59 · 1351 阅读 · 0 评论 -
JVM性能调优详解
性能调优性能调优包含多个层次,比如:架构调优、代码调优、JVM调优、数据库调优、操作系统调优等。架构调优和代码调优是JVM调优的基础,其中架构调优是对系统影响最大的。性能调优基本上按照以下步骤进行:明确优化目标、发现性能瓶颈、性能调优、通过监控及数据统计工具获得数据、确认是否达到目标。何时进行JVM调优遇到以下情况,就需要考虑进行JVM调优了:Heap内存(老年代)持续上涨达到设置的最大内存值;Full GC 次数频繁;GC 停顿时间过长(超过1秒);应用出现OutOfMemory 等内转载 2020-05-14 15:11:39 · 206 阅读 · 0 评论 -
final,static,this,super 关键字总结
final,static,this,super 关键字总结final 关键字static 关键字this 关键字super 关键字参考static 关键字详解static 关键字主要有以下四种使用场景修饰成员变量和成员方法(常用)静态代码块静态内部类静态导包补充内容静态方法与非静态方法static{}静态代码块与{}非静态代码块(构造代码块)参考...原创 2020-05-08 22:55:23 · 272 阅读 · 0 评论 -
Java之Queue接口中add()/offer()、remove()/poll()、element()/peek()的区别
队列的使用在日常开发中,特别常见,但是对于队列接口中的一些方法可能使用起来有些疑惑,本文简单记录一下关于Queue接口中几种类似方法的区别。add() 和 offer()add() : 添加元素,如果添加成功则返回true,如果队列是满的,则抛出异常offer() : 添加元素,如果添加成功则返回true,如果队列是满的,则返回false区别:对于一些有容量限制的队列,当队列满的时候,...转载 2020-04-04 18:25:58 · 981 阅读 · 0 评论 -
java中使用for循环删除List集合的陷阱
(错误示范:使用for循环删除list集合) for(int i=0;i<list.size();i++) { if(list.get(i)!=0) { list.remove(i); } }错误的原因是每删除list集合的一个元素,list的大小都在发生改变,从而导致索引也在发生改变,从而删除的时候会漏过一些元素。...原创 2020-03-17 19:35:39 · 617 阅读 · 0 评论 -
Java8常用函数式接口 Supplier 、Consumer、Predicate、Function总结
//无输入参数,返回T类型的一个结果。new Supplier<String>() { @Override public String get() { return null; }};Supplier<String> supplier = () -> "Test supplier";supplier.get(); //r...转载 2020-03-08 12:31:53 · 951 阅读 · 0 评论 -
Java迭代 : Iterator和Iterable接口
从英文意思去理解Iterable :故名思议,实现了这个接口的集合对象支持迭代,是可迭代的。able结尾的表示 能…样,可以做…。Iterator: 在英语中or 结尾是都是表示 …样的人 or … 者。如creator就是创作者的意思。这里也是一样:iterator就是迭代者,我们一般叫迭代器,它就是提供迭代机制的对象,具体如何迭代,都是Iterator接口规范的。Iterable一...转载 2019-02-12 15:59:15 · 217 阅读 · 0 评论 -
Assertj了解
单元测试一个单元测试分三步:准备数据执行测试方法断言测试结果Java里面写单元测试都会以来JUnit,而且该包夜提供了一些的Assert的API。但不得不说确实不好用,可读性差。所以不推荐使用。很多人也喜欢用Hamcrest,非常好用(我现在还是用它)。遗憾的是从2012年开始就没有后续更新了。之后了FEST,只是它也不更新了。前段时间去ThoughtWorks 面试,发现他们提倡用...转载 2019-02-22 19:26:34 · 1375 阅读 · 0 评论 -
单元测试之JUnit5入门
关于JUnit5与以前版本的JUnit不同,JUnit 5由三个不同子项目中的几个不同模块组成。JUnit 5 = JUnit Platform + JUnit Jupiter + JUnit VintageJUnit Platform是基于JVM的运行测试的基础框架在,它定义了开发运行在这个测试框架上的TestEngine API。此外该平台提供了一个控制台启动器,可以从命令行启动平...转载 2019-02-21 19:32:13 · 483 阅读 · 0 评论 -
认识cpu、核与线程
cpu与核心物理核物理核数量=cpu数(机子上装的cpu的数量)*每个cpu的核心数虚拟核所谓的4核8线程,4核指的是物理核心。通过超线程技术,用一个物理核模拟两个虚拟核,每个核两个线程,总数为8线程。在操作系统看来是8个核,但是实际上是4个物理核。通过超线程技术可以实现单个物理核实现线程级别的并行计算,但是比不上性能两个物理核。单核cpu和多核cpu都是一个cpu,不同...转载 2019-01-25 15:46:06 · 368 阅读 · 0 评论 -
Java 泛型解惑之<? extends T>和<? super T>
1 为什么要用通配符和边界?使用泛型的过程中,经常出现一种很别扭的情况比如我们有Fruit类,和它的派生类Appleclass Fruit {}class Apple extends Fruit {}然后有一个最简单的容器:Plate类盘子里可以放一个泛型的“东西”我们可以对这个东西做最简单的“放”和“取”的动作:set( )和get( )方法class Plate<T&g...转载 2019-01-13 12:06:45 · 2885 阅读 · 0 评论 -
Java中<? extends T>和<? super T>的理解
意义不同? extends T 表示上界是T? super T 表示下界是T1. 为什么要用通配符和边界?使用泛型的过程中,经常出现一种很别扭的情况。比如按照题主的例子,我们有Fruit类,和它的派生类Apple类。public class Apple extends Fruit{}public class Fruit {}然后我在main方法里创建实例对象:逻辑上...转载 2019-01-13 11:08:20 · 4005 阅读 · 4 评论 -
Servlet容器
在本文中,我写了一些关于Web服务器、Servlet容器以及它与JVM的关系的基本概念。我想表达的是,Servlet容器也仅仅不过是一个Java程序。1. 什么是Web服务器? 想要知道什么是Servlet容器,我们首先要知道什么是Web服务器。 Web服务器使用HTTP协议来传输数据。最简单的一种情况是,用户在浏览器(客户端,client)中输入一个URL(如,www转载 2018-01-11 19:04:05 · 203 阅读 · 0 评论 -
Java 8系列之Stream的基本语法详解
概述继Java 8系列之Lambda表达式之后,我们来了解Stream。Stream 是用函数式编程方式在集合类上进行复杂操作的工具,其集成了Java 8中的众多新特性之一的聚合操作,开发者可以更容易地使用Lambda表达式,并且更方便地实现对集合的查找、遍历、过滤以及常见计算等。聚合操作为了学习聚合的使用,在这里,先定义一个数据类:public class Student { i...转载 2019-03-21 17:44:15 · 394 阅读 · 0 评论 -
Java中list对象的三种遍历方式
遍历List集合的三种方法List<String> list = new ArrayList<String>();list.add("aaa");list.add("bbb");list.add("ccc");方法一:超级for循环遍历for(String attribute : list) { System.out.println(attribute)...转载 2019-04-12 14:21:44 · 3396 阅读 · 0 评论 -
java Files类和Paths类的用法 (转)
java Files类和Paths类的用法 (转)Java7中文件IO发生了很大的变化,专门引入了很多新的类:import java.nio.file.DirectoryStream;import java.nio.file.FileSystem;import java.nio.file.FileSystems;import java.nio.file.Files;import jav...转载 2019-05-05 17:04:41 · 650 阅读 · 0 评论