自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(29)
  • 收藏
  • 关注

原创 Java中的传值,是值传递还是引用传递?

看上面的代码,我在editUSer()方法里面修改了user的值,但是是先把user重新new了一遍,然后打印一下user的值,然后在main方法里面调用完之后打印一下user的情况。当然我们可以用一种比喻来形容一下上面的情况。你拿着你家的钥匙找到我,我把你的钥匙复制了一个,然后我去你家把你的ps5给干碎了,然后我出去了,等你回家的时候你发现,你的ps5已经碎的完完的了。这就好比我复制了你家的钥匙,然后把我造了一个和你家一样的房子,我进去之后一顿打砸,但是呢,打砸的其实是我的家,你的家还是完好无损。

2023-08-30 15:33:45 123

原创 Java之线程池原理

线程池原理为什么使用线程池?在进行线程池原理叙述之前,首先我们需要知道为什么使用线程池?1、首先我们知道创建或者销毁线程都需要消耗系统资源,使用线程池我们就可以复用已创建的线程。2、其次我们知道线程数量过多会导致资源浪费,从而导致服务器崩溃,所以线程池可以帮助我们控制并发的数量。3、线程池可以对线程做统一的管理。原理从源码中我们可以知道线程池的类是ThreadPoolExecutor,它实现了 Executor接口。其中构造函数有4个,必须参数是5个。首先我们先对必须参数进行描述。publi

2021-11-24 16:43:19 638 1

原创 Redis之基础数据结构

Redis中所有数据结构都是以唯一key字符串作为名称,然后通过这个唯一key获取相应的value,不同的数据结构类型就是指的value的类型。本文只简单介绍基础数据结构,对应数据结构的深入解析会在后面文章中叙述。String字符串是一种十分常见的redis数据存储结构,通常可以将数据序列化成json存储在redis中,使用时伴随着一次反序列化的过程。Redis中的字符串是动态字符串,是可以修改的,有点类似于Java中的ArrayList,采用预分配冗余空间的方式进行存储,所获取的空间要大于实际使用的

2021-11-21 13:06:54 1226

原创 Java之多线程中的同步与锁

对于顺序一致性模型,指令重排序和三级缓存的概念请参考我的上篇文章Java之多线程 ,这篇文章主要讲述的就是多线程中同步和锁的问题。volatilevolatile主要有2个功能,一个是保证变量的内存可见性,另一个就是禁止变量与普通变量的指令重排序。而JVM是怎么禁止进行重排序的呢?这里就不得不提到一个概念:内存屏障 。什么是内存屏障?从硬件方面来说分为两种,一种是读屏障,一种是写屏障。作用是,第一阻止屏障两侧指令重排序,第二是强制将高速缓冲区中的脏数据刷到主内存中,或者让缓存中相应数据失效,这里的缓存

2021-11-18 15:28:26 643

原创 Java之多线程

进程与线程进程是操作系统分配资源的最小单位,是静态的概念。线程是动态的概念,是程序执行的最小单位。一个ALU(算数逻辑单元)同一时间内执行执行一个线程,所以多线程就基于线程切换。线程切换提到线程切换,其实就是每个线程都是在规定的时间内执行,时间到了就需要切换到其他线程执行,这个过程也叫作时间片轮转,而每一次切换的时候都需要保存当前执行线程的状态,如执行到的指令,寄存器状态等,都需要记录到进程中的缓存中,进行上下文的保存,用于再回到这个线程执行时可以继续停止前的状态继续执行。而其实不是线程越多执行效率

2021-11-16 15:06:40 520

原创 MySQL之索引

哈希索引哈希索引是基于哈希表实现的,只有精确匹配索引所有列的查询才有效,对于每一行数据根据索引列计算出hashcode,存入hash表中,同时保存指向每一行数据的指针。在MySQL中只有memory显式的支持hash索引,是默认的索引类型,但是也支持B树索引,当然Memory中的hash索引是支持非唯一键值索引的,如果hashcode相同的话会以链表的形式进行存储。但是hash索引有比较多的问题,首先是无法通过键值直接查找到数据,而且存储也不是顺序的,所以就无法用于排序,同时不支持模糊索引列查询,因为建

2021-11-14 22:39:28 719

原创 Java之HashMap原理

HashMap是基于映射(键值对)处理的数据数据结构。是程序员使用的频率最高的数据结构之一,在jdk1.8之后引入红黑树,优化底层数据结构。传统的数据的数据结构是在内存中申请一段连续的内存空间,查询的时间复杂度为O(1),而插入和删除是O(n),因为伴随着数据的移动。...

2021-11-07 22:11:56 246

原创 数据结构与算法之根据后序遍历数组重建二叉搜索树

题:根据后序遍历数组重建二叉搜索树思路:根据二叉树特性,它的后序遍历的方式是先左节点然后右节点,然后再根节点,所以,这个树的根节点一定是数组的最后一个数,同时根据二叉搜索树的特性,小于根节点的树一定是在左树上,大于根节点的树一定是在右树上,所以可以通过遍历的方式,找到每个父节点的下级节点的数组范围,而遍历的过程可以通过二分查找来代替层级循环,时间复杂度为O(nlogn)代码:public static TreeNode buildProcess(int[] data, int l, int r){

2021-11-01 22:11:41 477

原创 数据结构与算法之二叉树

public class BinaryTree { public static void main(String[] args) { int[] dataList = {5,4,3,2,1,6,7,8,9,10}; Node node = new Node(dataList[0]); for (int i = 1; i < dataList.length; i++) { createNode(node,dataList

2021-11-01 20:37:09 122

原创 JVM之调优篇

内存泄漏与内存溢出内存溢出指在程序申请内存时,没有足够的内存可以分配,就是OOM,即使垃圾回收之后也不能有足够的空间分配。内存泄漏(Memory Leak)是指在程序运行后,没有释放所占用的内存空间,一次泄漏可能没有什么影响,但是长时间的内存泄漏,堆积到一定程度之后就会内存溢出。比如单例对象,生命周期和应用周期一样长,如果这个单例对象持有一个外部对象的引用的话,那么这个外部对象是不能回收的,则会产生内存泄漏。同时一些资源未关闭,如数据库连接,socket,io流等,使用之后未关闭,最后也会造成内存泄

2021-10-31 17:42:09 1137

原创 JVM之垃圾收集器

1、Serial收集器新生代的收集器,最早的收集器,单线程的,工作时需要暂停用户线程,会存在卡顿的现象,性能效率不高。是client模式的默认垃圾收集器,对应参数-XX:UseSerialGC2、ParNew收集器新生代的收集器,是Serial的多线程版本,Serial和ParNew可以配合CMS共同工作,在使用CMS的时候会默认使用ParNew作为新生代的收集器。3、Parallel Scavenge收集器新生代收集器,基于复制算法的并行多线程收集器,侧重于达到一个可控吞吐量,如虚拟机运行10.

2021-10-30 23:50:27 166

原创 JVM之垃圾回收算法

标记清除算法是最基础的垃圾回收算法,分为标记阶段和清除阶段。标记阶段需要标记出所有需要清除的对象,统一回收掉所有标记的对象,反之也可以通过标记出所有存活的对象,统一回收未标记的对象,可以通过可达性分析算法来标记对象是否存活。清除阶段就对标记的对象进行清除。优点: 实现简单,基于可达性分析算法。缺点: 如果存在大量的对象,那么需要标记和清除需要的时间就越长,执行效率不稳定。同时清除完导致内存空间不连续,导致内存空间碎片过多,导致后面创建较大对象时可能造成无法存储的问题,从而导致不得不再次进行垃圾回收。

2021-10-28 21:04:40 192

原创 JVM之常用核心参数

1、-Xms 设置堆内存大小2、-Xmx 设置堆最大内存3、-Xmn 设置堆内存中新生代的内存大小4、-XX:MetaspaceSize 设置元空间内存大小5、-XX:MaxMetaspaceSize 设置元空间最大内存大小6、-Xss 设置每个线程栈内存大小7、-XX:SurvivorRadio 设置Eden区和Survivor区比例,默认8:1:18、-XX:MaxTenuringThreshold 设置年龄阈值9、-XX:UseConcMarkSweepGC 指定使用CMS垃圾收集器

2021-10-28 20:32:28 328

原创 JVM之垃圾回收过程

可达性分析算法通过GCRoots作为起始根节点,然后向下搜索,根据引用关系标出哪些是可回收对象,哪些是不可回收对象,GCRoots所走过的路径称为引用链,那么不可达的对象就可以被垃圾回收器回收。可作为GCRoots的对象1、在虚拟机栈中的局部变量所引用的对象可作为GCRoot,譬如各个线程所执行的方法中的局部变量,参数,临时变量等等。2、元空间中静态变量所引用的对象。3、元空间中常量所引用的对象。4、本地方法中的所引用的对象。5、Java虚拟机内部的引用,如class对象,一些常驻的异常对象(

2021-10-27 22:01:05 984

原创 JVM之堆内存

对象在堆内存中是如何分配的?1、指针碰撞(Bump the Pointer)内存规整的情况下,内存的表现形式是连续的,分配时指针后移。2、空闲列表(Free List)内存不规整的情况下,选用那种方式分配取决于内存是否规整,而内存是否规整取决于所选的垃圾收集器的空间压缩能力。但是用Serial和ParNew等压缩过程的收集器时,采用的是指针碰撞的分配方式,当使用CMS基于清除算法的收集器的时候,理论上就会空闲列表方式。3、本地线程分配缓冲(Thread Local Allocation Buffe

2021-10-26 21:13:35 133

原创 JVM之类加载

类是什么时候被加载的?Java虚拟机规范中是没有指定什么时候加载类的,而是交给具体的虚拟机完成的。HotSpot虚拟机是按需加载,是在需要该类的时候加载这个类的。类的加载过程(生命周期)1、加载classpath、jar包、网络或某个磁盘位置下的类的class二进制字节流读进来,在内存中生成一个代表这个类的class二进制元信息放在元空间2、链接验证验证class文件字节流中包含的信息符合《JVM虚拟机规范》的全部约束要求,来保证虚拟机的安全。准备类常量赋值,类变量赋值的初始值,如int类

2021-10-25 21:36:17 133

原创 JVM之内存模型

内存模型虚拟机栈每一个线程开启执行方法的时候都会在虚拟机栈中开辟一块内存空间,每一个线程内方法调用的时候都会开启一块栈帧内内存空间,每一个方法的调用和结束都会伴随着入栈和出栈的过程,一个线程不会同时操作它的多个栈帧,只会执行栈顶的方法。局部变量表变量值的存储空间,主要存储的是方法参数和局部变量,虚拟机通过索引定位的方式使用。操作数栈是一个后入先出栈,是在算数运算或调用其他方法的时候进行参数传递的一块内存空间。在概念模型中,栈帧是独立的,但是通常情况下,操作数栈和局部变量表的一部分是重叠的,因为

2021-10-23 19:26:08 125

原创 MySQL之MVCC

事务的四大特性原子性(Atomicity)事务中的所有操作要么全部成功,要么全部失败一致性(Consistency)事务必须使数据库从一个一致性状态转变成另一个一致性状态,比如A和B一共有1000块钱,不管事务中两个人之间如何转账,事务结束的时候两个人的钱一共还是1000块。隔离性(Isolation)多用户并发访问的时候,事务之间是隔离的,相互之间不影响。持久性(Durability)事务一旦提交了,那么对数据库中数据的改变就是永久性的了。事务的隔离级别Read uncommitted

2021-10-20 21:18:30 132

原创 MySQL之聚簇索引与非聚簇索引

聚簇索引Innodb在进行数据存储的时候,一定会将数据和表的某一列绑定到一起,这个列可以是主键,如果没有主键选择唯一非空列,如果都没有,引擎会隐式的使用一个6字节的rowid作为这个列,根据这样的列来创建索引,并且一个表只有一个聚簇索引。非聚簇索引也称为二级索引,非聚簇索引的叶子节点中不再是整行记录,而是聚簇索引的id值,所以查询时使用二级索引的时候,通常需要进行回表。myisam存储引擎中只有非聚簇索引回表当使用二级索引进行查询的时候,因为二级索引的叶子结点上存储的是聚簇索引中的id值,所以需

2021-10-18 22:35:41 245

原创 数据结构与算法之超级水王问题

问题描述一个数组中,如果存在一个数,这个数出现的个数大于数组长度的一半,那么这个数就是水王数。常规解法遍历数组,用HashMap存储每个数出现的个数,然后找出符合条件的数据。时间复杂度为O(n),空间复杂度为O(n)。如果空间复杂度为O(1)的时候,常规解法则不适用。高级解法如果一个数是水王数,那么遍历数组的过程中依次删除掉,那么水王数一定会剩余下来,[1,2,2,2,1],反之,被剩下的不一定是水王数,如[1,2,3,4,5]。/** * 超级水王问题 * @desc 一个数组中,如果存在

2021-10-17 22:20:51 295

原创 MySQL之索引原理与数据结构

索引是为了快速查找数据的一种有序的数据结构。不选择二叉树作为索引的存储结构的原因二叉树的每个节点有2个子节点,当插入数据量较大的时候会导致树非常高,增大了IO的次数,导致读取数据变慢。而选择好的数据结构来减少IO次数是高效查询的关键。因此,B树与B+树应运而生。B树B树上的节点上存在数据,假设每个节点对应一个磁盘块,之多可以存储16条数据,那么三层高的树就能存16的三次方条数据,但是每一条数据都包含了指针,key和data,所以占用空间很大,能存储的的数据就相对来说比较少,因此B+树应运而生。B

2021-10-17 21:05:56 212

原创 Java之ArrayList与LinkedList

ArrayList的扩容机制1、ArrayList是否未初始化,没有初始化,先初始化,赋值默认容量10。2、判断要插入的下标是否小于当前容量,小于的话直接插入。3、如果所需容量大于当前容量,则进行扩容,扩容为当前容量+当前容量右移一位,即1.5倍。如果扩容之后还是小于所需最小容量,就把所需最小容量给到当前容量,如果容量大于最大容量,那么使用Integer的最大值作为容量,然后拷贝老数组到新数组中。private void grow(int minCapacity) { // over

2021-10-17 18:32:47 226

原创 MySQL之逻辑架构

MySQL逻辑架构图结构分析1、连接层**介绍:**提供客户端和连接服务,主要完成连接处理,权限认证,和相关的安全方案,同时这层提供了连接池,为连接的客户端提供线程,同时可以实现基于SSL的安全连接,为每个连接的客户端提供操作权限。**作用:**控制数据库的连接与关闭,为客户端分配数据库线程资源。2、业务逻辑处理层**介绍:**该层主要完成核心服务的主要功能,包括SQL接口,存储过程触发器,视图,SQL解析,优化,缓存等。在该层服务器会解析查询并创建相应的内部解析树,并对其完成相应的优化如确定

2021-10-13 20:02:07 100

原创 设计模式之桥接模式

定义将实现与抽象放在两个不同的类层次中,使两个层次可以独立改变,属于一种结构性的设计模式,基于类的最小设计原则。通常通过封装聚合继承等让行为不同的类承担不同的职责,将抽象与行为分离开,保持功能独立性和可扩展性。实现/** * 品牌 */public interface Brand { void call(); void close();}/** * vivo手机 */public class Vivo implements Brand{ @Override

2021-10-11 20:59:12 87

原创 设计模式之建造者模式

定义又叫生成器模式,是一种对象构建模式,可以将复杂的对象创建过程抽离出来,使创建过程不同实现方式可以构建出不同的对象。建造者模式中的四个角色产品对象(Product): 所需要创建的对象,如车。抽象建造者(Builder): 创建对象所需要的部件的抽象类或接口。定义创建流程,如造轮胎,造发动机等。具体建造者(ConCreateBuilder): 各个部件的具体实现类,如造跑车轮胎,造卡车轮胎等指挥者(Director): 定义一个使用Builder对象的接口,主要用于创建复杂的对象,可以控制整

2021-10-05 21:11:16 89

原创 设计模式之原型模式

原型模式用原型实例指定创建对象的种类,通过拷贝创建新的Object类提供了一个clone()方法,可以将java对象复制一份,但是这个类需要实现cloneable接口,才能具备这种能力。

2021-10-01 22:21:09 111

原创 设计模式之工厂模式

工厂模式简单工厂模式属于创建型工厂模式,由一个工厂类决定创建出哪种类的实例,这个类封装了实例化对象的行为,是工厂模式中最简单使用的模式。package SimpleFactory;/** * 简单工厂模式(也可以叫静态工厂模式) */public class SimpleFactory { //工厂类的静态方法 public static Product getProduct(String className){ Product product = null

2021-09-30 23:38:23 100

原创 设计模式之单例模式

单例模式定义在整个程序中,对某个类只能存在一个对象实例,并且该类只提供一个取得其对象的方法。饿汉式(静态常量)构造器私有化,无法通过new创建对象,在类的内部完成对象的创建,对外提供一个静态方法,返回该对象的实例。/** * 饿汉式静态常量的实现方式 */public class HungryStaticConstant { //构造器私有化,无法通过new创建对象, private HungryStaticConstant(){} private final s

2021-09-29 22:56:33 117

原创 设计模式的六大原则

设置模式的六大原则单一职责原则定义一个类只负责一项职能,若一个类中方法较少,可进行规则下沉,在方法上遵循职责原则。接口隔离原则定义客户端不应该依赖他不需要的接口,类之间的依赖关系应该建立在最小的接口上举例说明一辆跑车,有人认为外观好看是好车,有人认为跑的快是跑车,那么就可以将跑车抽出2个接口,一个接口描述外观,一个接口描述速度,由具体的实现类来决定什么样的车是好车。类图依赖倒置原则定义上层模块不应该依赖下层模块,他们都应该依赖于抽象,抽象不应该依赖细节,细节应该依赖抽象。举例甜

2021-09-28 21:11:12 126

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除