自定义博客皮肤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)
  • 收藏
  • 关注

原创 HashMap的扩容机制

2.数组是否需要扩充是通过负载因子判断的,如果当前远足个数位数组容量的0.75时,就会扩充数组。我们也可以设置大于1的负载因子,这样数组就不会扩充,牺牲性能,节约内存。4.对于第三点补充说明,检查链表长度转换成红黑树之前,还会先检测当前数组是否到达一个阈值(64),如果没有到达这个容量,会放弃转化,先去扩充数组。所以上面也说了链表长度的阈值是7或8,因为会有一次放弃转换的操作。而当链表长度缩小到另一个阈值时(6),又会将红黑树转换回单向链表提高性能。1.数组的初始容量为16,而容量是以2的次方扩充的。

2023-08-17 09:01:36 138

原创 Map的put过程

4.如果数组中的元素个数(size)超过thresholc,则在在此进行扩容操作。1. 首次扩容:先判断数组是否为空,若数组为空则进行第一次扩容(resize)。HashMap是最经典的Map实现,下面以它的视角介绍put的过程。2.计算索引:通过hash算法,计算键值对在数组中的索引;

2023-08-17 08:46:00 235

原创 Zookeeper选举机制

SID:服务器ID.用来唯一标识一台Zookeeper集群中的机器,每台机器不能重复,和myid一致。ZXID:事务ID.ZXID是一个事务ID,用来标识一次服务器状态的变更。在某一时刻集群中的每台机器的ZXID值不一定完全一致,这和Zookeeper服务器对于客户端“更新请求”的处理逻辑有关。Epoch:每个Leader任期的代号。没有Leader时同一轮投票过程中的逻辑时钟值是相同的。每投完一次票这个数据就会增加。

2023-08-13 14:50:32 109

原创 Java基础(1)

Java的数据类型分为基本数据类型和引用数据类型。基本数据类型有8个可以分类4小类,整形(byte/short/int/long),浮点型(double/float),布尔型(boolean),字符型(char)引用类型就是对一个对象的引用,根据对象类型的不同,可以将引用类型分为3类,即数组、类、接口类型。引用类型本质上就是通过指针,指向堆中对象所持有的内存空间,只是Java语言不再沿用指针这个说法而已。byte(1个字节)8位。short(2个字节).16位 -2^15 ~ 2^15 - 1。

2023-08-12 10:31:55 72

原创 谈谈MySQL的事务隔离级别

执行事务B中的1、2查询出的moneu等于0,当先执行事务A中的 1、2 此时事务A未提交,再执行事务B中的1、2查询出的结果为money等于0,若事务A commit,此时事务B在进行1、2查询出的结果为0,此时不可能出现脏读,且可重复读,可能出现幻读现象。执行事务B中的1、2查询出的moneu等于0,当先执行事务A中的 1、2 此时事务A未提交,再执行事务B中的1、2查询出的结果为money等于1000,若事务A再执行rollback,此时事务B在进行1、2查询出的结果为0,此时出现了,脏读。

2023-07-30 18:32:57 41

原创 Spring Boot自定义返回值

需要注意的是,对于Spring Boot中的Controller或Service等组件,一般不建议将它们设计为静态类或使用静态方法,因为Spring容器是基于对象实例化的,使用静态方法可能导致Spring无法正确管理组件的生命周期和状态。如果R类中还有其他需要操作对象状态的方法,例如修改msg或data的方法,那么这些方法就应该定义为非静态方法,因为它们需要操作具体的对象实例的成员变量。如果你的R类中只有创建返回结果的方法,并且这些方法是通用的、不依赖于对象状态的,那么使用静态方法是合理的选择。

2023-07-28 19:16:33 5030

原创 synchronized

再具体来说,synchronized实例方法保护的是当前实例对象,即this,this对象有一个锁和一个等待队列,锁只能被一个线程持有,其他试图获得同样锁的线程需要等待。我们创建了1000个线程,传递了相同的counter对象,每个线程主要就是调用Counter的incr方法1000次,main线程等待子线程结束后输出counter的值,这次,不论运行多少次,结果都是正确的100万。(3)释放锁,如果等待队列上等待的线程,从中取一个并唤醒,如果有多个等待的线程,唤醒哪一个是不一定的,不保证公平性。

2023-07-20 10:32:57 35

原创 new String(“abc“)是去了哪里,仅仅是在堆里面吗?

在执行这句话时,JVM会先使用常量池来管理字符串直接量,即将“abc”存入常量池。然后再创建一个新的String对象,这个对象会被保存在堆内存中,并且,堆中对象的数据会指向常量池中的直接量。

2023-05-23 09:05:33 154

原创 String a = “abc“,说一下这个过程会创建什么,放在哪里?

JVM 会使用常量池来管理字符串直接量。在执行这句话时,JVM会先检查常量池中是否已经有"abc",若没有则将“abc”存入常量池,否则就复用常量池中已有的"abc",将其引用赋值给变量a。

2023-05-23 09:04:49 74

原创 两个字符串相加底层是如何实现的?

如果拼接的字符串包含变量,则在编译器采用StringBuilder对其进行优化,即自动创建StringBuilder实例并调用其append()方法,将这些字符串拼接在一起。如果拼接的都是字符串直接量,则在编译时编译器会将其直接优化为一个完整的字符串,和你直接写一个完整的字符串是一样的。

2023-05-23 09:01:32 116

原创 Java字符串如何拼接的

concat方法的拼接逻辑是,先创建一个足以容纳待拼接的两个字符串的字节数组,然后先后将两个字符串拼到这个数组里,最后将此数组转换为字符串。2、StringBuilder:如果拼接的字符串总包含变量,并不要求线程安全,则适合使用StringBuilder。4、String类的concat()方法:如果只是对两个字符串进行拼接,并且包含变量,则适合使用concat方法。3、StringBuffer:如果拼接的字符串中包含变量,并且要求线程安全,则适合使用StringBuffer。

2023-05-23 08:59:02 809

原创 使用字符串时,new和““推荐使用哪种方式?

显然,采用new的方式会多创建一个对象出来,会占用更多的内存,所以一般建议使用直接量的方式创建字符串。先看看"hello"和new String("hello")的区别。

2023-05-23 08:25:55 66

原创 String、StringBuffer、StringBuilder

场景:经常需要改变字符串内容时使用后面两个,优先使用StringBuffer,多线程使用共享变量时使用StringBuffer。性能:StringBuilder > StringBuffer > String。String是final修饰的,不可变,每次操作都会产生新的String对象。StringBuffer是线程安全的,StringBuilder线程不安全的。StringBuffer和StringBuilder都是在原对象上操作。StringBuffer方法都是synchronized修饰的。

2023-05-23 08:22:04 30

原创 线程的生命周期

当一个线程开始运行后,它不可能一直处于运行状态,线程在运行过程中需要被中断,目的是使其他线程获得执行的机会,线程调度的细节取决于底层平台锁采用的策略。如果处于就绪状态的线程获得CPU,开始执行run()方法的线程执行体,则该线程处于运行状态,如果计算机只有一个CPU,那么在任何时刻只会有一个线程处于运行状态。当线程对象调用了start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。

2023-05-22 10:10:36 39

原创 线程是否可以重复启动,会有什么后果?

扩展阅读:当程序使用new关键字创建一个线程之后,该线程就处于新建状态,此时它和其他的Java对象一样,仅仅由Java虚拟机为其分配内存,并初始化其成员变量的值。此时的线程对象没有表现出任何线程的动态特征,程序也不会执行线程的线程执行体。当线程对象调用了start()方法之后,该线程处于就绪状态,Java虚拟机会为其创建方法调用栈和程序计数器,处于这个状态中的线程并没有开始运行,只是表示该线程可以运行了。至于该线程何时开始运行,取决于JVM里线程调度器的调度。

2023-05-22 09:57:33 219

原创 run()和start()有什么区别?

调用start()方法启动线程时,系统会把该run()方法当成线程执行体来处理。但如果直接调用线程对象的run()方法,则run()方法立即就会被执行,而且在run()方法返回之前其他线程无法并发执行。也就是说,如果直接调用线程对象的run()方法,系统把线程对象当成一个普通对象,而run()方法也是一个普通对象,而不是线程执行体。run()方法被称为线程执行体,它的方法体代表了线程需要完成的任务,而start()方法用来启动线程。

2023-05-22 09:51:28 65

原创 Thread常用方法x

setDaemon(boolean on):将该线程标记为守护线程或用户线程,如果不标记默认是非守护线程;setPriority(int newPriority):改变该线程的优先级;join(long millis):等待该线程终止,至多等待多少毫秒数。其中,参数name为线程名,参数target为包含线程体的目标对象。setName(String name):设置该线程的名字;join():等待该线程终止;Thread类常用静态方法。

2023-05-22 09:44:48 46

原创 创建线程有几种方式?

1、创建Callable接口的实现类,并实现call()方法,该call()方法将作为线程执行体,且该cal()方法有返回值。2、创建Runnable实现类的实例,并将其作为Thread的target对象,Thread对象为线程对象。1、定义Runnable接口的实现类,并实现该接口的run()方法,该run()方法将作为线程执行体.1、定义Thread类的子类,并重写该类的run()方法,该run()方法将作为线程执行体。3、调用线程对象的start()方法来启动该线程。

2023-05-22 09:14:31 102

原创 hashCode和equals

对象加入HashSet时,HashSet会先计算对象的hashcode值来判断对象加入的位置,看该位置是否有值,如果没有、HashSet会假设对象没有重复出现。这样就大大减少了equals的次数,响应就大大提高了执行速度。hashCode介绍:hashCode()的作用是获取哈希码,也称散列码;hashCode()定义在JDK的Object.java中,Java中的任何类都包含有hashCode()函数。散列表存储的是键值对(key-value),它的特点是:能根据“键”快速的检索出对应的“值”。

2023-05-21 20:22:50 37

原创 ==和eauals比较

==运算符:equal()方法:

2023-05-21 20:10:13 80 1

原创 JDK、JRE、JVM

JRE(Java Runtime Environment)java运行时环境。JDK(Java Develpment kit)java开发工具。JVM(Java Virtual Machine)java虚拟机。

2023-05-21 20:00:54 67 2

原创 面向对象的三大特性

2、继承(inheritance):为了支持代码的可充用性(reusability)。定义新的类,可以从已有的类中继承代码,减少了程序的总代码量和写代码时间,缩短了开发周期.1、封装(Encapsulation):实现了数据的隐藏(data hiding),部分数据对程序的其他部分隐藏。隐藏的目的就是防止别人修改数据。3、多态性(polymorphism):基于对象所属类的不同,外部类对同一个方法的调用,实际执行的逻辑不通。继承,方法重写,父类引用指向子类对象。

2023-05-21 19:59:43 56

原创 面向过程与面向对象

面向过程方式:分析出解决问题的步骤,然后用函数(Function)或程序过程(Procedure)把这些步骤一步一步地实现,程序执行的过程就是按一定顺序调用函数并且执行函数的过程。解决问题的过程就是函数执行的过程。所以面向过程(Procedure-Oriented)的核心是,分析事物过程用函数来实现。程序员专注于分析系统,找出其中的对象和类,分析一个事物类和对象与其他事物类和对象之间的关系。在程序中再现它们在现实世界中原始的状态和模样、不同类和对象之间的关系,对象的行为方式以及整个系统的运行方式,

2023-05-21 19:02:20 113 1

原创 Mybatis入门

Mybatis新手入门

2022-10-18 15:30:11 167

原创 Java的数据类型

Java数据类型

2022-08-29 21:22:16 98

原创 为什么说Java代码可以实现一次编写多处运行?

为什么说Java代码可以实现一次编写多处运行?

2022-08-28 21:54:28 815

原创 Vue3事件处理,事件捕获顺序

用v-on(简写@)监听DOM事件,触发事件时候执行javaScript当绑定的是无参函数时候括号可以省略(两种效果等同)。<template> <div> <button v-on:click="clickHandle">按钮1</button> <button v-on:click="clickHandle()">按钮2</button> </div></template>

2022-05-05 23:35:57 2137

原创 Vue v-on属性的使用

v-on作用:绑定事件监听器<template> <div> <p>{{count}}</p> <button v-on:click="count++">按钮1</button><!--直接绑定事件--> <button v-on:click="addCount">按钮2</button><!--绑定函数--> </div></te

2022-04-26 17:49:54 522

原创 Vue v-bind的使用

Vue v-bind属性用法大全。

2022-04-25 19:13:28 357

空空如也

空空如也

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

TA关注的人

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