
Java 基础
文章平均质量分 79
RichardGeek
一枚普通的乐于分享的程序猿博主
展开
-
使用LambdaQueryWrapper 报错MybatisPlusException: can not find lambda cache for this property [****]
单元测试 Mockito 报使用LambdaQueryWrapper 报错MybatisPlusException: can not find lambda cache for this property [****] 异常问题原创 2023-06-16 09:41:27 · 6212 阅读 · 0 评论 -
深度理解Synchronized及底层原理
深入理解synchronized底层原理原创 2022-09-02 16:17:47 · 754 阅读 · 0 评论 -
Guava CacheBuilder 本地缓存的使用
Guava CacheBuilder 本地缓存的使用原创 2022-08-27 15:17:45 · 3670 阅读 · 0 评论 -
Java对象初始化过程 代码块与构造器调用顺序
Java对象初始化过程 代码块与构造器调用顺序原创 2022-08-19 17:55:48 · 869 阅读 · 0 评论 -
Java8 Optional 使用方法详解
Java 8 Optional 类的使用原创 2022-08-10 16:11:28 · 1232 阅读 · 0 评论 -
BigDecimal 使用注意!!“别踩坑”
你以为用了BigDecimal后,计算结果就一定精确了?原创 2022-08-04 10:29:23 · 1001 阅读 · 0 评论 -
JAVA的Stream流相关操作举例
java stream操作示例原创 2022-07-23 18:28:09 · 248 阅读 · 0 评论 -
【JVM】底层实现(一):浅谈 OOP-Klass 对象模型
JVM OOP-Klass 模型原创 2022-05-01 13:35:36 · 1863 阅读 · 1 评论 -
日志相关框架(扫盲)
常用日志框架Java开发的同学对log4j、log4j2、Logging、、logback、commons-logging、slf4j等等,对这几个日志相关的技术不陌生吧,为什么有这么多日志技术,它们都是什么区别和联系呢?相信大多数人搞不清楚它们的关系,下面我将一一介绍一下,以后大家再也不用傻傻分不清楚了。Java日志体系发展历程在实际开发过程中,Java的日志框架体系之所以会给编程人员带来一种混乱的感觉,根本原因是Java日志框架没有统一的使用标准。Log4,在最初的上古时代,程序员们原创 2021-11-13 17:01:38 · 578 阅读 · 0 评论 -
修改对象的私有静态成员变量属性值
private void modifySrvmgrCallerKeyLocked() { try { //更改私有变量值 SrvmgrCaller pt = new SrvmgrCaller(); Class<?> srvmgrCallerClazz = SrvmgrCaller.class; // 获得指定类的属性 Field field = sr...原创 2021-06-21 21:37:01 · 1106 阅读 · 0 评论 -
获取累的方法签名(类名+方法修饰符+方法返回名+方法名+方法参数名)
import java.lang.reflect.Method;import java.lang.reflect.Modifier;import java.util.HashMap;public class MethodSign<T> { public void printMethodSign(T t) { //获取对象类信息 Class<?> aClass = t.getClass(); //获取类中方法 .原创 2021-06-12 01:10:34 · 190 阅读 · 0 评论 -
java中int与Integer用==比较详解
前言:越是简单的东西,我们往往越是没有去把它明白,但我们大部分时间又常常在用,就像我们今天说的int与Integer的使用,我们程序员基本天天都在用,但是我今天没用详细弄清楚之前我也是不清楚,我们来看看这两个在用==号比较给我们带来的疑问。先看看下面的代码,看看我们是否都会 @Test public void testEquals() { int int1 = 12; int int2 = 12; ...原创 2021-03-03 16:24:51 · 4714 阅读 · 2 评论 -
JAVA类初始化顺序总结
类的初始化顺序带继承关系的,使用网上一张图来表示:OK,类的初始化中的知识点基本上就是初始化的顺序。原创 2021-02-23 11:43:26 · 231 阅读 · 0 评论 -
单例模式及破坏单例及防破坏单例方式
单例及破坏单例及防止破坏单例方式原创 2021-02-23 11:04:09 · 357 阅读 · 1 评论 -
TopN问题
什么是TopN问题:给定一个很大的数据量n,要求从n中提取出最大/最小/重复频度最高的N个数(N相对于n较小,如n为10亿量级,而N为100)。求topN在大数据中很常见,主要思路有三种: 1.先排序,在遍历出最大或最小的N个 2.通过大小堆,维持一个N个大小的堆,每次和堆顶元素比较,在堆化 3.中位数的中位数算法BFPRT第一种,先排序,排序算法有很多,冒泡排序,快速排序等。时间复杂度是 O(n*log n),这里不详讲。第二种,...原创 2021-02-22 19:33:17 · 6530 阅读 · 0 评论 -
树的先序、中序、后序、层次遍历
二叉树的遍历package com.lc.javabase;/** * @author liuchao02 * @ClassName: MyTree * @Description: 树 demo * @date 2021/2/22 17:02 */public class MyTree { int转载 2021-02-22 17:45:40 · 775 阅读 · 0 评论 -
LRU算法及实现
1.LRU算法是什么?LRU是Least Recently Used的缩写,即最近最少使用,是一种常用的页面置换算法选择最近最久未使用的数据予以淘汰。除此之外,在redis缓存中也是用到了这种算法。redis有读写两个操作,然后缓存是有空间限制的,大小会有一定上线的,2.算法来源来自https://leetcode-cn.com/problems/lru-cache/运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制 。实现 LRUCache 类:LRUCa原创 2021-02-20 17:40:31 · 419 阅读 · 0 评论 -
HTTPS建立连接过程说明
HTTPS建立连接过程说明原创 2021-02-18 17:49:03 · 2450 阅读 · 0 评论 -
线程按序交替Demo代码(线程通讯)
要求:编写一个程序,开启 3 个线程,这三个线程的 ID 分别为 A、B、C,每个线程将自己的 ID 在屏幕上打印 10 遍,要求输出的结果必须按顺序显示。如:ABCABCABC…… 依次递归分析:线程本来是抢占式进行的,要按序交替,所以必须实现线程通信,那就要用到等待唤醒。可以使用同步方法,也可以用同步锁。编码实现:public class TestLoopPrint { public static void main(String[] args) { .原创 2021-02-03 19:34:19 · 117 阅读 · 0 评论 -
线程池的选择(CPU核数的适当设置)
高并发、任务执行时间短的业务怎样使用线程池?并发不高、任务执行时间长的业务怎样使用线程池?并发高、业务执行时间长的业务怎样使用线程池?1)高并发、任务执行时间短的业务,线程池线程数可以设置为CPU核数+1,减少线程上下文的切换2)并发不高、任务执行时间长的业务要区分开看:a)假如是业务时间长集中在IO操作上,也就是IO密集型的任务,因为IO操作并不占用CPU,所以不要让所有的CPU闲下来,可以加大线程池中的线程数目,让CPU处理更多的业务b)假如是业务时间长集中在计算操作上,也就是计算密集型原创 2021-02-03 17:18:40 · 679 阅读 · 1 评论 -
ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal
解决父子线程传递的实现方案:TransmittableThreadLocal前言介绍InheritableThreadLocal之前,假设对 ThreadLocal 已经有了一定的理解,比如基本概念,原理,如果没有,可以参考:ThreadLocal源码分析解密.在讲解之前我们先列举有关ThreadLocal的几个关键点 每一个Thread线程都有属于自己的ThreadLocalMap,里面有一个弱引用的Entry(ThreadLocal,Object),如下 1234原创 2021-01-28 19:50:13 · 239 阅读 · 0 评论 -
Java多线程基础知识
一、多线程锁的升级原理锁的状态总共有四种,无锁状态、偏向锁、轻量级锁、重量级锁。随着锁的竞争,锁可以从偏向锁升级到轻量级锁,再升级到重量级锁。但是锁的升级是单向的,只能升级不能降级。1、无锁没有对资源进行锁定,所有的线程都能访问并修改同一个资源,但同时只有一个线程能修改成功,其它修改失败的线程会不断重试直到修改成功。无锁总是假设对共享资源的访问没有冲突,线程可以不停执行,无需加锁,无需等待,一旦发现冲突,无锁策略则采用一种称为CAS的技术来保证线程执行的安全性,CAS是无锁技术的关...原创 2021-01-15 19:04:00 · 223 阅读 · 0 评论 -
Tomcat线程池的深入理解
1.工作机制:Tomcat启动时如果没有请求过来,那么线程数(都是指线程池的线程数)为0;一旦有请求,Tomcat会初始化minSapreThreads设置的线程数;2.线程池作用:Tomcat的线程池的线程数跟你的瞬间并发有关系,比如maxThreads设置为1000,当瞬间并发达到1000那么Tomcat就会起1000个线程来处理,这时候跟你应用的快慢关系不大。3.参数分析...原创 2020-04-19 11:35:59 · 600 阅读 · 0 评论 -
Java线程池七个参数详解
java多线程开发时,常常用到线程池技术,这篇文章是对创建java线程池时的七个参数的详细解释。从源码中可以看出,线程池的构造函数有7个参数,分别是corePoolSize、maximumPoolSize、keepAliveTime、unit、workQueue、threadFactory、handler。下面会对这7个参数一一解释。一、corePoolSize 线程池核心线程大小...原创 2020-04-19 11:22:26 · 1184 阅读 · 0 评论 -
UML 类图
作者:蛇发女妖链接:https://www.jianshu.com/p/2828874af134来源:简书著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。这篇文章来总结下UML类图,本来不打算讲UML类图的,因为我在学习设计模式的时候,一遇到有关UML的就会自动忽略,一看感觉就很复杂。但是随着学习的深入,发现不掌握UML类图,对设计模式或者某一个框架没有整体的把...转载 2020-04-14 16:20:46 · 733 阅读 · 0 评论 -
HashMap什么时候重写hashcode和equals方法,为什么需要重写
HashSet内部是通过HashMap实现。只有使用排序的时候才使用TreeMap。否知使用HashMap。使用HashSet 举例子: 情景描述 往HashSet集合中put Student对象实例,要求: code name相同的不重复 放入。HashSet set = new HashSetset.put(new Student(1,"aa") );set.put(new ...原创 2020-04-02 10:19:29 · 988 阅读 · 0 评论 -
String 拼接提高效率,降低内存小技巧
为提高效率,减少消耗的内存空间,在for循环状态中对字符串进行拼接时,尽量减少使用+ 拼接,应使用StringBuilder对象的append(),然后再用StringBuilder对象的toString()方法转成String类型。原因:即使使用+的方式进行字符串拼接,在Java编译器编译代码的过程也会优化成使用StringBuilder的方式,而是每次+操作都会进行叠加式的创建String...原创 2019-01-20 18:30:53 · 1760 阅读 · 0 评论 -
java自定义注解接口实现方案
java自定义注解接口实现方案java注解是附加在代码中的一些元信息,用于一些工具在编译、运行时进行解析和使用,起到说明、配置的功能。 注解不会也不能影响代码的实际逻辑,仅仅起到辅助性的作用,Annotations仅仅是元数据,和业务逻辑无关。包含在 java.lang.annotation 包中。 1、元注解 元注解是指注解的注解。包括 @Retention @Target @Docu...转载 2018-07-03 21:57:47 · 1227 阅读 · 0 评论 -
单例模式获取某个类对象(ThreadLocal方式)
public Class ObjClass{//私有构造方法 防止外部创建private ObjClass(){};//私有需要存储的对象位置private static ThreadLocal threadLocal= new ThreadLocal();//公有静态获取实例的方法public static ObjClass getInstance(){ Objcl...原创 2019-01-08 15:58:45 · 957 阅读 · 0 评论 -
Java读取流文件
// 1.创建文件对象 File srcFile = new File("D:\\a.xml"); // 2.创建一个流,指向目标文件 InputStream is = null; try { is = new FileInputStream(srcFile); //3.创建一个用来存储读取数据的缓冲数组 ...原创 2019-01-24 10:29:33 · 3163 阅读 · 0 评论 -
Java并发编程:线程池的使用
转载自:https://blog.youkuaiyun.com/xlgen157387/article/details/48416215Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短的任务就结束了,这样频繁创建线程就会大大降低系统的效率,因为频繁创建线程和销毁线程需要时...转载 2018-04-19 18:50:46 · 140 阅读 · 0 评论 -
ConcurrentHashMap之实现细节
转载自:https://blog.youkuaiyun.com/xlgen157387/article/details/48414775ConcurrentHashMap是Java 5中支持高并发、高吞吐量的线程安全HashMap实现。闲话少说,通过仔细阅读源代码,现在总算理解ConcurrentHashMap实现机制了,其实现之精巧,令人叹服,与大家共享之。实现原理锁分离转载 2018-04-19 19:13:50 · 171 阅读 · 0 评论 -
线程池
线程池Executor框架 Executor采用工厂模式提供了各种类型的线程池,是实际使用中我们就直接从Executor中获取我们想要的线程池,拿来直接使用即可。下面简单的介绍下Executor提供的五大类线程池。 newFixedThreadPool()方法:该方法返回一个固定数量的线程池; newSingleThreadExec转载 2018-01-04 15:32:49 · 9486 阅读 · 2 评论 -
用 Java 实现拦截器 Interceptor 的拦截功能
利用Java的反射技术1,接口public interface AInterface{ void a();}2,实现类public class AImp implements AInterface{ @Override public void a() { System.out.println("aaaaaaaaaaa"...原创 2019-02-16 15:29:54 · 1923 阅读 · 1 评论 -
String类的compareTo()和compareToIgnoreCase()
compareTo()的返回值是int,它是先比较对应字符的大小(ASCII码顺序)1、如果字符相等返回值02、如果第一个字符和参数的第一个字符不等,结束比较,返回他们之间的差值(ascii码值)(负值代表:前字符串的值小于后字符串,正值代表:前字符串大于后字符串)3、如果第一个字符和参数的第一个字符相等,则以第二个字符和参数的第二个字符做比较,以此类推,直至比较的字符或被比较的字符有...转载 2019-02-28 14:14:34 · 537 阅读 · 0 评论 -
按map存储的整型值排序
在 Java 中对一个 Map 按 Key 排序是很简单的一件事(TreeMap)。但是按 Value 排序的话,却略显麻烦。在 Java 8 之前,对 Map 按 Value 排序一般有两种方法:// 1. TreeMappublic class Testing { public static void main(String[] args) { HashM...转载 2019-02-20 16:07:22 · 498 阅读 · 0 评论 -
Java自动封装类型的基础类型的缓存策略
缓存策略在 Java 5 中,为 Integer 的操作引入了一个新的特性,用来节省内存和提高性能。整型对象在内部实现中通过使用相同的对象引用实现了缓存和重用。上面的规则适用于整数区间 -128 到 +127。这种 Integer 缓存策略仅在自动装箱(autoboxing)的时候有用,使用构造器创建的 Integer 对象不能被缓存。Java 编译器把原始类型自动转换为封装类的过...转载 2019-02-20 16:17:31 · 487 阅读 · 0 评论 -
写入文件到本地
//记录某些日志信息到物理存储的文件。 //Str 需要输出的字符串内容。targetfile 需要输出到的文件目录位置 private void logErrorInfotoFile(String Str,String targetfile) throws IOException { SimpleDateFormat dFormat=new SimpleDateFormat("...原创 2019-02-26 10:43:10 · 1028 阅读 · 0 评论 -
CGLib 动态代理Demo
我们再新建一个AmethodClass来,不实现任何接口。某个类的方法实现不需要继承任何接口。如果 Spring 识别到所代理的类没有实现 Interface,那么就会使用 CGLib 来创建动态代理,原理实际上成为所代理类的子类。有需要执行方法的类:package com.testcglibProxy;/** * @author liuchaoOvO on 2019/2/...原创 2019-02-21 11:27:20 · 521 阅读 · 0 评论 -
并发编程 volatile关键字
大家都知道,计算机在执行程序时,每条指令都是在CPU中执行的,而执行指令过程中,势必涉及到数据的读取和写入。由于程序运行过程中的临时数据是存放在主存(物理内存)当中的,这时就存在一个问题,由于CPU执行速度很快,而从内存读取数据和向内存写入数据的过程跟CPU执行指令的速度比起来要慢的多,因此如果任何时候对数据的操作都要通过和内存的交互来进行,会大大降低指令执行的速度。因此在CPU里面就有了高速缓...原创 2019-04-17 15:15:35 · 131 阅读 · 0 评论