- 博客(42)
- 收藏
- 关注
原创 MyBatis操作Json类型的字段
handler, 转置JSON格式package com.taikang.health.handler;import com.fasterxml.jackson.core.JsonProcessingException;import com.fasterxml.jackson.databind.DeserializationFeature;import com.fasterxml.jackson.databind.ObjectMapper;import org.apache.ibatis.exc
2022-04-29 16:14:38
3532
原创 对象列表转Map,多个字段组合Key场景
Map<String, Class> map = list.stream().collect(Collectors.toMap(k ->k.getId()+k.getCode()+k.getType(), Class-> Class));
2022-04-26 17:38:55
1377
原创 数据库三大范式、BCNF范式、反范式
数据库设计的三大范式:1、第一范式(确保每列保持原子性)第一范式是最基本的范式。如果数据库表中的所有字段值都是不可分解的原子值,就说明该数据库表满足了第一范式。第一范式的合理遵循需要根据系统的实际需求来定。比如某些数据库系统中需要用到“地址”这个属性,本来直接将“地址”属性设计成一个数据库表的字段就行。但是如果系统经常会访问“地址”属性中的“城市”部分,那么就非要将“地址”这个属性重新拆分为省份、城市、详细地址等多个部分进行存储,这样在对地址中某一部分操作的时候将非常方便。这样设计才算满足了数据库的第
2022-04-17 20:57:29
438
原创 BIO、NIO、AIO& IO多路复用器的实现方式 select、poll、epoll
select,poll,epoll都是IO多路复用机制,即可以监视多个描述符,一旦某个描述符就绪(读或写就绪),能够通知程序进行相应读写操作。 但select,poll,epoll本质上都是同步I/O,因为他们都需要在读写事件就绪后自己负责进行读写,也就是说这个读写过程是阻塞的,而异步I/O则无需自己负责进行读写,异步I/O的实现会负责把数据从内核拷贝到用户空间。select,poll实现需要自己不断轮询所有fd集合,直到设备就绪,期间可能要睡眠和唤醒多次交替。而epoll其实也需要调用epoll_wa
2022-04-05 22:56:54
221
原创 JVM:TLAB
简介TLAB: Thread Local Alloc Buffer 在设置了参数 -XX:UseTLAB之后启用。在线程初始化的过程当中,同时也会申请一块内存,只给当前线程使用。TLAB只有在“分配”这个动作上是线程独占的,而在使用/收集意义上都还是让所有线程共享的;使用上的共享并不需要做任何额外检查。所谓TLAB其实就是这样的一个东西:(简化伪代码)struct ThreadLocalAllocBuffer { HeapWord* _start; HeapWord* _top; Heap
2022-04-04 11:12:18
595
原创 Atomic中的incrementAndGet和getAndIncrement的区别
getAndIncrement():public final int getAndIncrement() { return unsafe.getAndAddInt(this, valueOffset, 1); }incrementAndGet(): public final int incrementAndGet() { return unsafe.getAndAddInt(this, valueOffset, 1) + 1; }总结:incre
2022-04-03 13:46:55
338
原创 索引类型-还能那么简单的回答吗
这问题可不能直接回答分为XXX类型和XXX类型啊,区分方式有以下几种,要先宏观,再细微存储方式区分根据存储方式的不同,MySQL 中常用的索引在物理上分为 B-树索引和 HASH 索引两类,两种不同类型的索引各有其不同的适用范围。B-树索引B-树索引又称为 BTREE 索引,目前大部分的索引都是采用 B-树索引来存储的。B-树索引是一个典型的数据结构,其包含的组件主要有以下几个:叶子节点:包含的条目直接指向表里的数据行。叶子节点之间彼此相连,一个叶子节点有一个指向下一个叶子节点的指针。分
2022-04-02 17:21:51
87
原创 ReentrantLock和Synchronized
首先:ReentrantLock和Synchronized都是Java当中的锁,并且是重量级锁和可重入锁。他们之间的区别,可以分为以下两点:1.用法上的区别:作用范围、是否可以中断、sleep和wait2.实现原理的区别:moniter监视器操作对象头、AQS Node队列+state3.锁升级过程:synchronized存在,lock不存在用法区别:(1)作用范围:Synchronized可以加在类、方法、代码块和静态变量上,当加在类和静态变量上时,为类锁,锁的是当前类,当加在方法上和代码块
2022-03-30 22:54:18
4390
原创 MySQL
索引1。磁盘IO:尽量保证次数少尽量保证每次的量少利用磁盘预读原理2.数据结构(1)B+索引二叉树AVL树红黑树B树(节点上数据和key值放在一起)B+树(数据只存在叶子节点,叶子节点使用双向链表连接在一起,利用磁盘预读原理)(2)Hash索引3.索引失效情况(1)组合索引不遵循最左匹配原则(2)组合索引的前面的索引使用了范围查询会导致后续的索引失效(3)在索引上进行计算和类型转换(4)is null和is not null无法使用索引(5)尽量少使用or运算符,否则连接
2022-03-14 22:49:34
633
原创 消息队列基础
简述kafka的架构设计Consumer Group:消费者组,消费者组内每个消费者负责消费不同分区的数据,提高消费能力。逻辑上的订阅者。Topic:将消息分类,生产者和消费者面向的是同一个TopicPartition:为了实现扩展性,提升并发能力,一个Topic以多个Partition的方式分布到多个Broker上,每个Partition都是一个有序队列。一个Topic的每个Partition都有若干个副本(Replica),一个leader和若干个Follower。生产者发送数据的对象,以及消费者
2022-03-12 16:18:30
730
原创 如何解决缓存一致性?
延时双删策略:public void write(String key,Object data){ redis.del(key); db.update(data); Thread.sleep(1000); redis.del(key); }为什么要延时第二次删除?为了规避在更新数据库之前的查询操作,更新缓存造成脏数据。第一次删除是为了更新完数据库之后的查询操作能够第一时间获取到最新的缓存内容,没必要等到延时之后。...
2022-03-12 11:17:09
1123
原创 MD5为什么要两次加密
第一次 (在前端加密,客户端):密码加密是(明文密码+固定盐值)生成md5用于传输,目的,由于http是明文传输,当输入密码若直接发送服务端验证,此时被截取将直接获取到明文密码,获取用户信息。第二次(服务端):当获取到前端发送来的密码后。通过MD5(密码+随机盐值)再次生成密码后存入数据库。防止数据库被盗的情况下,通过md5反查,查获用户密码。方法是盐值会在用户登陆的时候随机生成,并存在数据库中,这个时候就会获取到。...
2022-03-11 23:26:47
5578
原创 可达性分析算法与强弱引用
可达性算法是判断对象是否能够被GC Root节点链接,来筛选存活对象和死亡对象的一种算法,这里的“链接”指的是Java语言当中的引用:强引用,软引用,弱引用,虚引用。四种引用:强引用强引用就是指在程序代码中普遍存在的,类似Object obj = new Object()这类似的引用,只要强引用在,垃圾搜集器永远不会搜集被引用的对象。也就是说,宁愿出现内存溢出,也不会回收这些对象。软引用软引用是用来描述一些有用但并不是必需的对象,在Java中用java.lang.ref.SoftReference
2022-03-10 21:51:57
203
原创 类的符号引用和直接引用
在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用。1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可以是任何形式的字面量,只要使用时能够无歧义的定位到目标即可。例如,在Class文件中它以CONSTANT_Class_info、CONSTANT_Fieldref_info、CONSTANT_Methodref_info等类型的常量出现。符号引用与虚拟机的内存布局无关,引用的目标并不一定加载到内存中。在
2022-03-08 20:40:31
867
原创 对象的访问定位有哪两种⽅式?
建⽴对象就是为了使⽤对象,我们的Java程序通过栈上的 reference 数据来操作堆上的具体对象。对象的访问⽅式有虚拟机实现⽽定,⽬前主流的访问⽅式有①使⽤句柄和②直接指针两种:句柄: 如果使⽤句柄的话,那么Java堆中将会划分出⼀块内存来作为句柄池,reference 中存储的就是对象的句柄地址,⽽句柄中包含了对象实例数据与类型数据各⾃的具体地址信息;直接指针: 如果使⽤直接指针访问,那么 Java 堆对象的布局中就必须考虑如何放置访问类型数据的相关信息,⽽reference 中存储的直
2022-03-07 22:55:59
853
原创 Java对象的创建过程
2.4.2.1. Step1:类加载检查虚拟机遇到⼀条 new 指令时,⾸先将去检查这个指令的参数是否能在常量池中定位到这个类的符号引⽤,并且检查这个符号引⽤代表的类是否已被加载过、解析和初始化过。如果没有,那必须先执⾏相应的类加载过程。2.4.2.2. Step2:分配内存在类加载检查通过后,接下来虚拟机将为新⽣对象分配内存。对象所需的内存⼤⼩在类加载完成后便可确定,为对象分配空间的任务等同于把⼀块确定⼤⼩的内存从 Java 堆中划分出来。分配⽅式有 “指针碰撞” 和 “空闲列表” 两种,选
2022-03-07 22:54:17
263
原创 联合索引abc最左匹配问题
网上查找了很多文章,参差不齐,遂亲手实验了一番。建了一张表名为abc的表,联合索引字段为abc的字段,里面有三个字段a、b、c;条件为a、b、c:条件为a、c
2021-12-16 15:24:23
1873
原创 Java虚拟机基础学习
对象内存分配1.指针碰撞法2.空闲列表法存在线程安全问题TLAB方式:UseYLAB默认情况下占用了eden空间的1%TLABWasteTargetPercent占用年轻代占用对空间的三分之一,老年代占用堆空间的三分之二如果需要分配的内存大小已经超过了TLAB规定的大小,此时不会采用TLAB分配好的buffer,使用CAS竞争的方式申请空间。堆和栈之间的指向问题:方法中生成的对象,会存在栈中变量指向堆中对象的情况1.直接饮用一次指向,如果对象发生了变化,就需要重新指向2.句柄.
2021-08-10 23:01:29
234
原创 You can‘t specify target table ‘example_table‘ for update in FROM clause
今天写SQL的时候遇到一个坑爹的报错You can’t specify target table ‘example_table’ for update in FROM clause我的
2021-07-08 13:22:17
100
原创 SpringMVC执行流程
浏览器发出请求到前端控制器(DispatcherServerlet) 通过 HandlerMapping识别当前请求路径,找到对应的Handler,返回HandlerChain。其中包含:handler+Interceptor;HandlerAdapter执行HanderChain,依次执行拦截器handler,并完成请求参数封装,和响应中的Json格式转换,最终返回ModelAndView;ViewResolver,根据ModelAndView,解析出一个View对象;View,完成请求的转发和重定
2021-05-14 10:21:00
54
原创 笔记-Java各类锁
摘抄自美团技术团队-不得不说的Java锁事1.乐观锁 VS 悲观锁乐观锁与悲观锁是一种广义上的概念,体现了看待线程同步的不同角度。在Java和数据库中都有此概念对应的实际应用。先说概念。对于同一个数据的并发操作,悲观锁认为自己在使用数据的时候一定有别的线程来修改数据,因此在获取数据的时候会先加锁,确保数据不会被别的线程修改。Java中,synchronized关键字和Lock的实现类都是悲观锁。而乐观锁认为自己在使用数据时不会有别的线程修改数据,所以不会添加锁,只是在更新数据的时候去判断之前有没有
2021-02-25 14:46:02
95
原创 MySQL索引(纯笔记干货)
InnoDB引擎下的MySQL索引结构默认为B+树,少部分为Hash桶有聚集索引,非聚集索引之分加索引后查询效率变快、增删改变慢(为了维护B+树结构)主键索引为聚集索引非聚集索引和聚集索引一样,采用平衡树作为索引,每次给字段建立一条索引,字段中的数据就会被复制出来一份,用于生成新的索引,给表添加太多索引会增加表的体积,占用磁盘存储空间。非聚集索引和聚集索引的区别在于, 通过聚集索引可以查到需要查找的数据, 而通过非聚集索引可以查到记录对应的主键值 , 再使用主键的值通过聚集索引查找到需要的数据,
2021-01-22 15:22:55
146
原创 InnoDB和MyIsam之间的区别
InnoDB是 MySQL 默认的事务型存储引擎,只有在需要它不支持的特性时,才考虑使用其它存储引擎。实现了四个标准的隔离级别,默认级别是可重复读(REPEATABLE READ)。在可重复读隔离级别下,通过多版本并发控制(MVCC)+ Next-Key Locking 防止幻影读。主索引是聚簇索引,在索引中保存了数据,从而避免直接读取磁盘,因此对查询性能有很大的提升。内部做了很多优化,包括...
2019-09-28 14:27:45
102
原创 cloudin云英jJava研发--面经
Cloudin云英一面比较顺利先做了五道笔试题HTTPS了解吗?协程是什么了解吗?手写一个栈结构说一下什么是事务用过什么开发框架?对我的评价:跟我聊的还不错紧接着二面(面试官一副寒酸样,但是牛批哄哄的。。。这让我很不爽,我明明很有礼貌)给了我两道算法题让我手写,有一道题明明是自己出题不严谨还指责我说:明明知道这个东西无解还做?(MDZZ,你认个错能死吗)我写的时候他在那里啪...
2019-09-26 18:43:45
153
原创 HTTP HTTP1.0 HTTP1.1 HTTPS HTTP2.0
https://www.cnblogs.com/heluan/p/8620312.html
2019-09-22 14:15:59
103
原创 数据库基础知识点
ORDER BYORDER BY 语句默认按照升序对记录进行排序。降序就在"ORDER BY+列"后面加 DESC 关键字。DISTINCT返回唯一不同的值。IFNULLIFNULL() 函数用于判断第一个表达式是否为 NULL,如果为 NULL 则返回第二个参数的值,如果不为 NULL 则返回第一个参数的值。IFNULL() 函数语法格式为:IFNULL(expression, ...
2019-09-22 08:39:46
126
原创 二叉树
二叉排序树=二叉搜索树=二叉查找树=BST 没有相等的节点1.查找效率最好O(logn),最坏O(n)2.插入效率和查找效率相同(只插入叶子节点)3.删除效率最好O(logn)+O(1)->只有左子树或者右子树AVL树是自平衡二叉查找树,左右子树高度差不超过1,增加和删除都需要左旋右旋维持平衡,旋转方式:LL RR LR RL。AVL树适合用于插入删除次数比较少,但查找多的情况。...
2019-09-12 19:29:47
97
原创 Linux常用命令20+条
Java面试必备的Linux基本命令,找了很久找不到一个比较常用的命令总结,下面这篇文章还不错,比较推荐食用,一般的博客都是程序猿自己写的,有时候还会出错,有时候写的不详细还得二次搜索一遍。链接:http://www.imooc.com/article/2817上面的命令是基本的入门级别的必备命令,如果想看大而全的还是去菜鸟教程之类的地方看吧。。。...
2019-09-11 15:36:13
175
原创 借贷宝———面经
我被面试官连续问了一个小时问的问题是什么问题呢就是下面的问题啦:HTTP协议,TCP/IP协议,MySQL,表的操作,左连接右连接,银行家算法,JVM有什么结构?JVM中的栈、堆结构是干什么的?为什么是这种结构?索引是什么?索引的底层实现是什么?用手画出B+树的建立过程,快排算法你了解吗,排序算法的稳定吗?什么是排序算法的稳定性?编译原理的实现过程是什么?怎么选出两个大文件中相同的单词?Has...
2019-09-09 21:22:42
294
原创 为什么有了foreach还要有迭代器?
1foreach需要知道自己的集合类型,甚至要知道自己集合内的元素类型,不能实现多态。这个使用的语法上都可以表示出来。foreach可以遍历任何集合或者数组,但是使用者需要知道遍历元素的类型。Iterator是一个接口累心,它不关心集合的累心和集合内的元素类型,因为它是通过hasnext和next来进行下一个元素的判断和获取,这一切都是在集合类型定义的时候就完成的事情。迭代器统一了对容器的访问...
2019-09-07 15:38:49
720
原创 Java Lambda表达式
Lambda 表达式,也可称为闭包,它是推动 Java 8 发布的最重要新特性。Lambda 允许把函数作为一个方法的参数(函数作为参数传递进方法中)。使用 Lambda 表达式可以使代码变的更加简洁紧凑。语法lambda 表达式的语法格式如下:(parameters) -> expression 或 (parameters) ->{ statements; }以下是lam...
2019-09-04 10:39:36
296
原创 Java容器基本方法
HashSet基于HashMap的只存储不重复的元素的集合增加元素 set.add(null)删除元素set.remove(num)对比查找set.contains(num)清空集合set.clear()获取长度int len=set.size()...
2019-08-25 19:32:07
225
原创 Java线程锁中的notify和notifyAll
notify()和notifyAll()都是Object对象用于通知处在等待该对象的线程的方法。void notify(): 唤醒一个正在等待该对象的线程。void notifyAll(): 唤醒所有正在等待该对象的线程。两者的最大区别在于:notifyAll使所有原来在该对象上等待被notify的线程统统退出wait的状态,变成等待该对象上的锁,一旦该对象被解锁,他们就会去竞争。not...
2019-08-23 19:28:32
331
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人