- 博客(33)
- 收藏
- 关注
原创 MySQL三大日志
从而解决了redo log 和 bin log 日志之间的逻辑一致问题。日志,就会回滚该事务。MVCC的实现,事务。的写入拆成了两个步骤。日志恢复数据时,发现。
2024-01-17 14:38:48 871
原创 SQL语法基础知识
on后面是连接条件,决定临时表的生成,而where在临时表生成以后,对临时表中的数据进行过滤,生成最终的结果集。大多数情况下,索引查询能提高查询性能,但如果数据库的数据量不大,使用索引也不一定能够带来很大提升。count(column name)会忽略null行,但count(*)不会。可以大大加快 数据的检索速度。但创建索引和维护索引也需要耗费许多时间和空间。存储过程可以是对一系列 SQL 操作的批处理。语句用于向表中插入新记录,可以插入查询出来的结果。索引是一种用于快速查询和检索数据的。
2024-01-12 11:02:24 1067
原创 布隆过滤器
一种来检索元素是否在给定大集合中的数据结构,该数据结构由位数组和一系列哈希函数组成,高效但是具有一定的错误识别率和删除难度。2. 布隆过滤器的原理使用布隆过滤器中的哈希函数对元素取值,根据得到的哈希值将位数组中对应的下标置为1。如果需要判断一个元素是否存在于布隆过滤器,对给定元素再次进行相同的哈希计算,如果位数组中的每个元素都为 1,则该元素存在,否则不存在。
2024-01-07 15:30:54 297
原创 Java8新特性
流采用惰性计算的方式。只有在需要结果的时候,流才会开始执行操作流框架。并且流会根据整个操作链构建一个优化的执行计划,因此在执行返回。的方法时,并不立刻执行,而是等返回一个非。
2023-12-28 10:37:58 336
原创 JVM相关参数
MetaspaceSize 表示 Metaspace 使用过程中触发 Full GC 的阈值,默认的元空间的最大值是无限。注意: Full GC 的成本远高于 Minor GC,因此尽可能将对象分配在新生代。1. 垃圾回收占用的时间比例阈值,避免程序在运行时花费过多时间在垃圾回收。# 强引用/弱引用/软引用/虚引用/finalize 相关的方法。# 设置为 1 表示在 JVM 启动时立即输出一次安全点统计信息。# 日志文件最多分割几个文件,超过之后从头文件开始写。设置老年代与新生代内存的比值。
2023-12-27 10:42:32 353
原创 类加载器介绍
当前类可以不使用自己的类加载器,而是用当前线程的上下文类加载器。它允许在运行时动态地切换类加载器。判断当前类是否被加载过-》加载请求委派给父类加载器去完成,最终都会传送到顶层的启动类加载器。在双亲委派模型中,每个类加载器都有一个父加载器,并且加载器之间的关系是组合的。-》父类加载器无法完成加载,则由子加载器加载,子加载器无法加载时抛出异常。如果自定义类加载器若不想打破双亲委派模型,就重写。无法被父类加载器加载的类最终会通过。方法,就可以改变加载类的执行流程。加载 Java 类的字节码(
2023-12-26 20:19:46 19
原创 类加载详解
在 JVM 生命周期内,由 jvm 自带的类加载器加载的类是不会被卸载的。但是用户自定义的类加载器加载的类是可能被卸载的。创建的,而是 JVM 在需要的时候自动创建的,数组类通过。方法获取该数组的元素类型的。注意: 数组类不是通过。加载-》链接-》初始化。
2023-12-26 10:39:28 18
原创 class文件详解
字段表中包括类级变量以及实例变量,但不包括在方法内部声明的局部变量。修饰符(不会被序列化)不可以修饰方法,只能修饰字段。修饰符(共享变量)和。
2023-12-26 09:56:43 28
原创 JVM垃圾回收机制
JVM的内存管理主要是针对对象内存的分配与回收,而几乎所有的对象都被分配在堆中,因此堆是垃圾回收的主要区域,也称GC堆。对象作为起点,从这些节点开始向下搜索,得到引用链,当一个对象到 GC Roots 没有任何引用链相连的话,则证明此对象是不可用的。把新生代的对象提前转移到老年代中去,除此之外,大对象会直接进入老年代以减少新生代的垃圾回收频率。虚引用必须和引用队列联合使用,虚引用对象在垃圾收集器准备回收它时,该虚引用会被加入到与之关联的引用队列中。注意: 弱、虚引用使用的较少,软引用使用的较多,
2023-12-25 15:45:09 26
原创 ThreadLocal类详解
对象可以提供线程局部变量,每个线程Thread拥有一份自己的,多个线程互不干扰。注:以上代码为Thread类的成员变量。
2023-12-25 09:29:42 55
原创 并查集理论基础
注意:join函数中 我们需要寻找 u 和 v 的根,然后再进行连线在一起,而不是直接 用 u 和 v 连线在一起。因此不能调用isSame函数对其进行优化。路径压缩后的并查集时间复杂度在O(logn)与O(1)之间,且随着查询或者合并操作的增加,时间复杂度会越来越趋于O(1)通过不断递归找到根节点,加入节点时将非根节点直接指向根节点。o(n),用于申请father数组。2. 判断两个元素是否在同一个集合。1. 将两个元素添加到一个集合中。
2023-12-13 14:47:08 34 1
原创 并发编程 Ⅱ
线程池数量太小,如果在同一时间有大量请求需要处理,可能会导致大量的任务在任务队列中排队等待执行,甚至导致 OOM。当有任务要处理时,直接从线程池中获取线程来处理,处理完之后线程并不会立即被销毁,而是等待下一个任务。此外, 若线程数需要根据项目实际线上运行情况来动态调整,可以对线程池的核心参数实现自定义可配置。线程数量太大,大量线程可能会争夺 CPU 资源,导致大量的上下文切换,从而增加线程的执行时间,影响了整体执行效率。如果当前同时运行的线程数量达到最大线程数量并且队列也已经被放满了任务时,对新任务。
2023-12-10 11:03:27 29 1
原创 锁机制介绍
当多个线程同时使用 CAS 操作一个变量时,只有一个会胜出,并成功更新,其余均会失败,但失败的线程并不会被挂起,仅是被告知失败,并且允许再次尝试,当然也允许失败的线程放弃操作。共享资源不会加锁,线程可以不停地执行访问资源的代码,无需加锁也无需等待,只是在提交修改的时候去验证对应的资源(也就是数据)是否被其它线程修改了(具体方法可以使用版本号机制或 CAS 算法)。时,会尝试获取对象的锁,如果锁的计数器为 0 则表示锁可以被获取,获取后将锁计数器设为 1。线程 A 要更新数据值时,在读取数据的同时也会读取。
2023-12-08 15:28:48 24
原创 Java内存模型
CPU 缓存则是为了解决 CPU 处理速度和内存处理速度不对等的问题。现代的 CPU Cache 通常分为三层,分别叫 L1,L2,L3 Cache。先复制一份数据到 CPU Cache 中,当 CPU 需要用到的时候就可以直接从 CPU Cache 中读取数据,当运算完成后,再将运算得到的数据写回 主存中。这样就导致存在。CPU 为了解决内存缓存不一致性问题可以通过制定缓存一致协议(比如)或者其他手段来解决。
2023-12-07 21:01:44 23 1
原创 并发编程 I
程序计数器私有主要是为了线程切换后能恢复到正确的执行位置。为了保证线程执行方法时局部变量不被别的线程访问到。并行与并发并发:多个作业在同一时间段内一起执行并行:多个作业在同一时刻一起执行。
2023-12-07 18:48:04 26 1
原创 ConcurrentHashMap
是线程安全的 HashMap, JDK1.7 的底层采用分段的数组+链表实现,JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表/红黑二叉树。
2023-12-07 14:42:11 18 1
原创 HashMap
HashMap 主要用来存放键值对,其中null 作为键只能有一个,null 作为值可以有多个。JDK1.8 之前 HashMap 由 数组+链表 组成,JDK1.8 之前 HashMap 由 数组+链表/红黑树组成。
2023-12-06 14:10:15 29 1
原创 LinkedList
ArrayList是一个基于双向链表实现的集合,由于无法对元素进行随机访问,LinkedList仅仅在头尾插入或者删除元素的时候时间复杂度近似 O(1),其他情况增删元素需要移动到指定位置,平均时间复杂度都是 O(n)。ArrayList的性能通常会比LinkedList更好,所以不要下意识地认为LinkedList作为链表就最适合元素增删的场景。
2023-12-06 09:38:07 69 1
原创 ArrayList
ArrayList的底层实现是一个Object[]数组容量能动态增长,线程不安全。ArrayList实现了List说明其是一个列表,实现RandonAccess(标志性接口) 说明其支持随机访问,实现了表明它可以进行序列化操作,实现Cloneable表明它可以进行深浅拷贝操作。
2023-12-05 18:44:03 19 1
原创 深拷贝、浅拷贝、引用拷贝
浅拷贝会在堆上创建一个新的对象,不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象(不同于深拷贝)。深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。引用拷贝就是两个不同的引用指向同一个对象。话不多说,直接上图!
2023-12-04 20:26:28 28
原创 Java代理模式
1. JDK 动态代理只能代理实现了接口的类或者直接代理接口,而 CGLIB 可以代理未实现任何接口的类。2. CGLIB 动态代理是通过生成一个被代理类的子类来拦截被代理类的方法调用,因此不能代理声明为 final 类型的类和方法。3.JDK 动态代理有一个最致命的问题是其只能代理实现了接口的类。4. 静态代理在编译时就将接口、实现类、代理类这些都变成了一个个实际的 class 文件。而动态代理是在运行时动态生成类字节码,并加载到 JVM 中的。
2023-11-29 14:47:39 20 1
原创 Java反射机制详解
注意:setAccessible()方法能在运行时压制Java语言访问控制检查(Java language access control checks),从而能任意调用被私有化保护的方法、域和构造方法。获取一个类的所有属性和方法,即便该属性为私有属性或私有方法。因此,反射破坏了类的封装性。注意:通过以上方式构造的对象调用了Person类的无参构造函数!具有分析类和执行类中方法的能力。反射指的是Java程序具有在。
2023-11-29 10:32:42 33 1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人