- 博客(116)
- 收藏
- 关注
原创 反射修改原型模式中未深克隆的String类型属性
结论:1、直接赋值的方式,对原型模式中未深克隆的String类型属性无影响2、反射修改原型模式中未深克隆的String类型属性,未重新赋值的所有实例中String类型属性也会发生变化;从安全的角度考虑,有被恶意破坏的风险...
2022-06-14 09:54:02
193
原创 PageHelper分页插件原理分析
PageHelper类图创建Page对象,赋值起始页和页大小,放入ThreadLocal中Page类图PageInterceptor类图通过拦截器,改写sql,先用count(0)查出总数,然后赋值给ThreadLocal中的Page对象具体的分页查询,则是在sql中拼接LIMIT来实现;调用流程如下不同的数据库,分页sql可能有所不同...
2022-06-08 11:50:41
323
原创 continue a;与break a;跳转代码块
continue a;与break a;除了在多层循环中可以控制跳转的循环层级;;也可以直接跳转对应的代码块。如下演示:
2022-06-07 10:36:42
192
原创 Java实现KMP算法
直接上算法实现及测试代码public class KMP { public static int getIndexOf(String s1, String s2) { if (s1 == null || s2 == null || s2.isEmpty() || s1.length() < s2.length()) { return -1; } char[] str1 = s1.toCharArray();
2022-05-31 00:58:32
291
原创 String、StringBuilder、StringBuffer
相同点:1、三个类都被final修饰,代表了不可被继承2、内部都是使用char数组来存储数据不同点:1、String无继承的父类;StringBuilder、StringBuffer继承了AbstractStringBuilder2、String中的char数据被final修饰,这也是其不可变的原因;3、StringBuilder存在并发安全的问题,StringBuffer通过在实例方法上加synchronized来保证线程安全...
2022-05-26 14:53:39
116
转载 请求转发(Forward)和重定向(Redirect)的区别
转载于昊子豪的博客请求转发(Forward)和重定向(Redirect)的区别forward(转发):是服务器请求资源,服务器直接访问目标地址的URL,把那个URL的响应内容读取过来,然后把这些内容再发给浏览器.浏览器根本不知道服务器发送的内容从哪里来的,因为这个跳转过程实在服务器实现的,并不是在客户端实现的所以客户端并不知道这个跳转动作,所以它的地址栏还是原来的地址.redirect(重定向):是服务端根据逻辑,发送一个状态码,告诉浏览器重新去请求那个地址.所以地址栏显示的是新的URL.转发是
2022-05-18 12:25:41
1543
转载 Zookeeper选举算法原理
转载于神码是浮云的博客Zookeeper选举算法原理Leader选举Leader选举是保证分布式数据一致性的关键所在。当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举。(1) 服务器初始化启动。(集群的每个节点都没有数据 → 以SID的大小为准)(2) 服务器运行期间无法和Leader保持连接。(集群的每个节点都有数据 ,或者Leader 宕机→ 以ZXID 和 SID 的最大值为准)服务器启动时期的Leader选举若进行Leader选举,则至少需要2
2022-05-18 11:39:29
1115
原创 PostpreSQL下载、安装、测试
官网地址:https://www.postgresql.org/下载地址:https://www.enterprisedb.com/downloads/postgres-postgresql-downloads中文社区:http://www.postgres.cn/v2/home下载好后,直接双击安装包开始安装选择要安装的目录选择要安装的内容选择数据存储的位置输入管理员的密码 (账号为:postgres)密码:postgres选择端口下来一直Next就行点击Finish,
2022-03-28 00:15:12
845
原创 合并K个有序链表
合并K个有序链表(附带leetcode测试地址)源码package suanfa.lianbiao;import java.util.PriorityQueue;// 测试链接:https://leetcode.com/problems/merge-k-sorted-lists/public class MergeKSortedListsTest { public static ListNode mergeKLists(ListNode[] lists) { if (
2021-12-29 00:39:22
155
原创 合并2个有序链表
合并2个有序链表(附带leetcode测试地址)源码package suanfa.lianbiao;// 测试链接:https://leetcode.com/problems/merge-two-sorted-listspublic class MergeTwoSortedListsTest { public static ListNode mergeTwoLists(ListNode l1, ListNode l2) { if (l1 == null || l2 ==
2021-12-29 00:37:58
397
原创 双链表反转
双链表的3中反转方式,附带简单测试。源码package suanfa.lianbiao;import java.util.Stack;public class ReverseDoubleTest { public static void main(String[] args) { DoubleNode doubleNode1 = new DoubleNode(1, null); DoubleNode doubleNode2 = new DoubleNod
2021-12-29 00:34:49
525
原创 单链表反转
单链表的3中反转方式,附带简单测试。源码package suanfa.lianbiao;import java.util.Stack;public class ReverseListTest { public static void main(String[] args) { Node node1 = new Node(1, null); Node node2 = new Node(2, node1); Node node3 = new
2021-12-29 00:32:51
238
原创 FileOutputStream和BufferedOutputStream基础测试
对文件IO中的FileOutputStream和BufferedOutputStream进行了一个基础的测试:对相同的数据循环写10秒,然后看输出文件的大小。测试代码如下:package com.myspringboot.io.file;import java.io.BufferedOutputStream;import java.io.File;import java.io.FileOutputStream;import java.util.concurrent.TimeUnit;p
2021-12-28 21:11:54
426
原创 Java创建不可修改的静态常量集合
如下代码举例了:List、Map、Set的创建方式源码import java.util.*;public class ConstantUtil { public static final List<String> LIST; public static final Map<String, String> MAP; public static final Set<String> SET; static { Arra
2021-10-26 20:55:46
1227
原创 TDD——测试驱动开发(Test-Driven Development)
TDD测试驱动开发(Test-Driven Development)在编码之前,先将测试用例编写好,然后再基于用例去编写满足的代码;然后再添加一个用例,再调试、修改代码,依次类推。类似于算法题的测试用例。
2021-07-29 00:19:33
271
原创 SpringCloud面试
注册中心服务与服务之间进行通信,需要知道彼此的IP、端口、服务名等信息,在单机或单间点部署的时候,这些信息直接写死在代码或配置文件中;而在集群架构下,服务与服务之间的关系变得极为复杂,这时候再将这些信息写死在每个服务中就变得很麻烦,并新增节点或服务下线变得很难处理。这时候,就有了注册中心的概念,每个服务只需要知道注册中心的IP、端口、服务名就可以将自己的IP、端口、服务名全部发送给注册中心;而需要调用其他服务的时候,也是直接在注册中心中去取就可以;使得服务之间不在绑定死,并新增节点或服务下线对应的状态
2021-07-28 01:40:34
177
原创 多线程面试
线程间通信一个JVM中的话,可以使用类属性,全局变量,对象等,主要就是依赖于JVM中的共享资源;除此之外,也可以采用写文件、Redis、MySQL等,在不同的应用中的话也可以通http等网络请求也可以。当然这其中也存在着线程安全的问题,可以使用加锁或volatile+CAS,或者分布式锁等来进行处理。虚假唤醒也就是生产消费模型里面,为什么使用的while去判断,而不是if;因为使用if的话,在线程阻塞,释放锁后,当再次被唤醒时,则不会再去判断是否满足运行条件,导致意想不到的情况发生;而使用while,
2021-07-26 01:19:04
139
原创 MySQL面试
高阶函数第二个就是分组排序并添加序号,我们有时候需要对表中的数据进行分组,并根据组内信息进行重新编号,这样的操作就是分组编号排序,select ROW_NUMBER() over(partition by t3.customerId order by t3.uid) as rownum其中partition by就是按照那个字段进行分组,order by是组内数据的排序.ROW_NUMBER()函数用于生成具体的行号,每个分组的行号都是从1开始,如果不指定partition by就会直接进行检索数据
2021-07-26 01:14:20
205
原创 MySQL索引
与表独立存放(文件存储)B+树创建索引create index index_name on tab_name(col_name);删除索引drop index index_name;回表覆盖组合最左局部性原理(空间局部性)(时间局部性)随机读取、顺序读取磁盘预读(预读的长度一般为页(page(通常为4k))的整数倍)聚簇索引:数据和索引放在一起(Innodb)非聚簇索引:数据和索引单独一个文件(MyISAM)主键自增(自增锁)(可以避免页分裂(利用
2021-07-21 01:41:46
217
原创 MySQL事务
Innodb数据库引擎ACIDA:原子性(事务是一个原子操作,所有的操作全部成功或全部失败,没有中间状态)C:一致性(事务开始和结束时,数据都必须保持一致状态)I:隔离性(数据库系统提供了一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行)D:持久性(事务完成后,对数据库的修改是永久性的,即使出现系统故障也能够保持数据也不丢失)产生数据不一致的情况脏读不可重复读幻读事务的四个隔离级别:从上往下,隔离级别越来越高,意味着数据越来越安全读未提交读已提交可重复读(默认)
2021-07-21 01:36:40
223
2
原创 MySQL随笔
SQL语句——>根据关键词(FROM,WHER)等进行解析,生成抽象语法树(AST)开启耗时set profiling=1;显示耗时show profiles;show profile;精确查询哪一条SQL数据库三范式(为了解决数据库的冗余,(和Java提取公共函数、属性一样))第一范式(列不可分,字段值直接完整使用,不能拆分、截取等,只匹配字段值中的一部分,需要将字段拆分成多个单独的字段)第二范式(列必须直接依赖主键,同一张表中重复出现的值,需要拆分成新的表)第三范式
2021-07-21 01:19:37
185
1
原创 常见的垃圾回收器
分代JDK诞生 Serial追随(单线程)提高效率,诞生了PS(多线程并行)为了配合CMS,诞生了PN,CMS是1.4版本后期引入,CMS是里程碑式的GC(并发),但是CMS毛病较多,因此目前任何一个JDK版本默认是CMS年轻代Serial 年轻代 串行回收PS 年轻代 并行回收ParNew 年轻代 配合CMS的并行回收老年代SerialOldParallelOldCMS,垃圾回收和应用程序同时运行,降低STW的时间(200ms),但是会有碎片化的问题,碎片到达一定程度,.
2021-07-18 00:59:13
231
原创 ZooKeeper分布式锁原理
watch+回调函数/lock/a会有事件:eventcreatedeletechangechildren1,争抢锁,只有一个人能获得锁2,获得锁的人出问题,临时节点(session)。3,获得锁的人成功了。释放锁。4,锁被释放、删除,别人怎么知道的?4-1:主动轮询,心跳。。。弊端:延迟,压力4-2:watch: 解决延迟问题。。 弊端:压力4-2:sequence+watch:watch谁?watch前一个,最小的获得锁~!一旦,最小的释放了锁,成本:zk只给第二个发事
2021-07-17 15:06:39
156
转载 Redisson分布式锁原理
使用原理图(1)加锁现在某个客户端要加锁。如果该客户端面对的是一个redis cluster集群,他首先会根据hash节点选择一台机器。这里注意,仅仅只是选择一台机器!这点很关键!紧接着,就会发送一段lua脚本到redis上,那段lua脚本如下所示:为啥要用lua脚本呢?因为一大坨复杂的业务逻辑,可以通过封装在lua脚本中发送给redis,保证这段复杂业务逻辑执行的原子性。那么,这段lua脚本是什么意思呢?KEYS[1]代表的是你加锁的那个key,比如说:RLock lock =
2021-07-17 02:28:48
289
原创 Java集合容器
物理上只有两种,连续存储型的:数组;和跳转型的:链表。Vector、HashTable每个方法都加的synchronized锁SynchronizedHashMap是在方法中加的synchronized同步块ConcurrentHashMap用的CAS三者的性能差异不是绝对的,需要根据具体的业务场景进行测试CopyOnWriteList适用于读操作特别多,写操作少的情况Queue -> List(两者的区别)Queue提供了对线程友好的API offer peek pollBlock
2021-07-14 00:44:12
134
原创 ReentrantLock
Lock lock = new ReentrantLock();(创建锁对象)lock.lock();(上锁)lock.unlock();(必须要手动释放锁,(在finally中释放))lock.trylock();lock.lockinterupptibly();Condition producer = lock.newCondition();(创建同步队列)Condition consumer = lock.newCondition();producer.await();(等待)cons
2021-07-14 00:42:15
141
原创 CAS杂项
(无锁优化、自旋、乐观锁)Compare And Setcas(V,E,New)if V==EV=Newotherwise try again or failCPU原语支持(原子性)ABA问题业务不需要处理的,就不用处理;需要处理的,就增加versionVarHandle(JDK9)(1, 普通属性也可以进行原子操作,2,比反射快,直接操作二进制码)ThreadLocalsetThread.currentThrea.map(threadLocal, object)(设置到了当前线
2021-07-14 00:40:41
146
原创 Redis集群
持久化RDB+AOFRDB,通过fork+copy on writefork只复制指针操过很快,保证数据时点性copy on write 父进程在写操作时,会先复值对应的数据,再进行修改,保证数据的隔离性单机单点故障、容量有限、性能瓶颈AKFX:全量,镜像Y:业务,功能Z:优先级,逻辑再拆分CAPC:一致性A:可用性P:分区容错性提供高可用性(high availability)主从主节点具有读写功能,从节点通过RDB+AOF+缓存消息队列同步主节点数据,从节点只有读的功能
2021-07-13 01:39:15
150
转载 多线程与高并发(全)
本文转自我狗哥——Zs夏至 的博客https://www.cnblogs.com/Zs-book1/p/13926198.html多线程与高并发(全)多线程与高并发目录多线程与高并发一、了解多线程什么是进程?什么是线程?并发与并行的区别临界区学习线程必须知道的概念:二、 线程的使用三种方式的区别线程的方法线程的状态三、SynchronizedJMM模型volatilesynchronizedsynchronized的使用synchroni
2021-07-11 18:07:57
375
转载 redis-详解
本文转自我狗哥——Zs夏至 的博客https://www.cnblogs.com/Zs-book1/p/13926198.htmlredis-详解目录\1. redis 安装redis是什么?从上面的解释引出新的问题:关系型数据库和非关系型数据库:为什么要使用redis?1.1 简单安装redis1.2 将redis作为linux的服务启动redis 的数据类型string类型set 添加一条数据append value追加get 根据key
2021-07-11 18:01:05
248
原创 六大设计原则
可维护性(修改功能,需要改动的地方越少,可维护性就越好)可复用性(代码可以被以后重复使用(自己写的类库))可扩展性(添加功能无需修改原来代码)灵活性(代码接口可以灵活调用)单一职责原则(高内聚,低耦合)开闭原则(对扩展开放,对修改关闭(尽量不修改原来代码的情况下进行扩展))(抽象化,多态是开闭原则的关键(扩展子类)) 里氏替换原则(所有使用父类的地方,必须能够透明的使用子类对象(不需要修改其他代码))依赖倒置原则(依赖抽象,而不是依赖具体(面向接口编程))接口隔离原则(每
2021-07-10 01:55:51
125
原创 JVM随笔
jconsole远程监控java -Djava.rmi.server.hostname=192.168.5.132 -Dcom.sun.management.jmxremote -Dcom.sun.management.jmxremote.port=11111 -Dcom.sun.management.jmxremote.authenticate=false -Dcom.sun.management.jmxremote.ssl=false -Xms100M -Xmx100M -XX:+PrintGC Fu
2021-07-10 01:51:07
151
原创 Redis随笔
getsetmgetdelbitmap 统计登录天数和日活list 栈、队列、数组、阻塞单播队列hash 点赞、收藏、详情(不用再去数据库中不同的表用查询,一次直接获取所需的所有值)。。。set 随机事件,抽奖sorted_set 排行榜等。。。。skip list 跳跃表管道nc localhost 6379echo -e “set ks ss \n get ks” | nc localhost 6379单机 ,单点,自己根据熔断,重启的原理,简单实现。Redis
2021-05-23 23:39:37
179
原创 Java多线程随笔
CPU性能压榨程序:XX.exe进程:操作系统对程序分配资源的基本单位(一个进程中可以包含多个线程)线程:调度执行的基本单位(多个线程共享进程的资源)线程切换:会消耗资源(线程上下文切换)CPU密集型:计算IO密集型:等待输入、输出,拷贝单核CPU也可以设定多线程(在线程等待期间,可以执行其他线程)工作线程并不是越大越好,根据CPU核数和压测,以及预留N线程数=N物理核数U期望利用率(1+W等待时间/C计算时间)接口比类更灵活线程6种状态:如何让优雅的停止一个线程?为什么不建议用s
2021-05-23 23:36:59
172
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人