![](https://img-blog.csdnimg.cn/20191227102557489.jpeg?x-oss-process=image/resize,m_fixed,h_224,w_224)
Java基础系列
文章平均质量分 69
基础概念篇
凉拌海蜇丝
我要一步一步往上爬~
展开
-
树的入门与习题
结点总度数 = 总结点数 - 1总结点数 = 结点总度数 + 1(一般考察的时候题目肯定要么给出总度数,要么给出总结点数,公式只是简单的 + 1 -1关系)巧记:根结点因为是所有子孙结点的祖宗,所以它比较老,头上一根毛都没有,求总度数(树家族成员总毛数)的时候,要记得仅仅根结点没毛,其它每个成员有一根毛,也就贡献一个度,N个成员N-1根毛理解:要使结点数最少,你想象你是一个抠门的大汉,要完成一个工程:高度H,度为M,要最少的结点数(预算)原创 2022-11-14 17:09:05 · 850 阅读 · 1 评论 -
Springboot+Maven做启动类与业务模块分离的架构模式
之前的项目一直是启动类与Controller,Service,Mapper等包同级。Maven仅仅是引入其他模块或者第三方Jar包工具。但是最新接手一套项目的架构非常有趣,也是记录一下分享一下,直接上示意图:上图一共五个Maven项目,父模块包含着四个子模块,子模块中有一个就是负责启动ABC那个子模块的启动类,ABC三套子模块中,又有各自的controller,service,mapper的包,然而仅需要ABC三个子模块的controller的包名路径一样(⚠️最好要保持一致,不然该案例的配置会扫描不原创 2022-05-13 17:33:37 · 1355 阅读 · 1 评论 -
InheritableThreadLocal的使用和最简单易懂源码分析
ThreadLocal的基本使用和源码关于ThreadLocal的知识点需要看另外一篇博客:ThreadLocal从简单使用及源码InheritableThreadLocal基本使用在了解完ThreadLocal后,我们来看下面例子:会发现ThreadLocal的一个弊端:父子线程无法共享数据那么我们对例子进行一下改造:使用InheritableThreadLocal完美解决这个问题源码分析:这里先试着停下思考:(1)它是怎么让子线程拿到了父线程设置的参数?(2)它放在哪里?又怎么取原创 2022-02-22 11:15:30 · 641 阅读 · 1 评论 -
邻近分类算法---KNN(Java实现+公式计算例子)
名词解释:KNN:K-Nearest-Neighbor K值最邻近所以网上有好几种叫法:最近邻,邻近…其实都是指的KNN,其实按照翻译都对。KNN算法产生于1968年,是数据挖掘和数据分类技术中最简单的入门级算法。按照字面意思,就是计算出距离K值最近的邻居数据,设对应数据为X,然后把待分类数据归类为X。原理基于大量不同维度的训练数据,做循环比较分析,具体经历下面四步流程:①准备数据,对数据进行预处理 。②计算测试样本点(也就是待分类点)到其他每个样本点的距离 。③对每个距离进行排序,然后选择原创 2022-02-18 17:27:00 · 3763 阅读 · 2 评论 -
CyclicBarrier的多种使用姿势和简单源码分析
是什么?循环屏障,顾名思义像一个屏障那样,可以拦截一定数量的线程,当足够数量多的线程到达屏障后,就会“突破”屏障,所有被拦截的线程会继续往下执行,也类似于一个“集合点”“计数器”,不过它可以被循环利用怎么用?例子1:举一个简单的例子,学校开校运会,所有学生站上赛道后才能开跑public class School { private static CyclicBarrier barrier = new CyclicBarrier(3); public static void ma原创 2022-02-14 16:50:41 · 298 阅读 · 0 评论 -
ThreadLocal从简单使用及源码
是什么?直译是“线程本地(变量)”,一个类似map结构的类,为每个线程变量单独创建一个副本,保证线程安全为什么要用?理由1:跨越多个方法进行参数传递public class School { static ThreadLocal<String> threadLocal = new ThreadLocal<>(); public static void main(String[] args) { say(1); } stat原创 2022-02-10 15:29:43 · 565 阅读 · 0 评论 -
从局部变量表和操作数栈理解 i++ 和 ++i
两个概念:局部变量表:类被创建后的一小块内存区域,存放当前类的局部变量值操作数栈:栈帧中的一小块内存区域,专门用于存放计算的中间结果值三个点:1:赋值操作其实是把操作数栈中的中间结果值进行计算后再赋值给某个变量,是最后一步操作2: i++ 是指先把i放入操作数栈中,自身局部变量表中的i变量自增+13: ++i 是先把局部变量表i的值自增+1,再放入到操作数栈例子一:输出的b是多少,应该很多人都知道是1,因为大学时候老师说过a++是先使用a,再++但是a因为++了,所以是2执行过程:(原创 2022-02-08 17:07:08 · 1107 阅读 · 0 评论 -
Variable used in lambda expression should be final or effectively final 问题的解决和追根溯源
翻译:lambda表达式中的变量必须是final的为什么?因为lambda表达式和匿名内部类一样,不需要额外定义类就可以直接写接口方法的实现,但是实际上只是简化了我们的写法,还是会由产生的一个内部类做了该接口的方法实现,那么这个时候,可以理解为其实有两个类,外部类的方法,调用了内部类的方法。而外面那个username,就是外部类的方法中的变量。基于这点认识,我们分析会出现如下两个问题:(1)如果像上面例子的异步执行,有可能就会出现外部类的方法执行完成出栈了,方法中的局部变量username被垃圾回.原创 2022-01-17 15:46:23 · 7236 阅读 · 0 评论 -
JIT与AOT
名词解释:JIT(JUST - IN -TIME)实时编译AOT(AHEAD-OF-TIME)预先编译它们两者最根本的区别,就在于编译代码的时机,所谓的编译代码,就是把人类写的代码,翻译成机器字节码指令这么一个过程。优缺点:JIT优点:1·可以实时根据硬件资源情况实时编译生成最优指令。2·能实现动态链接,动态编译加载需要用到的模块代码,节省内存空间3·能通过程序运行中内存和磁盘空间使用率情况,定位代码优化点(这是AOT无法做到的)JIT缺点:1·边运行边编译,会造成进程的卡顿,编译的同时原创 2022-01-11 16:57:34 · 752 阅读 · 0 评论 -
Java中的retry:标志
在线程池执行任务的源码中看到的,没接触过,所以当时记录了下来学习后补充。具体作用:就是一个标志位,用来定位的,用于更加优雅更加细化的跳出循环,常见搭配是continue retry 和break retry,举例说明普通for循环public static void main(String[] args) { for (int i = 0; i < 2; i++) { System.out.println("这是 i:"+i); for (int a =原创 2021-11-16 11:38:48 · 689 阅读 · 0 评论 -
Spring自定义注解失效的小坑和解决方案
业务需求写了个自定义注解,作用域加在方法上的,使用方法如下:class Test { @自定义注解 public void methodA(){ ...... }}写完了切面service和各种环绕方法后,测试了一下,生效了,于是提交,告诉队友们可以用起来,结果有一位伙计说注解不生效了,过去看,确实是加在方法上,不过是下面这样调用的:class Test { public void methodA(){ this.methodB(); } @自定义注解 public voi原创 2021-11-10 19:23:01 · 5484 阅读 · 0 评论 -
线程池执行任务原理
我们都很清楚多线程任务怎么创建,也知道线程池怎么用,那么这篇文章主要是用来分析线程池是怎样执行多线程任务的,首先我们创建一个线程池,从它的execute执行方法做为故事起点~(1)执行任务方法源码入参command就是待执行的任务,这一点源码解释了int c 是获取线程池的运行状态和线程数之类的信息,在线程池这个类的每一步操作都会判断一次,这样才能随时知道线程池的运行状态,它底层比较复杂,是通过Int类型的32位取值来表示不同的运行状态,这里不做展开,详情有另外一篇博客说明。判断假如worker原创 2021-10-25 11:07:39 · 408 阅读 · 0 评论 -
CloseableHttpClient的Get/Post基本使用与小坑
前言:是什么?当用习惯了Spring自带得RestTemplate,就很少用HttpClient接口的方式了,其实CloseableHttpClient也是http网络请求的一种工具包,实现了HttpClient接口,可以让我们方便的设置请求参数和请求头信息,还能让我们决定连接超时时间和socket超时时间,同时它会自己维护一个连接池,可以做连接数限制(默认5)和过期回收策略,防止每次请求都要创建新的connect,非常的方便。(1)准备工作依赖:Gradle:implementation 'or原创 2021-08-03 11:43:19 · 7286 阅读 · 0 评论 -
一文看懂Concurrent面试常问类Executor,ExecutorService,AbstractExecutorService,ThreadPoolExecutor作用,关系与区别
Concurrent包是jdk1.5所提供的一个针对高并发进行编程的包,也是多线程并发编程最喜欢问的,特别是从线程,线程池的使用做为最简单的切入点,先看个不太好理解的类图接下来我们从头往下,一步步拆分开来研究:Executor:多线程框架的主要接口,它底层就是一个execute执行方法。它代表着线程任务的执行,也是一切的开始,不管什么线程安全策略,多线程管理,定时,串行执行,都是建立在这个“执行”的基础之上,没有execute执行,线程也就等于无用。看它源码注释:An object that ex原创 2021-07-20 18:54:12 · 458 阅读 · 0 评论 -
BeanUtils.copyProperties基本用法与小坑
(1)实际应用BeanUtils.copyProperties(赋值目标对象,模板源对象);我们都知道当有两个对象AB,属性名称一样的情况下,如果需要把A的全部属性给B,传统写法是:B.setXX(A.getXX());如果只有几个特别的参数需要赋值过去这样写没问题,如果AB有100个参数需要粘过去,那么代码就太冗余太长了,BeanUtils.copyProperties就是为了解决这个问题的,现在假设有AB两个对象:static class DemoA { private String原创 2021-07-15 17:33:18 · 9870 阅读 · 0 评论 -
Java序列化与反序列化(实战应用与小坑)
前言:杜绝八股取士,活学活用从我做起,本文将会从简单的维度入手,分析序列化到底是什么?为什么要用?怎么用?有什么坑?希望能帮助到更多学习道路上的同学1:是什么?简单来说,序列化就是把内存中的对象通过一定的规则转换成字节序列,然后保存到磁盘,反序列化就是从磁盘中读取对应的字节序列出来恢复成原来那个对象,也可以说是根据字节序列“创建”出原来那个对象,我们都记得创建对象的几种方式:new,clone,reflect,序列化与反序列化。2:为什么要用?首先很明显就是保存某个对象在某一时期的某种状态,又或.原创 2021-07-09 17:24:50 · 397 阅读 · 2 评论 -
深入源码一步步看懂thread.join()做线程同步
(1)怎么理解join?它的意思是:加入,融合我们可以想象多线程其实就是异步的一种形式,new thread跟当前主线程正常情况下并行执行互不影响,有可能主线程执行快,有可能新的子线程执行快,都不确定,如果主线程需要用到子线程的处理结果,也就是主线程需要等待子线程执行完成之后再执行,这个时候就要用到join()方法了。join方法可以暂停主线程,等待某个子线程执行完之后再继续执行下面的代码那么join方法的意思就很明显了,让当前线程“加入”子线程的执行后面,变得类似串型化执行(2)怎么使用?假设需原创 2021-06-24 17:09:05 · 246 阅读 · 0 评论 -
park(), wait(), sleep()线程的挂起/唤醒的基本使用与区别
直接上代码,先看一段很简单的创建线程的代码:Thread threadB = new Thread(new Runnable() { @Override public void run() { System.out.println("BBB"); }});threadB.start();执行结果没问题(1)假设有个业务场景,线程任务必须在满足某个条件才执行,而不是start的时候执行,怎么做?这个时候理所当然就想着先把当前线程挂起,满足条件时候再唤醒。经过改造,写出如下代码:原创 2021-06-23 16:41:10 · 2308 阅读 · 0 评论 -
面试基础:谈String类的不可改变性
String是我们用得最多的一个类,它不是基本类型,但底层是依赖char[]字符一维数组实现的,我们还是直接看它长什么样,再做进一步分析。final 修饰的类,所以String自身不可以被继承(原因下面说)final 修饰了char一维数组,所以创建出来后就不允许再进行重新赋值(原因下面说)基于这个String,下面考几道常见面试题:(1)String a = "a";String b = "a";System.out.println(a == b);结果是true,因为a,b变量都指向原创 2021-06-17 18:10:45 · 237 阅读 · 2 评论 -
Java的强引用,软引用,弱引用,虚引用
所谓的强引用,软引用,弱引用,虚引用其实是几种不同的对象创建方式,相当于给创建出来的对象打上不同的标签。我们都知道对象的生命周期由垃圾收集器做GC来控制,我们虽然无法控制垃圾回收,但是我们能配合垃圾回收的规则,通过编码来管理某些对象的生命周期,更充分利用内存,减少无效对象的内存占用,避免OOM,这就可以用上强引用,软引用,弱引用,虚引用几种方式。(1)强引用Object o = new Object();String a = new String(“hello world”);在一个方法中使用原创 2021-06-16 17:21:12 · 179 阅读 · 0 评论 -
Java8 stream常用流式操作(集合类的转换,元素的最大最小平均值/查重/排序/过滤/删除/个数限制/跳跃/奇偶性...)
想象一下如果以前的Java写法针对List与Map容器类相互转换,特定属性的排重,集合元素排序,过滤筛选,删除元素,奇偶性判断,返回限制的个数……之类的操作,第一步就是需要写for循环,把每个元素遍历出来,再做自己逻辑操作。这里抛开以前在for循环里面写代码的固化思维,减少一点for,简化代码,如何写得更加简洁?首先创建今天的主角类:Zoo,类属性很简单:id和namepublic class Zoo { private int id; private String name;原创 2021-06-15 17:51:22 · 2337 阅读 · 1 评论 -
通过动物园来理解:内部类,静态内部类,匿名内部类
(1)内部类类用来描述现实中的某一个东西所具有的属性,所具有的方法等等,类与类之间可以有关联,例如动物园Zoo类里可以有:鱼Fish类,猴子Monkey类,狮子Lion类。这些不同的动物类,有自己独特的属性(鳃,爪子,翅膀,利齿)和活动方法。所以我们可以称Zoo为外部类,而Fish,Monkey,Lion等都可以做为Zoo的内部类。通过内部类这种形式,可以更形象的描述某一个东西的组成部分,可以更好更细致的描述复杂的类之间的关系public class Zoo { private String n原创 2021-05-28 17:30:13 · 305 阅读 · 0 评论 -
Java中Comparable与Comparator适用场景与区别
了解了并总结了一下该知识盲区,在今后的开发工作中遇到合适的场景刚好能用得上官方文档:https://tool.oschina.net/apidocs/apidoc?api=jdk-zh简单点说,就是通过实现该接口,使类具有“自然排序”的功能,先拿简单的类型Integer和String做实验可以看到strArray和intArray都是两组乱序的数组,在调用Arrays.sort之后,再打印输出,就变成了有序的了。根据这个sort方法点击进入:有一个countRunAndMakeAscend原创 2021-05-26 18:28:31 · 277 阅读 · 2 评论 -
通过抢厕所理解Java中的信号量Semaphore
信号量是一个并发工具类,(重复)是一个工具类,控制并发线程数,内部保存有虚拟的许可数量,线程执行操作时候要先获得许可,执行完毕释放许可,如果没有可用许可,则阻塞直到其它线程释放。init(也就是new Semaphore)方法进行许可数的初始化release方法释放许可Acquire方法申请许可,元子操作假设有个临界资源A每次只允许一个线程访问,所以许可初始化为1,利用信号量就可以做隔离线程t1和t2都要访问临界资源At1,t2都进行acquire,元子操作许可-1,t1获得许可,t2阻塞t原创 2021-05-20 15:42:18 · 152 阅读 · 1 评论 -
记一次OOM与内存泄漏排查经历
场景:测试环境有个应用容易爆OOM,导致容器也会不断重启,大佬怀疑是内存泄漏导致的,于是对它进行排查登陆上对应的服务器,安装ArthasArthas使用指南查看仪表盘:dashboard开始压测前开始压测后:堆内存比较满,而且是survivor区和eden区占用率飙升严重,右上角垃圾回收次数不断增加,eden区回收占用时间较长但是还不能确定是否存在内存泄漏,所谓内存泄漏,也就是内存脱离JVM的控制,无法对泄漏的内存进行回收利用,测试方法是手动GC:jcmd XXX(Java应用的进程号原创 2021-05-12 15:22:58 · 368 阅读 · 1 评论 -
不声明第三个参数(临时变量)交换两个数的值+快速查找数组中只出现一次的数字+异或运算的底层原理
题目1:设数组{3,2,1,7,2,3,7},除一个数字外,其它数字都是成对出现,求如何快速找出只出现了一次的数字?解:public static void main(String[] args) { int[] array = new int[]{3,2,1,7,2,3,7}; int result = array[0]; for (int i = 1; i < array.length; i++) { result = r原创 2021-04-19 11:42:34 · 138 阅读 · 0 评论 -
SpringBoot拦截器简单的拦截校验小Demo
拦截器其实功能上跟过滤器一样,也是AOP切面编程的一种实现方式,只不过它能更方便的充分调用Service方法,可以注入 Controller层,Service层,Mapper层等等进行逻辑判断,因为拦截器是基于Java反射机制创建并调用的,属于SpringMvc子容器,父容器完成初始化完成后才进行创建,所以可以注入和调用所有父容器中的service假设有个需求:根据某个入参ID判断是否1.是的话才允许调用并且同时记录请求响应时间,不是的话就返回(1)自定义一个拦截器:package com.examp原创 2021-04-12 18:15:27 · 344 阅读 · 0 评论 -
SpringBoot过滤器实战超简单上手演示
Filter依赖于Servlet容器,属于Servlet的一部分,生命周期由Servlet容器管理,是AOP切面编程的一种具体实现,它自身其实是一个通用的特殊的Service,在请求时会先经过过滤器的处理再针对Service发起真正的请求但是它粒度比较粗,只能针对HttpRequest和HttpResponse前后进行相关校验和逻辑判断处理。同时由于它属于Servlet容器管理,在过滤器内部无法注入Spring容器的实例,也无法调用相关Service方法。例如:自定义Filter:package原创 2021-04-12 17:02:06 · 224 阅读 · 0 评论 -
BiMap(HashBiMap,EnumBiMap,ImmutableBiMap)实战
bimap是什么?一种新的集合类,由google团队设计的,底层数据结构仍然是map为什么要用?我们设想一种场景,从key可以映射到一个value,也需要从value再映射回key,这种双向映射的关系,就是简单的hashMap解决不了的那么就会有问题,value难道也唯一吗?是的,value还真的唯一。所以它又适用于key与value都唯一的业务场景如何使用?跟普通的map一样BiMap<String,Integer> biMap = HashBiMap.create();原创 2021-03-30 11:42:18 · 2515 阅读 · 1 评论 -
Java线程池提交任务的两种方式(execute和submit)
线程池只是一个负责创建和管理线程任务的池子,具体概念在:[线程池的简单的底层解析和使用](https://blog.csdn.net/whiteBearClimb/article/details/107504976?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161173244316780266221766%252522%25252C%252522scm%252522%25253A%25252220140713.1原创 2021-01-27 15:28:07 · 4016 阅读 · 0 评论 -
Java调用Shell脚本(内含FlinkShell提交取消FlinkJob示例)
先从需求说起:有一个数据管理平台客户端,数据处理流是FlinkJob的算子链完成的,但是要让客户端后端的SpringBoot项目直接控制FlinkJob的任务执行,包括提交,下线等等。一开始找了下现成的集成包,客户端,但是好像没有。后来仔细看了开源的DolphinSchedule,发现它针对Flink的操作全是Shell,于是自己也想着模仿它来弄一套。(1)本地写一个.sh脚本从这个shell看出,接受了一些入参。并且对百度发起了get请求。(2)通过Java来调用public static v原创 2021-01-22 16:10:27 · 994 阅读 · 0 评论 -
设计LRU缓存结构(Java实现)
(1)是什么?Least Recently Used (最近最少使用)缓存淘汰算法中的一种。因为缓存是保存在内存中的,内存是很吃紧很宝贵的,所以要保证最热点的数据做缓存,冷门数据淘汰。(2)具体在哪些场景使用?Mysql的缓冲池,Linux OS 的虚拟文件系统VFS都有用到。(3)具体实现步骤?既然是缓存,那肯定就是List中存放着一大串 Key - Value 结构,我们查找目标数据的时候就是for这个List找到对应的Key,这个List可能很长,所以我们可以把热点数据排到较前面,冷门的放原创 2021-01-18 10:43:05 · 1919 阅读 · 1 评论 -
PropertyDescriptor(属性描述器)和Introspector(内省器)
(1)是什么?专门用于操作Java对象的属性的一套工具API,底层是充分利用了反射的原理便捷操作类属性。(2)具体用途:可以通过反射得到某个pojo的类属性所有get,set方法,并通过反射去调用它。例如如果有个100个类属性的pojo,如果我们set,是不是要写100次?如果我有1000个类属性,就写1000个get,set ?其实不用那么麻烦,只需要获取到该pojo的所有类属性,再通过反射获取对应属性的get,set方法,即可完成赋值。遇到一些还没有ORM映射的数据库,例如:Hive, Clic原创 2021-01-11 19:53:33 · 1278 阅读 · 2 评论 -
JSONObject类
(1)是什么?阿里巴巴提供的一个json快速转换工具类,实现了Map接口,通过Key Value形式存储数据,初始化大小为16,有参构造方法需要传入一个Map。项目中实际用途:用于Json转具体的Object实体类,或者String快速转JSON格式,都可以用或者有的数据属性变化较多,暂时不想定义一个POJO接参,就可以用JSONObject先接着。(2)怎么用?基本用法:public static void main(String[] args) throws Exception {原创 2021-01-11 15:00:40 · 7815 阅读 · 0 评论 -
Properties类的常用姿势
(1)是什么?Java配置文件类,主要用于读取,设置配置文件,Properties类继承Hashtable类并实现了Map接口,使用键值对的形式来保存配置属性,Key和Value都是字符串,在很多第三方连接驱动的Class都需要我们传递一个properties作为参数。例如Flink中监听Kafka消费:// 创建配置文件类Properties properties = new Properties();// 设置IP与端口号properties.setProperty(“bootstrap.se原创 2021-01-11 09:55:50 · 689 阅读 · 0 评论 -
CountDownLatch(Java多线程同步计数器)
CountDownLatch是一个同步工具类,用来协调多个线程之间的同步,或者说起到线程之间的通信(而不是用作互斥的作用)。CountDownLatch能够使一个线程在等待另外一些线程完成各自工作之后,再继续执行。使用一个计数器进行实现。计数器初始值为线程的数量。当每一个线程完成自己任务后,计数器的值就会减一。当计数器的值为0时,表示所有的线程都已经完成一些任务,然后在CountDownLatch上等待的线程就可以恢复执行接下来的任务。使某一个线程在某些其他线程任务执行成功后才开始执行,简单来说就是:原创 2021-01-08 18:04:41 · 239 阅读 · 0 评论 -
泛型、泛型类、泛型方法、泛型擦除
(1)是什么?一种允许我们在不确定参数类型时候使用的类型。例如我不知道A方法应该会传String还是int,我就用个泛型先占坑。(2)为什么要用泛型?泛型可以在编译期自动确定具体类型,检查类型是否匹配,可以提高代码的重用率,减少冗余编码。(3)泛型与Object的区别?像上面说的我不知道方法A的参数类型,其实也可以使用Object,但是使用Object出参的时候返回的也是Object,导致范围非常广泛, 返回值也许是其它类型。就会在运行时得到一个类型转换异常(ClassCastException:原创 2021-01-08 16:41:01 · 142 阅读 · 0 评论 -
Java8的默认方法小结
从Java8新增的几条原则说起,对:先看传统的接口与实现类:implement 重写对应的method后,执行一下:像上面这样是我们所熟悉的接口,一种规范,实现类必须重写实现那个接口定义的所有方法,直到Java8之后出现了默认方法默认方法:default的方法无需@Overwrite,在接口声明的时候就可以做具体实现,这无疑有点颠覆我们的传统三观问题一:如果实现类既实现了接口,又继承了抽象类,并且接口与抽象类中有同名方法,那么say2优先调用的会是哪一个?问题2: 如果定义两个接口原创 2021-01-05 18:33:02 · 179 阅读 · 0 评论 -
YGC,MinorGC,FGC,MajorGC,OldGC,MixedGC的概念性八股文
YGC(Young GC) / MinorGC:其实是一个东西,作用都是针对新生代(young gen)进行的垃圾回收,新生代空间不足会触发。OldGC:针对老年代的垃圾回收,老年代空间不足会触发。FGC:针对新生代,老年代都进行一次垃圾回收,所以是 Full (全部)GC。在堆的使用率超过80% 会触发,代码中显式调用 :System.GC;也会不定时触发。MixedGC:G1收集器特有的概念,在堆内存使用率超过45%就会触发的对新生代和老年代都进行的一次混合型GC,效率会比FGC要高,功能原创 2020-12-08 11:13:06 · 1940 阅读 · 2 评论 -
笛卡尔积
度娘概念图Mysql中,如果我们from A ,B 连表做条件查询,Mysql其实是拿两张表的全部数据做了一次笛卡尔积,然后生成全部的组合数据存储到一张新的临时表。然后再通过简单的判断去获取where XX 做条件筛选。在实际工作中,我们也可以是用这种方式很轻松处理一些复杂的业务逻辑。例:考勤表与人员表做笛卡尔积,可以知道谁在哪天缺席…文案素材库与图片素材库做笛卡尔积,可以组合出所有可能的排列组合…它的实现也非常简单:看到这里,是不是明白了SQL优化中有一条:连表查询时,尽量用小表驱动大原创 2020-11-27 11:50:23 · 419 阅读 · 0 评论