自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 数据结构——线性表

线性表,全名为线性存储结构。使用线性表存储数据的方式可以这样理解,即“把所有数据按照顺序(线性)的存储结构方式,存储在物理空间”。顺序表,全名顺序存储结构,是线性表的一种。顺序表对数据的物理存储结构有明确的要求:顺序表存储数据时,会提前申请一整块足够大小的内存,然后将数据依次存储起来,元素的存储空间在内存中是连续存在的。链表,全名链式存储结构,也是线性表的一种。与顺序表不同,链表不限制数据的物理存储位置,使用链表存储的数据元素,其物理存储位置是随机的。

2023-09-25 19:49:16 106

原创 计算机网络常见问题

流量控制就是控制发送方的发送速率,保证接收方能来得及接收,防止数据包的丢失。通常使用滑动窗口来实现流量控制,接收方发送的确认报文中的窗口字段可以来控制发送方的窗口大小,影响发送方的发送速率,当窗口大小为0时,发送方不能发送数据。滑动窗口是TCP协议用来实现流量控制的机制。发送方和接收方分别维护各自的缓冲区,这个缓冲区相当于窗口,发送方窗口大小由接收方决定,控制发送方的速率,从而实现流量控制。

2023-09-22 18:51:39 87

原创 数据库三大范式

作用:数据库设计范式是数据库在设计过程中需要遵守的设计准则,满足范式的数据库结构清晰,不会发生操作异常,可以避免数据冗余;

2023-09-21 12:39:06 73

原创 JVM虚拟机——Java内存模型(JMM)

局部变量表主要存放了编译期可知的各种基本数据类型变量值(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。native关键字修饰的本地方法被执行的时候,在本地方法栈中也会创建一个栈帧,用于存放该native本地方法的局部变量表、操作数栈、动态链接、方法出口信息。方法执行完毕后,相应的栈帧也会出栈并释放内存空间。

2023-09-14 21:02:31 85

原创 JVM虚拟机——Java类加载机制

两个类相等,需要类本身相等,包括类的 Class 对象的 equals() 方法、isAssignableFrom() 方法、isInstance() 方法的返回结果为 true,也包括使用 instanceof 关键字做对象所属关系判定结果为 true。除此之外,还要求两个类使用同一个类加载器进行加载,因为每一个类加载器都拥有一个独立的类名称空间。

2023-09-12 23:02:18 54

原创 JVM虚拟机——Java基础知识

只要在不同的平台上安装相应的JVM,就可以运行字节码文件(.class)并运行我们编写的Java程序。在这个过程中,我们编写的Java程序没有做任何改动,只是通过JVM的“中间层”,就可以在不同的平台上运行,真正实现了“一次编译,到处运行(write once,run anywhere)”的目的。JVM(Java Virtual Machine)是Java平台的基础,它有自己的指令集,并在运行时操作不同的内存区域(JVM内存模型)。编译生成的字节码在不同的平台上是相同的,但是JVM翻译的机器码是不同的。

2023-09-12 18:45:11 45

原创 SpringBoot集成Swagger

@ApiParam(required = “是否必须参数”, name = “参数名称”, value = “参数具体描述”,dateType="变量类型”,paramType="请求方式”):@Api(tags="说明该类的作用,可以在UI界面上看到的注解",value = "/类的访问路径", description = "类的文字描述")// 通过类上的注解扫描,如.withClassAnnotation(Controller.class)只扫描有controller注解的类中的接口。

2023-09-11 23:20:10 102

原创 Spring框架解决循环依赖

例如:A类依赖了B类,B类依赖了C类,而最后C类又依赖了A类,这样就形成了循环依赖问题。注:将对象保存至三级缓存的时候,会包装成ObjectFactory对象录入,未来通过此接口对应的get方法再次提取对象。//3、单例Bean的工厂池,缓存半成品对象,对象未被引用,使用时在通过工厂创建Bean,称之为"三。//2、早期Bean单例池,缓存半成品对象,且当前对象已经被其他对象引用了,称之为"二级缓存"//1、最终存储单例Bean成品的容器,即实例化和初始化都完成的Bean,称之为"一级缓存"

2023-09-11 21:58:03 27

原创 Spring Bean的生命周期

1.实例化Bean:Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化;Spring Bean的生命周期是从Bean实例化之后,即通过反射创建出对象之后,到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。以上几个步骤完成后, Bean 已经被正确创建,可以正常使用这个 Bean。

2023-09-11 19:43:54 191

原创 SpringMVC的执行流程

HandlerMapping 根据 uri 匹配查找能处理的 Handler (也就是我们定义的 Controller 控制器),并会将请求涉及到的拦截器和 Handler 一起封装。Model 是返回的数据对象, View 是 View 视图的逻辑名称。5. ViewResolver 会根据逻辑 View 名称查找并解析实际的 View 视图文件,并根据 DispaterServlet 返回的Model数据模型传给 View 视图文件,进行渲染执行,产生响应结果。

2023-09-09 23:02:44 55 1

原创 使用七牛云进行文件上传和文件删除

在个人中心的密钥管理中拿到AccessKey和SecretKey。在右侧选择需要的操作即可获得相应的代码文档。)的账号,然后申请一个存储空间。首先要注册一个七牛云(

2023-09-09 22:24:19 698 1

原创 注解版多对多级联查询

整个查询流程涉及5张表和3条查询语句,先在套餐表中通过套餐id查询套餐,然后在套餐和检查组关联表中将上述套餐id作为查询条件查询检查组id,然后在检查组表中通过查询到的检查组id查询检查组信息,最后查询检查项时,先在检查组和检查项关联表中通过上面查到的检查组id查询检查项id,然后在检查项表中通过查到的检查项id查询检查项信息。最终查询的结果:检查项的结果嵌套在检查组中,检查组的结果嵌套在套餐中,返回套餐信息。查询检查项信息的条件(检查项id) 要在检查组和检查项的关联表中通过检查组id拿到。

2023-09-09 00:12:01 70

原创 Java8特性

所以过滤后的结果,可以继续进行其它Stream操作(例如forEach,forEach需要一个函数来对过滤后的元素依次执行。Stream操作分为中间操作或者最终操作两种,最终操作返回一特定类型的计算结果,而中间操作返回Stream本身,可以连续完成多个操作。Stream有串行和并行两种,串行Stream上的操作是在一个线程中依次完成,而并行Stream则是在多个线程上同时执行。计数是一个最终操作,返回Stream中元素的个数,返回值类型是 long。排序是一个中间操作,返回的是排序好后的Stream。

2023-08-29 22:39:23 60 1

原创 非关系型数据库Redis(二)

与RDB相比可以简单描述为改记录数据为记录数据产生的过程AOF的主要作用是解决了数据持久化的实时性,目前已经是Redis持久化的主流方式。(Optimistic Lock) 顾名思义,就是很乐观,每次去拿数据的时候都认为别人不会修改,所以不会上锁,但是在更新的时候会判断一下在此期间别人有没有去更新这个数据,可以使用版本号等机制。概念:RDB是Redis的默认持久化方式,它通过将Redis的内存数据以快照的形式保存到磁盘上的一个二进制文件中,它恢复时是将快照文件直接读到内存里。发现已过期,删除,返回不存在。

2023-08-24 01:44:00 64 1

原创 非关系型数据库Redis (一)

NoSQL(NoSQL = Not Only SQL),是一项全新的数据库理念,泛指非关系型的数据库。传统的关系数据库在应付web2.0网站,特别是超大规模和高并发的SNS类型、web2.0纯动态网站已经显得力不从心,暴露了很多难以克服的问题。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,尤其是大数据应用难题。Redis是用C语言开发的一个开源的高性能键值对数据库。特征:1. 数据间没有必然的关联关系2. 内部采用单线程机制进行工作。

2023-08-22 00:59:12 67 1

原创 CopyOnWriteArrayList核心源码阅读

Copy-On-Write简称COW,是一种用于集合的并发访问的优化策略。基本思想是:当我们往一个集合容器中写入元素时(添加、修改、删除),并不会直接在集合容器中写入,而是先将当前集合容器进行Copy,复制出一个新的容器,然后新的容器里写入元素,写入操作完成之后,再将原容器的引用指向新的容器。好处:实现对CopyOnWrite集合容器写入操作时的线程安全,但同时并不影响进行并发的读取操作。所以CopyOnWrite容器也是一种读写分离的思想。

2023-07-20 20:48:53 44

原创 ReentrantLock与synchronized的区别

使用Synchronized关键字将一段代码逻辑,用一把锁给锁起来,只有获得了这把锁的线程才访问。并且同一时刻, 只有一个线程能持有这把锁, 这样就保证了同一时刻只有一个线程能执行被锁住的代码,从而确保代码的线程安全。

2023-07-19 21:03:22 45

原创 线程池的执行流程

线程池,按照配置参数(核心线程数、最大线程数等)创建并管理若干线程对象,没有任务的时候,这些线程都处于等待空闲状态。如果有新的线程任务,就分配一个空闲线程执行。如果所有线程都处于忙碌状态,线程池会创建一个新线程进行处理或者放入队列(工作队列)中等待。

2023-07-17 21:44:33 523 1

原创 线程的实现方式

使用ExecutorService threadPool=Executors.newFixedThreadPool(10)创建固定数量的线程池,调用ExecutorService的execute()方法,向线程池提交一个执行任务(传入Runnable接口的实现类对象)或者调用ExecutorService的submit()方法,向线程池提交一个执行任务(传入Callable接口的实现类对象),然后线程池分配空闲线程执行该任务。线程池,按照配置参数(核心线程数、最大线程数等)创建并管理若干线程对象。

2023-07-17 21:04:02 37 1

原创 AES算法的CBC和ECB两种工作模式

AES算法是对称加密算法的一种,它是目前应用最广泛的加密算法,AES算法支持的密钥长度为128位、192位、256位(密钥长度直接决定加密强度),工作模式有ECB、CBC、PCBC、CTR等,填充模式有NoPadding、PKCS5Padding、PKCS7Padding等(工作模式和填充模式可以看成是对称加密算法的参数和格式选择)。ECB模式是最简单的AES加密模式,它需要一个固定长度的密钥,固定的明文会生成固定的密文。ECB需要一个固定长度为128位的密钥,固定的明文生成固定的密文,安全性低。

2023-07-17 20:15:00 2492 1

原创 Java反射

由于JVM为每个加载的class创建了对应的Class实例,并在实例中保存了该class的所有信息,包括类名、包名、父类、实现的接口、所有方法、字段(成员变量)等,因此,如果获取了某个Class实例,我们就可以通过这个Class实例获取到该实例对应的class的所有信息。field.getModifiers()访问的成员变量修饰符返回的是int类型的值,如果想要返回的是一个具体的修饰符则要通过Modifier.toString(field.getModifiers())来访问。

2023-07-14 00:19:32 51 1

原创 哈希算法总结

哈希算法(Hash)又称摘要算法(Digest),它的作用是:对任意一组输入数据进行计算,得到一个固定长度的输出摘要。哈希算法最重要的特点就是:1、相同的输入一定得到相同的输出;2、不同的输入大概率得到不同的输出。所以,哈希算法的目的:为了验证原始数据是否被篡改。哈希算法的用途:1、校验下载文件我们只需要计算一下本地文件的哈希值,再与官网公开的哈希值对比,如果相同,说明文件下载正确,否则,说明文件已被篡改。2、存储用户密码如果直接将用户的原始口令存放在数据库中,会产生安全风险。

2023-07-10 19:20:22 676 1

原创 FTP协议

FTP(File Transfer Protocol)是文件传输协议,我们可以在服务器中存放大量的共享软件和免费资源,网络用户可以从服务器中下载文件,或者将客户机上的资源上传至服务器。如果用户要将一个文件从自己的计算机发送到FTP服务器上,称为FTP的上传,而更多的情况是用户从服务器上把文件或资源传送到客户机上,称为FTP的下载。在Internet上存在有许多FTP服务器,它们往往存储了许多允许存取的文件,如:文本文件、图像文件、程序文件、声音文件、电影文件等。4、设置文件的类型,将文件存至FTP目录,

2023-07-09 23:31:02 210 1

原创 使用JavaMail发送邮件

此案例发送的邮件既包含正文又包含附件,通过BodyPart设置正文和附件,第一个BodyPart是正文,使用setContent()方法设置内容,设置纯文本内容使用textPart.setContent("太阳照耀的时候!"utf-8"和"html"可以让带有html标签的字符串能够按html样式正常显示,该案例中"太阳"二字被加粗。创建一个工具类,该工具类中有一个静态的createSession()方法,此方法用于封装邮箱账号信息,SMTP服务器连接信息,创建Session会话。设置了图片的内容ID。

2023-07-09 22:28:02 306 1

原创 HashMap的数据结构

结果是这个树大致上是平衡的。9、将 Node 存入链表之后,判断链表的结构是否要调整,判断链表长度是否超过 8,如果超过 8 需要将链表转为红黑树,这里还有一个条件,如果数组的容量小于64,不转换红黑树,而是进行数组扩容,当数组的容量大于 64 的时候,再将链表转为红黑树。的数据结构,通过计算的Hash值找到数组上的位置,如果出现Hash相同的情况,依然会出现Hash碰撞,如果数组位置上没有元素,则直接将这个元素放到数组位置上,如果有元素则会向下延伸出链表,不过新的元素会放到链表的尾部,即尾插法。

2023-05-30 15:39:04 1659 1

原创 LinkedList源代码阅读

1.LinkedList底层是用链表实现的,而且是双向链表,并且实现了Queue接口,可以当成双向队列或者堆栈来使用。也正是因为是链表实现,所以删除元素比较快,但是查找的时候相对较慢。也没有什么扩容,除非就是内存不够了。2.双向链表,可以从头往尾遍历,也可以从尾部往前遍历。3.LinkedList继承了AbstractSequentialList,AbstractSequentialList实现了get,set,add,remove等方法。4.线程不安全。

2023-05-05 17:28:56 105 1

原创 ArrayList扩容方式的理解

无参构造方法创建ArrayList后容量为0,添加第一个元素后,容量变为10,当插入第11个元素时,数组容量不足,需要扩容,按照原来的1.5倍进行扩容。

2023-04-26 09:06:47 128 1

空空如也

空空如也

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

TA关注的人

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