自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 dom4j 操作 xml 之按照顺序插入标签

以上添加了详细注释的代码,读者可以直接拿来用,需要修改的部分是获取指定元素的名称以及 tagNames 数组。最近学了一下 dom4j 操作 xml 文件,特此记录一下。如果能给你带来帮助,那将是我的荣幸。

2024-07-17 09:51:26 436

原创 对于RBAC模型的认识

1. 简化权限管理:不用给每个用户单独分配权限,而是用过给角色授权,然后让用户拥有不同的角色从而获取相应的权限,大大降低了管理的复杂性。RBAC(基于角色的访问控制) 在企业的管理项目中应用比较频繁,我在实习的时候接手的授权管理项目就是使用的RBAC模型。它的核心是将角色和权限相关联,通过给用户分配不同的角色,从而获取相应的权限。2. 灵活:可以方便的对角色进行增改,而用户和对应的权限表改动的幅度较小。通过这几个表的关联查询,就可以将权限赋予对应的用户,实现授权管理了。user表:存放的是用户的信息。

2024-07-15 11:30:00 217

原创 SpringBoot项目集成MinIO

最近在学习MinIO,所以想让自己的SpringBoot项目集成MinIO,在网上查阅资料,并进行操作的过程中遇到一些问题,所以想把自己遇到的坑和完成步骤记录下来供自己和各位查阅。

2024-07-12 12:22:08 1194

原创 SpringBoot项目如何使用自定义Repository

否则就需要删除先前的记录从而保证数据库中的记录数。5. 调用 UserRepository. save方法,会自动进入到 CustomerBaseRepository 中重写的 save 方法,这样就完成了 自定义 Repository 的使用,也符合 调用 save 方法需要执行的业务逻辑了。1. 当创建一个UserRepository接口继承JpaRepository后,调用对应的save方法时,jpa会自动创建这个接口的实现类,并调用SimpleJpaRepository里面的save方法。

2024-07-12 12:08:23 433

原创 【实习收获】文件识别文字的大体流程

修复语义识别的bug:原先解析出来的json数据有blankIndex字段(空白页)的值以及解析出的内容,但是实际存放到文件中的是解析出来的内容,返回list类型。后续读取的话,取出json对象,先判断是否是map类型,如果是,则将对应的key和value取出来存放到结果中返回,否则是list存放到结果中返回。/ocr/arrurate 精确识别,也是转成txt文本,除了常规识别出的内容之外,还有每行内容的边界,并且会列出每个字符的边界信息。将该识别任务存储为一个task对象,并返回一个task id。

2024-07-08 23:11:09 293

原创 Redis五种基本数据类型的底层实现

redis五种基本类型可以涵盖项目中大多数的使用场景,而它们的底层实现在面试的过程中也是提问的提问的比较多的,今天就花时间来深入理解一下这五种基本数据类型的底层实现吧!

2024-06-10 21:26:16 602

原创 MySQL三大日志

我们需要恢复未写入磁盘但是写入biglog日志中的记录,虽然binlog中记录的是全量数据,但是当一条记录写入磁盘,另一条记录未写入磁盘时,binlog没有标识去判断哪些已经写入磁盘哪些没有,所以不管是两条记录都恢复到内存中还是都不回复,结果都是错误的。当事务提交后, buffer pool 中的数据页发生变化,这时还没有刷新到磁盘中的数据页称为脏页,脏页如果可以正常刷新到磁盘中,那么没redo log 什么事,如果服务宕机,脏页刷新失败,则会通过redo log 恢复数据。(在事务提交前写入;

2024-05-18 23:55:50 328

原创 十大排序算法之7种

冒泡排序、插入排序、归并排序是稳定的排序算法。选择排序、希尔排序、快速排序和堆排序是不稳定的排序算法。

2024-03-10 22:54:54 1152 1

原创 sorted set(zset)的底层实现原理

压缩列表本质上就是一个数组,只不过它增加了列表的长度,尾部偏移量,列表元素个数以及列表结束标志。这使得我们在查询列表首位元素时间复杂度为O(1),查询其他位置为O(n)。zset有一个重要特性就是范围查询,使用跳表可以利用多级索引快速查找起点,然后向后遍历就可以了;跳表是一种在链表的基础上增加了多级索引的数据类型。它可以通过多级索引进行转跳,实现快速查找元素的效果。当zset存储元素个数小于128个 或者 存储所有元素的长度小于64字节 这两种情况使用压缩列表。同样增删元素时间复杂度为O(logn)。

2024-03-10 22:21:34 254 1

原创 Redis中String类型的底层原理?

当我们继续向字节数组中添加“def”的时候,这时候空间不够了,那么就需要扩容,扩容后 len = 6,free= 6 (至于为什么等于6呢,这里设计的时候是以string类型存放数据 1mb进行划分,如果小于1mb,那么再次扩容后 len = free,这样就避免了频繁进行扩容;使用len用来记录以存放的字符的长度,保证了计算字符串长度这个操作的时间复杂度降为O(1),如果不加的话需要遍历字节数组,时间复杂度为O(n)。这样我们就大概了解了free的作用了,就是记录了可用字节的空间,从而避免了频繁的扩容。

2024-03-10 21:49:26 294 1

原创 【计算机网络】Https是如何保证数据安全传输的?

但是这种方式也会存在问题,中间人会把服务端发送给客户端的公钥劫持,然后伪造一份自己的公钥和私钥发送给客户端,然后客户端用这个公钥加密数据后被中间人劫持,中间人用自己的私钥解密数据,然后利用从服务端劫持过来的公钥加密一份数据,服务端就接收到了错误的数据,但是服务端不知道。比如说客户端和服务端需要发送一个数据,用了保证数据的安全性,需要对数据进行加密,客户端和服务端用的同一把密钥,客户端使用这把密钥对数据进行加密,服务端用这把密钥对数据进行解密,这个就是对称加密。

2024-01-28 21:31:04 208 1

原创 MySql索引的底层数据结构

如果采用b树的话,因为b树的非叶子节点和叶子节点都会存放数据,那么查找一个数据的时候,会从根节点向下查找,其他数据也会被读取出来,这样磁盘的读写代价比较高,而b+树的只在叶子节点存放数据,非叶子节点存放指针,查找数据的话,这个磁盘的读写代价比较低。如果采用二叉树的话,比如采用二叉搜索树,如果这个树是相对平衡的话,那么这个查找的时间复杂度是O(logn),如果数据是有序的,那么这个二叉搜索树就会退化成链表,查找的时间复杂度为O(n),查找速率太慢,也就是说使用二叉搜索树这个查找的效率不稳定。

2024-01-21 11:22:35 346

原创 【MySql高频面试题】MySql有哪些存储引擎,有什么区别?

MyISAM只支持表锁,如果有大量查询,使用MyISAM引擎效率会更高,而innodb支持行级锁,如果对数据表有大量的修改删除操作,使用innodb效率会更高。常见的引擎有innodb和MyISAM,innodb是mysql默认的存储引擎,而MyISAM是mysql早期的默认存储引擎。MyISAM的叶子节点存放的是数据所在的地址而不是数据,而innodb的叶子节点存放的是整行数据。MyISAM可以被压缩,所占磁盘空间较小,而innodb所占的磁盘空间较大。MyISAM不支持外键而innodb支持外键。

2024-01-21 10:21:04 334

原创 【MySql高频面试题】什么是聚簇索引和非聚簇索引?有什么区别?

innodb主键采用的是聚簇索引,MyISAM不管是主键索引,还是二级索引,采用的都是非聚簇索引。非聚簇索引指的是数据和索引分开存储,B+树的叶子节点保存了对应的主键,可以有多个,一般情况下我们给字段创建的索引都是非聚簇索引。聚簇索引指的是数据和索引放到一块进行存储,B+树的叶子节点保存了整行数据,它有且只能有一个,一般情况下主键会作为聚簇索引。首先我们要明白一点就是聚簇索引又叫聚集索引,非聚簇索引又叫二级索引,当问到这个的时候不要懵。它们之间的主要区别是b+树的叶子节点是否保存了整行数据。

2024-01-21 09:44:00 405

原创 【Java高频面试题】事务的隔离级别?mysql默认的隔离级别是什么?

它可以解决脏读和不可重复读的问题,但是解决不了幻读的问题,这也是mysql的事务的默认的隔离级别;,它解决不了脏读、不可重复读和幻读的问题,所以一般的项目中也不用它;,它可以解决以上提到的所有问题,但是它是让事务串行执行,性能比较低。,它能解决脏读的问题,但是解决不了不可重复读和幻读的问题;所以我们一般在项目中使用mysql的默认隔离级别。

2024-01-21 09:17:23 359

原创 什么是深拷贝和浅拷贝?

比如说有这样一个例子,定义一个老师类,它有姓名,年龄以及一个学生类。当进行浅拷贝后,修改这个老师类中的学生属性,那么拷贝的对象中的学生属性也会被修改。而进行深拷贝的话,那么修改学生的属性,拷贝的对象不会被修改。深拷贝要求拷贝的类需要实现Cloneable接口,并重写clone方法,它是会创建一个全新的对象,并将原对象所有的属性拷贝一份。也就是说,原对象修改,进行深拷贝的对象不受影响。浅拷贝是拷贝的原对象的地址,和原来的对象使用的是同一个内存地址。

2024-01-20 16:27:40 386

原创 【Java面试题】Java中的异常

非检查型异常,一般是运行时异常,它不需要显式的进行捕获或者抛出,但是运行的时候如果出现异常程序也会挂掉。对于这种异常,一般是代码本身出现问题,比如说数组越界,空指针异常等。如果代码写的健壮性足够高,这种异常是可以避免的。检查型异常需要在编译阶段进行捕获或者向上抛出,否则编译不通过,这种异常在IO操作中比较常见,比如说FileNotFoundException,并不是说一定会有这个异常,只是说可能会运行不成功,需要对这种情况做特殊处理。对于Java中的异常,主要分为两大类,检查型异常和非检查型异常。

2024-01-20 15:18:34 551

原创 【Java面试题】注解的作用

注解是jdk5中引入的,它的作用是给java代码提供元数据,不会对代码的执行造成影响。注解简单来说就是一种标识,可以放在类和字段上,常常是和反射、AOP结合起来使用。元注解,定义在注解上的注解,常见的元注解有两种,一个是@Target,标明该注解用在什么地方,另一个是@Retention,标明在什么阶段保留该注解。

2024-01-20 14:48:43 361

原创 什么是反射?为什么反射这么慢?(满分答案)

所以一般我们在业务代码中尽量避免使用反射,但是如果要成为一名合格的java程序员,我们要能够做到读懂中间件和框架中的反射代码,并在某些场景下利用反射解决一些问题。反射机制指的是在程序运行时可以获取自身的信息。在java中,只需要给定类名,就可以通过反射机制获取该类所有的属性和方法。反射需要包装和拆包参数,这个过程中可能会产生大量的对象,触发gc,那么包装和拆包的过程以及gc都是需要耗时的。反射获取方法时,需要遍历方法数组,并且需要对方法的可见性以及对应的参数等进行额外的检查,这些操作都是耗时的。

2024-01-20 12:07:57 449

原创 【Java面试题】<? extends> 和<? super>的区别

如果想从集合中读取数据而不写入数据,可以使用?extends 通配符(集合相当于生产者),如果想要向集合中写数据而不读数据,则使用?super 通配符(集合相当于消费者),如果既要存又要读,则不能使用通配符。extends T> 限定上界,表示类型化参数是T或者T的子类;super T>限定下界,表示类型化参数是T的超类。

2024-01-20 11:16:02 426

原创 【Java面试题】什么是泛型?泛型的好处有哪些?

方便,可以提高代码的复用性:比如我们将String类型和Integer类型放入List集合中,放String类型的时候需要定义一个List接口,而放Integer类型需要再定义一个接口,那么这样的话代码比较冗余,使用泛型就可以很好的解决这个问题。安全:在没有泛型之前,使用Object进行类型转换需要在运行时检查,如果类型转换出错则程序直接挂掉,这对程度影响非常大。泛型是jdk5中引入的一个新特性,它允许在定义类和接口的时候使用类型参数,在使用的时候再用具体的类型进行替换,泛型最主要的应用是在集合类框架中,

2024-01-20 10:54:59 540

原创 String s =“abc“与String s = new String(“abc“)的区别

对于String s = new String(“abc“),不管字符串常量池中是否存在值为“abc”的字符串对象,它都会在堆中创建一个字符串对象。对于String s =“abc“,如果字符串常量池中已经存在值为“abc”的字符串对象,那么变量s会指向已存在的对象;否则会在字符串常量池中新创建一个字符串对象,并将它赋值给变量s。答:String s =“abc“会创建1个或者0个对象,而String s = new String(“abc“)会创建1个或者2个对象。

2024-01-20 10:26:03 365

原创 String, StringBuffer, StringBuilder区别?

String进行字符串拼接,实际上是new出来一个StringBuilder对象,调用了append方法;而StringBuffer和StringBuilder进行字符串拼接不会产生新对象。StringBuffer是线程安全的,它调用append方法时,使用了synchronized关键字保证线程安全,而StringBuilder不是线程安全的。String是不可变的,而StringBuffer和StringBuilder是可变的。

2024-01-20 09:49:50 395

单和并.cpp

单和并.cpp

2022-10-10

空空如也

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

TA关注的人

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