- 博客(36)
- 收藏
- 关注
原创 Vue的理解
Vue 是一款渐进式 JavaScript 框架,由尤雨溪于 2014 年推出。它专注于视图层,旨在帮助开发者更高效地构建用户界面。“渐进式” 意味着开发者可以根据项目需求,逐步引入 Vue 的不同功能,既能用于简单的页面交互增强,也能构建复杂的大型单页面应用(SPA)。
2025-02-07 09:42:43
534
原创 Spring Boot的理解
Spring Boot 是由 Pivotal 团队开发的一个基于 Spring 框架的开源 Java 开发框架,它旨在简化 Spring 应用的初始搭建以及开发过程。通过提供默认配置、嵌入式服务器等功能,Spring Boot 让开发者可以快速构建独立的、生产级别的 Spring 应用程序,减少了大量的样板代码和配置工作,提高了开发效率。
2025-02-07 09:38:42
934
原创 MyBatis的理解
MyBatis 是一款优秀的持久层框架,它支持定制化 SQL、存储过程以及高级映射。它消除了几乎所有的 JDBC 代码和参数的手工设置以及结果集的检索。MyBatis 可以使用简单的 XML 或注解来配置和映射原生类型、接口和 Java 的 POJO(Plain Old Java Objects)为数据库中的记录。
2025-02-07 09:34:12
693
原创 MySQL 的理解
MySQL 是一种广泛使用的开源关系型数据库管理系统(RDBMS)。它由瑞典 MySQL AB 公司开发,后被甲骨文(Oracle)公司收购。凭借高性能、可靠性、易用性和开放性等诸多优势,MySQL 在 Web 应用开发领域占据重要地位,众多知名互联网公司和企业级应用都将其作为数据存储的首选方案。
2025-02-07 09:30:52
636
原创 JVM 的理解
Java 虚拟机(Java Virtual Machine,JVM)是 Java 程序的运行基础,它是一个虚构出来的计算机,通过在实际的计算机上仿真模拟各种计算机功能来实现。JVM 使得 Java 程序能够实现 “一次编写,到处运行” 的特性,因为 Java 程序编译后生成的字节码文件(.class 文件)可以在任何安装了对应 JVM 的操作系统上运行。
2025-02-07 09:28:13
875
原创 javaOOP
面向对象编程(Object - Oriented Programming,OOP)是一种编程范式,它将数据和操作数据的方法捆绑在一起,形成对象。Java 是一种典型的面向对象编程语言,通过 OOP 可以更好地组织代码,提高代码的可维护性、可扩展性和可复用性。
2025-02-07 09:25:06
248
原创 Redis常见
定期删除执行过程中,如果突然遇到大量过期 key 的话,客户端请求必须等待定期清理过期 key 任务线程执行完成,因为这个这个定期任务线程是在 Redis 主线程中执行的。不过,如果 Lua 脚本运行时出错并中途结束,出错之后的命令是不会被执行的。并且,出错之前执行的命令是无法被撤销的,无法实现类似关系型数据库执行失败可以回滚的那种原子性效果。也就是说,一段 Lua 脚本执行过程中不会有其他脚本或 Redis 命令同时执行,保证了操作不会被其他指令插入或打扰,这是 pipeline 所不具备的。
2025-01-13 20:37:49
715
原创 Java 语法糖详解
自动装箱就是 Java 自动将原始类型值转换成对应的对象,比如将 int 的变量转换成 Integer 对象,这个过程叫做装箱,反之将 Integer 对象转换成 int 类型值,这个过程叫做拆箱。但有时候出于对程序代码优化的考虑,希望只对其中一部分内容进行编译,此时就需要在程序中加上条件,让编译器只对满足条件的代码进行编译,将不满足条件的代码舍弃,这就是条件编译。可以将一组具名的值的有限集合创建为一种新的类型,而这些具名的值可以作为常规的程序组件使用,这是一种非常有用的功能。所以,对于编译器来说,
2025-01-10 20:38:32
511
原创 Spring&SpringBoot常用注解总结
最近看到网上有一篇关于 SpringBoot 常用注解的文章被转载的比较多,我看了文章内容之后属实觉得质量有点低,并且有点会误导没有太多实际使用经验的人(这些人又占据了大多数)。的话一般是用在要返回一个视图的情况,这种情况属于比较传统的 Spring MVC 的应用,对应于前后端不分离的情况。的合集,表示这是个控制器 bean,并且是将函数的返回值直接填入 HTTP 响应体中,是 REST 风格的控制器。格式的数据,接收到数据之后会自动将数据绑定到 Java 对象上去。如果你的项目太老了的话,就当我没说。
2025-01-07 14:41:57
1129
原创 红黑树介绍
二叉查找树是一种基于比较的数据结构,它的每个节点都有一个键值,而且左子节点的键值小于父节点的键值,右子节点的键值大于父节点的键值。这样的结构可以方便地进行查找、插入和删除操作,因为只需要比较节点的键值就可以确定目标节点的位置。但是,二叉查找树有一个很大的问题,就是它的形状取决于节点插入的顺序。如果节点是按照升序或降序的方式插入的,那么二叉查找树就会退化成一个线性结构,也就是一个链表。但相比于 AVL 树,高度平衡所带来的时间复杂度,红黑树对平衡的控制要宽松一些,红黑树只需要保证黑色节点平衡即可。
2024-12-28 10:04:52
743
原创 Java 线程池最佳实践
多线程编程中一般线程的个数都大于 CPU 核心的个数,而一个 CPU 核心在任意时刻只能被一个线程使用,为了让这些线程都能得到有效执行,CPU 采取的策略是为每个线程分配时间片并轮转的形式。上下文切换通常是计算密集型的。一般建议是不同的业务使用不同的线程池,配置线程池的时候根据当前业务的情况对当前线程池进行配置,因为不同的业务的并发以及对资源的使用情况都不同,重心优化系统性能瓶颈相关的业务。类比于现实世界中的人类通过合作做某件事情,我们可以肯定的一点是线程池大小设置过大或者过小都会有问题,合适的才是最好。
2024-12-25 20:40:54
963
原创 MySQL查询缓存详解
为了提高完全相同的查询语句的响应速度,MySQL Server 会对查询语句进行 Hash 计算得到一个 Hash 值。得到 Hash 值之后,通过该 Hash 值到查询缓存中匹配该查询的结果。然而,有经验的 DBA 都建议生产环境中把 MySQL 自带的 Query Cache(查询缓存)给关掉。在 MySQL 8.0 及之后,更是直接删除了查询缓存的功能。缓存是一个有效且实用的系统性能优化的手段,不论是操作系统还是各种软件和网站或多或少都用到了缓存。命令可以查看查询缓存相关的信息。
2024-12-20 20:24:19
413
原创 LinkedList 源码分析
仅仅在头尾插入或者删除元素的时候时间复杂度近似 O(1),其他情况增删元素的平均时间复杂度都是 O(n)。底层数据结构是链表,内存地址不连续,只能通过指针来定位,不支持随机快速访问,所以不能实现。是一个标记接口,用来表明实现该接口的类支持随机访问(即可以通过索引快速访问元素)。作为链表就最适合元素增删的场景。是一个基于双向链表实现的集合类,经常被拿来和。接口的很多方法,所以我们有很多种方式插入元素。接口中相关的插入方法为例进行源码讲解,对应的是。来代替,并且,性能通常会更好!接口相关方法,还实现了。
2024-12-17 14:06:57
662
原创 Java 代理模式详解
相比于静态代理来说,动态代理更加灵活。我们不需要针对每个目标类都单独创建一个代理类,并且也不需要我们必须实现接口,我们可以直接代理实现类(说到动态代理,Spring AOP、RPC 框架应该是两个不得不提的,它们的实现都依赖了动态代理。使用的是 JDK 动态代理,我们先来看看 JDK 动态代理的使用。上面我们是从实现和应用角度来说的静态代理,从 JVM 层面来说,实际应用场景非常非常少,日常开发几乎看不到使用静态代理的场景。就 Java 来说,动态代理的实现方式有很多种,比如。CGLIB 动态代理机制。
2024-12-16 20:20:07
315
原创 线性数据结构
但链表不会节省空间,相比于数组会占用更多的空间,因为链表中每个节点存放的还有指向其他节点的指针。除此之外,链表不具有数组随机读取的优点。链表的插入和删除操作的复杂度为 O(1) ,只需要知道目标位置元素的上一个元素即可。最后一个节点的 next 指向 head,而 head 的 prev 指向最后一个节点,构成一个环。其实是一种特殊的单链表,和单链表不同的是循环链表的尾结点不是指向 null,而是指向链表的头结点。虽然是一种线性表,但是并不会按线性的顺序存储数据,使用的不是连续的内存空间来存储数据。
2024-12-12 11:27:55
270
原创 Java SPI 机制详解
文件夹下的 services 文件夹下的文件,将这个文件夹下面的所有文件先加载到内存中,然后根据这些文件的文件名和里面的文件内容找到相应接口的具体实现类,找到实现类后就可以通过反射去生成对应的对象,保存在一个 list 列表里面,所以可以通过迭代或者遍历的方式拿到对应的实例对象,生成不同的实现。所以会提出一些规范要求:文件名一定要是接口的全类名,然后里面的内容一定要是实现类的全类名,实现类可以有多个,直接换行就好了,多个实现类的时候,会一个一个的迭代加载。修改或者替换服务实现并不需要修改调用方。
2024-11-25 20:57:18
326
原创 MongoDB常见
虽然索引可以显著缩短查询时间,但是使用索引、维护索引是有代价的。在执行写入操作时,除了要更新文档之外,还必须更新索引,这必然会影响写入的性能。因此,当有大量写操作而读操作少时,或者不考虑读操作的性能时,都不推荐建立索引。如果查询存在合适的索引,MongoDB 可以使用该索引来限制它必须检查的文档数量。并且,MongoDB 可以使用索引中的排序返回排序后的结果。数据过期对于某些类型的信息很有用,比如机器生成的事件数据、日志和会话信息,这些信息只需要在数据库中保存有限的时间。属性外,和普通索引一样。
2024-11-22 19:07:14
393
原创 Java 序列化详解
对于 Java 这种面向对象编程语言来说,我们序列化的都是对象(Object)也就是实例化后的类(Class),但是在 C++这种半面向对象的语言中,struct(结构体)定义的是数据结构类型,而 class 对应的是对象类型。比较常用的序列化协议有 Hessian、Kryo、Protobuf、ProtoStuff,这些都是基于二进制的序列化协议。Kryo 是一个高性能的序列化/反序列化工具,由于其变长存储特性并使用了字节码生成机制,拥有较高的运行速度和较小的字节码体积。
2024-11-19 20:49:50
933
原创 Java集合常见
但是,问题是一个 40 亿长度的数组,内存是放不下的。相比于之前的版本, JDK1.8 之后在解决哈希冲突时有了较大的变化,当链表长度大于阈值(默认为 8)(将链表转换成红黑树前会判断,如果当前数组的长度小于 64,那么会选择先进行数组扩容,而不是转换为红黑树)时,将链表转化为红黑树,以减少搜索时间。判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。
2024-11-18 20:15:34
881
原创 Atomic 原子类总结
即使在多个线程同时执行时,该操作要么全部执行完成,要么不执行,不会被其他线程看到部分完成的状态。类依赖于 CAS(Compare-And-Swap,比较并交换)乐观锁来保证其方法的原子性,而不需要使用传统的锁机制(如。在化学上,原子是构成物质的最小单位,在化学反应中不可分割。基本类型原子类只能更新一个变量,如果需要原子更新多个变量,需要使用 引用类型原子类。原子类简单来说就是具有原子性操作特征的类。使用原子的方式更新数组里的某个元素。使用原子的方式更新数组里的某个元素。使用原子的方式更新基本类型。
2024-11-16 11:46:39
281
原创 Java 反射机制详解
让我们在运行时有了分析操作类的能力,这同样也增加了安全问题。另外,反射的性能也要稍差点,不过,对于框架来说实际是影响不大的。Class 类对象将一个类的方法、变量等信息告诉运行的程序。这些都是因为你可以基于反射分析类,然后获取到类/属性/方法/方法的参数上的注解。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。
2024-11-15 20:30:43
391
原创 NoSQL基础知识总结
NoSQL(Not Only SQL 的缩写)泛指非关系型的数据库,主要针对的是键值、文档以及图形类型数据存储。并且,NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案。NoSQL 数据库可以存储关系型数据—它们与关系型数据库的存储方式不同。NoSQL 数据库非常适合许多现代应用程序,例如移动、Web 和游戏等应用程序,它们需要灵活、可扩展、高性能和功能强大的数据库以提供卓越的用户体验。
2024-11-13 20:28:10
351
原创 字符集详解
每种字符集都有自己的字符编码规则,常用的字符集编码规则有 ASCII 编码、 GB2312 编码、GBK 编码、GB18030 编码、Big5 编码、UTF-8 编码、UTF-16 编码等。我们要将这些字符和二进制的数据一一对应起来,比如说字符“a”对应“01100001”,反之,“01100001”对应 “a”。字符编码是一种将字符集中的字符与计算机中的二进制数据相互转换的方法,可以看作是一种映射规则。字符集的种类较多,每个字符集可以表示的字符范围通常不同,就比如说有些字符集是无法表示汉字的。
2024-11-12 20:42:06
313
原创 为什么不推荐使用外键与级联?
我们可以把存储过程看成是一些 SQL 语句的集合,中间加了点逻辑控制语句。存储过程在业务比较复杂的时候是非常实用的,比如很多时候我们完成一个操作可能需要写一大串 SQL 语句,这时候我们就可以写有一个存储过程,这样也方便了我们下一次的调用。存储过程一旦调试完成通过后就能稳定运行,另外,使用存储过程比单纯 SQL 语句执行要快,因为存储过程是预编译过的。属于 DDL(数据定义语言)语句,操作立即生效,原数据不放到 rollback segment 中,不能回滚,操作不触发 trigger。
2024-11-07 19:01:04
296
原创 什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?
2NF 在 1NF 的基础之上,消除了非主属性对于码的部分函数依赖。第二范式在第一范式的基础上增加了一个列,这个列称为主键,非主属性都依赖于主键。数据库 : 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。数据库管理系统 : 数据库。全称是 Entity Relationship Diagram(实体联系图),提供了表示实体类型、属性和联系的方法。属性(对应于表中的字段)不能再被分割,也就是这个字段只能是一个值,不能再分为多个其他的字段了。
2024-11-07 18:59:49
351
原创 Java并发
悲观锁总是假设最坏的情况,认为共享资源每次被访问的时候就会出现问题(比如共享数据被修改),所以每次在获取资源操作的时候都会上锁,这样其他线程想拿到这个资源就会阻塞直到锁被上一个持有者释放。由于其强大的功能和潜在的危险性,它通常用于 JVM 内部或一些需要极高性能和底层访问的库中,而不推荐普通开发者在应用程序中使用。值,在提交更新时,若刚才读取到的 version 值为当前数据库中的。,在对这个变量进行读写操作的时候,会通过插入特定的。值相等时才更新,否则重试更新操作,直到更新成功。的方式来禁止指令重排序。
2024-11-02 11:55:52
246
原创 Java基础
Java 代码在编译过程中 ,我们即使不处理不受检查异常也可以正常通过编译。即 受检查异常 ,Java 代码在编译过程中,如果受检查异常没有被。在 Java 中,所有的异常都有一个共同的祖先。关键字处理的话,就没办法通过编译。
2024-10-31 11:49:07
294
原创 字符集详解
每种字符集都有自己的字符编码规则,常用的字符集编码规则有 ASCII 编码、 GB2312 编码、GBK 编码、GB18030 编码、Big5 编码、UTF-8 编码、UTF-16 编码等。我们要将这些字符和二进制的数据一一对应起来,比如说字符“a”对应“01100001”,反之,“01100001”对应 “a”。字符编码是一种将字符集中的字符与计算机中的二进制数据相互转换的方法,可以看作是一种映射规则。字符集的种类较多,每个字符集可以表示的字符范围通常不同,就比如说有些字符集是无法表示汉字的。
2024-10-28 20:18:56
435
原创 面向对象基础
封装是指把一个对象的状态信息(也就是属性)隐藏在对象内部,不允许外部对象直接访问对象的内部信息。就好像我们看不到挂在墙上的空调的内部的零件信息(也就是属性),但是可以通过遥控器(方法)来控制空调。但是如果一个类没有提供给外界访问的方法,那么这个类也没有什么意义了。就好像如果没有空调遥控器,那么我们就无法操控空凋制冷,空调本身就没有意义了(当然现在还有很多其他方法 ,这里只是为了举例子)。new 运算符,new 创建对象实例(对象实例在堆内存中),对象引用指向对象实例(对象引用存放在栈内存中)。
2024-10-25 20:55:48
309
原创 Java 反射机制详解
如果说大家研究过框架的底层原理或者咱们自己写过框架的话,一定对反射这个概念不陌生。反射之所以被称为框架的灵魂,主要是因为它赋予了我们在运行时分析类以及执行类中方法的能力。通过反射你可以获取任意一个类的所有属性和方法,你还可以调用这些方法和属性。像咱们平时大部分时候都是在写业务代码,很少会接触到直接使用反射机制的场景。但是,这并不代表反射没有用。相反,正是因为反射,你才能这么轻松地使用各种框架。像 Spring/Spring Boot、MyBatis 等等框架中都大量使用了反射机制。
2024-10-21 20:41:48
275
原创 ThreadLocal
由于绿色线程和原生线程比起来在使用时有一些限制(比如绿色线程不能直接使用操作系统提供的功能如异步 I/O、只能在一个内核线程上运行无法利用多核),在 JDK 1.2 及以后,Java 线程改为基于原生线程(Native Threads)实现,也就是说 JVM 直接使用操作系统原生的内核级线程(内核线程)来实现 Java 线程,由操作系统内核进行线程的调度和管理。顺便简单总结一下用户线程和内核线程的区别和特点:用户线程创建和切换成本低,但不可以利用多核。内核态线程,创建和切换成本高,可以利用多核。
2024-10-15 20:31:55
274
原创 NoSQL 是什么?
NoSQL(Not Only SQL 的缩写)泛指非关系型的数据库,主要针对的是键值、文档以及图形类型数据存储。并且,NoSQL 数据库天生支持分布式,数据冗余和数据分片等特性,旨在提供可扩展的高可用高性能数据存储解决方案。没有特殊要求(即 InnoDB 无法满足的功能如:列存储,存储空间数据等)的情况下,所有表必须使用 InnoDB 存储引擎(MySQL5.5 之前默认使用 Myisam,5.6 以后默认的为 InnoDB)。InnoDB 支持事务,支持行级锁,更好的恢复性,高并发下性能更好。
2024-10-14 19:09:20
308
原创 Redis 为什么这么快?
现在公司一般都是用 Redis 来实现缓存,而且 Redis 自身也越来越强大了!不过,了解 Redis 和 Memcached 的区别和共同点,有助于我们在做相应的技术选型的时候,能够做到有理有据!
2024-10-12 11:26:41
239
原创 什么是数据库, 数据库管理系统, 数据库系统, 数据库管理员?
数据库 : 数据库(DataBase 简称 DB)就是信息的集合或者说数据库是由数据库管理系统管理的数据的集合。 数据库管理系统 : 数据库管理系统(Database Management System 简称 DBMS)是一种操纵和管理数据库的大型软件,通常用于建立、使用和维护数据库。 数据库系统 : 数据库系统(Data Base System,简称 DBS)通常由软件、数据库和数据管理员(DBA)组成。 数据库管理员 : 数据库管理员(Database Administrator, 简称 DBA)
2024-10-10 10:44:29
195
1
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人