自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 计算机网络常见面试题总结

流量控制是为了控制发送方发送速率,保证接受方来得及接收。接收方和发送方都有固定大小的缓冲区,TCP的接收端只允许发送端发送它能接受的数据,当接收方来不及处理发送方的数据,能提示发送方降低发送速率,方式保丢失,从而实现流量控制。TCP使用流量控制是用滑动窗口实现,接收方发送的确认报文中的窗口字段可以控制发送窗口大小,从而影响发送方的发送速率。滑动窗口是TCP协议用于实现流量控制的一种机制。发送方和接收方分别维护各自的缓冲区,这个缓冲区就是窗口,发送方的窗口大小由接收方的TCP首部的窗口字段决定。

2023-09-22 19:37:24 67

原创 JVM垃圾收集器

G1 ( Garbage-First ) 是一款面向服务器的垃圾收集器,主要针对配备多颗处理器、大容量内存的机器。它不再严格按照分代思想进行垃圾回收。G1采用局部性收集的设计思路和基于Region的内存布局形式。

2023-09-16 00:34:31 80

原创 Java内存模型(JMM)

局部变量表主要存放了编译期可知的各种基本数据类型变量值(boolean、byte、char、short、int、float、long、double)、对象引用(reference 类型,它不同于对象本身,可能是一个指向对象起始地址的引用指针,也可能是指向一个代表对象的句柄或其他与此对象相关的位置)。方法执行完毕后,相应的栈帧也会出栈并释放内存空间。与程序计数器一样,VM Stack虚拟机栈也是线程私有的,它的生命周期和线程相同,用于描述 Java 方法执行时的内存模型,每次方法调用的数据都是通过栈传递的。

2023-09-13 23:26:19 67

原创 Java类加载机制(二)

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

2023-09-11 23:11:31 55

原创 Java类加载机制(一)

类是在运行期间第一次使用时,被类加载器动态加载至JVM。JVM不会一次性加载所有类。因为如果一次性加载,那么会占用很多的内存。

2023-09-11 19:59:20 28

原创 非对称加密算法

非对称加密需要两把密钥:公钥和私钥,他们是一对,如果用公钥对数据加密,那么只能用对应的私钥解密。如果用私钥对数据加密,只能用对应的公钥进行解密。因为加密和解密用的是不同的密钥,所以称为非对称加密。非对称加密的缺点:运算速度非常慢,比对称加密要慢很多。从DH算法我们可以看到,公钥-私钥组成的密钥对是非常有用的加密方式,因为公钥是可以公开的,而私钥是完全保密的,由此奠定了非对称加密的基础。

2023-09-04 21:45:26 120

原创 Hmac算法

在使用hash算法存储用户的哈希口令时,要加盐存储,目的就在于抵御彩虹表攻击。哈希算法:digest = hash(input)正是因为相同的输入会产生相同的输出,加盐的目的就在于,使得输入有所变化:digest = hash(salt + input)这个salt可以看作是一个额外的“认证码”,同样的输入,不同的认证码,会产生不同的输出。因此,要验证输出的哈希,必须同时提供“认证码”。

2023-09-04 21:45:01 102

原创 秘钥交换算法

对称加密算法解决了数据加密的问题。我们以AES加密为例:在现实世界中,Alice要向Bob发送一个加密文件,Alice可以先生成一个AES密钥,对文件进行加密,然后把加密文件发送给Bob。因为Bob要解密,就必须需要Alice生成的密钥。现在问题来了:如何传递密钥?在不安全的信道上传递加密文件是没有问题的,因为黑客拿到加密文件没有用。但是,如何在不安全的信道上安全地传输密钥?

2023-09-03 17:58:48 188

原创 乐观锁、悲观锁、死锁

悲观锁 (Pessimistic Locking),具有强烈的独占和排他特性。它指的是对数据被外界修改持保守态度。因此,在整个执行过程中,将处于锁定状态。所以,悲观锁是一种悲观思想,它总认为最坏的情况可能会出现,它认为数据很可能会被其他人所修改,所以悲观锁在持有数据的时候总会把资源 或者 数据 锁住,这样其他线程想要请求这个资源的时候就会阻塞,直到等到悲观锁把资源释放为止。

2023-09-03 14:53:10 49

原创 shiro入门

权限管理,一般指根据系统设置的安全策略或者安全规则,用户可以访问而且只能访问自己被授权的资源,不多不少。权限管理几乎出现在任何系统里面,只要有用户和密码的系统。访问权限一般表示你能做什么样的操作,或者能够访问那些资源。例如:给张三赋予“店铺主管”角色,“店铺主管”具有“查询员工”、“添加员工”、“修改员工”和“删除员工”权限。此时张三能够进入系统,则可以进行这些操作数据权限一般表示某些数据你是否属于你,或者属于你可以操作范围。

2023-09-03 13:22:08 29

原创 RocketMQ详解

在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式,在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务端完成处理后返回结果给客户端才能继续执行,这种情况属于同步调用方式。如果服务器端发生网络延迟、不可达的情况,可能客户端也会受到影响。

2023-08-28 17:54:13 187

原创 redis企业级解决方案

缓存预热就是系统启动前,提前将相关的缓存数据直接加载到缓存系统。避免在用户请求的时候,先查询数据库,然后再将数据缓存的问题!用户直接查询事先被预热的缓存数据。

2023-08-28 12:44:59 58 1

原创 redis删除策略

redis是一种内存级数据库,所有数据均存放在内存中,内存中的数据可以通过TTL指令获取其状态。XX:具有时效性的数据-1 :永久有效的数据-2 :已经过期的数据或被删除的数据或未定义的数据redis中对数据设置有效时间,数据过期后不会立马被删除,而是提供了三种过期策略:定时删除、惰性删除、定期删除。

2023-08-27 21:56:54 58

原创 redis - 持久化

官方推荐两个都启用,如果对数据不敏感,可以选单独用RDB,不建议单独用AOF,因为可能会出现Bug,如果只是做纯内存缓存,可以都不用。

2023-08-27 13:57:33 27

原创 Java动态代理

动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。代理类在程序运行期间,创建的代理对象称之为动态代理对象。这种情况下,创建的代理对象,并不是事先在Java代码中定义好的。而是在运行期间,根据我们在动态代理对象中的“指示”动态生成的。

2023-08-27 09:44:30 28

原创 MySQL事务

在一些场景中,一个事务只能读取到另一个已提交事务修改过的数据,但是第一次读过某条记录后,即使其它事务修改了该记录的值并且提交,之后该事务再读该条记录时,读到的仍是第一次读到的值,而不是每次都读到不同的数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。指在一个事务读取一个数据时,另外一个事务也访问了该数据,那么在第一个事务中修改了这个数据后,第二个事务也修改了这个数据。也就是说,一旦事务被提交,事务对数据所做的任何变动都会被永久地保留在数据库中。

2023-08-26 16:18:27 33

原创 Java8特性(二)

在上一篇中,我们重点介绍了Java8中的接口以及lambda表达式,这一片我们来说Java8中的stream流和时间日期。

2023-08-26 13:40:56 45

原创 Java8特性(一)

该接口包含多种默认方法来将 Predicate 组合成其他复杂的逻辑(比如:与and,或or,非negate)。可以使用Lambda表达式进行实现,实现函数式编程。在接口中定义默认方法,使用default关键字,并提供默认的实现。所有实现这个接口的类都会接受默认方法的实现,除非子类提供的自己的实现。Lambda 表达式本质是一个匿名函数,用于把函数作为参数,传入方法中,实现函数式编程风格。比如Comparator接口就是函数式接口,如下代码,Comparator接口及其实现。

2023-08-24 22:08:48 55 1

原创 ThreadLocal详解

ThreaLocal是线程局部变量,用于保存线程中的数据,threadlocal中保存的数据仅属于当前线程,对于其他线程来说是隔离的,不同的线程之间不会相互干扰。ThreadLocal利用Thread中的ThreadLocalMap来进行数据存储。

2023-08-23 23:56:52 356

原创 synchronized实现原理

synchronized关键字的作用是保证线程安全,是Java5之前仅有的线程同步的手段,可以修饰普通方法、静态方法,也可以用在代码块上。synchronized是可重入锁,获取锁的方式是抢占型的,并没有尝试获取锁的机制。在Java5之前,synchronized锁在加锁解锁过程中是通过操作系统互斥锁实现的,消耗资源,属于重量级锁。

2023-08-22 23:16:37 38 1

原创 ReentrantLock与synchronized的区别

使用synchronized关键字对一段代码逻辑进行封装,将其锁起来,只有获取到这把锁的线程才访问这段代码逻辑,并且在同一时间只能有一个线程获得到这把锁,方能保证这段代码的线程安全。

2023-07-23 16:17:39 55

原创 线程池的执行流程

线程池是用来创建并管理若干个线程的,当给线程池中传线程任务时,线程池会将空闲的线程分配给线程任务,任务执行完后线程重新回到空闲状态,等待线程池再一次给他分配任务。当所有线程都处于忙碌状态时,线程池会让新的线程任务在工作队列中等待,有新的空闲线程就会执行工作队列中的线程任务。这样一来就无须手动的创建并维护线程,这些线程池就会帮我们完成。

2023-07-18 23:17:05 401 1

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

在加密解密方法中都分别通过Cipher.getInstance("AES/ECB/PKCS5Padding")方法传入参数分别为算法/工作模式/填充模式,创建了各自的密码对象Cipher实例,接着根据算法名称及秘钥创建了SecretKey实例,然后初始化秘钥,通过init()方法分别设置加密和解密模式(加密模式为cipher.ENCRYPT_MODE,解密模式为cipher.DECRYPT_MODE)。在解密时需要将数组中的iv参数提取出来,与秘钥结合在一起对密文进行解密。

2023-07-18 00:34:47 1144 2

原创 线程的实现方式

线程池是用来维护和控制线程的,给他一个线程任务,他会分配一个空闲线程用来处理线程任务,执行结束后该线程会处于空闲状态,等待执行下一个线程任务。创建该类的实例并且将其作为FutureTask类的构造方法的参数,创建Thread实例并将FutureTask作为构造方法的参数,执行start()方法启动线程,可以通过get()方法获取执行结果。用Executors工具类创建一个ExecutorService类型的线程池对象,可通过该对象的execute()方法向线程池提交一个线程对象。

2023-07-17 21:15:19 69 1

原创 Java反射总结

通过getSuperclass()方法可获取到一个类的父类,一个类如果没有用extends集成某个类,则该类用getSuperclass()方法得到Object类,Object的父类为null。Java反射机制是在运行状态中,了解任意一个类的成员变量和方法,可以调用任意一个对象的属性和任意方法方法,这种动态获取程序信息以及动态调用对象的功能称为Java语言的反射机制。通过getMethods()方法获取对象的的public修饰的方法(包含父类),返回的一个Method类型的数组;

2023-07-16 22:50:59 127 1

原创 哈希算法总结

哈希算法是我们常用的加密算法,又称为消息摘要算法,他可将不同长度的数据转换成固定长度的哈希值,哈希算法发是单向的,不可反向推导出原始数据。其目的是为了验证原始数据是否被篡改。哈希算法的特点:相同的数据计算出的hashcode一定是相同的;不同的数据计算出的hashcode大概率是不同的。

2023-07-10 19:33:19 70 1

原创 基于FTP协议的文件展示、上传、下载代码案例

文件传输协议(File Transfer Protocol,FTP)是用于在上进行文件传输的一套标准协议,它工作在 OSI 模型的第七层, TCP 模型的第四层, 即应用层, 使用 TCP 传输而不是 UDP, 客户在和服务器建立连接前要经过一个“三次握手”的过程, 保证客户与服务器之间的连接是可靠的, 而且是面向连接, 为数据传输提供可靠保证。FTP允许用户以文件操作的方式(如文件的增、删、改、查、传送等)与另一主机相互通信。

2023-07-09 22:19:06 118 1

原创 JavaMail邮件发送代码案例

所以需要分别创建正文及附件相应的BodyPart对象,将正文及附件内容传入相应的BodyPart对象中,再将BodyPart添加至MultiPart中。发送内嵌图片与发送附件有些许不同,在传入正文内容时需要及将需要传入的内容都添加在StringBuilder中,再通过setContect方法将StringBuilder添加至textPart。在使用JavaMail发送邮件时,首先需要自己的邮件地址和对方的邮件地址,其次要确定邮件服务器地址和端口号,发送方用163邮箱,接收方用qq邮箱。

2023-07-09 18:42:38 144 1

原创 ArrayList扩容方式

ArrayList类是基于数组实现的,底层使用Object [] elementData数组实现。

2023-05-30 00:53:59 255

原创 LinkedList源代码阅读

LinkedList与ArrayList类都实了List接口,但LinkedList与ArrayList不同的是,它是基于双向链表实现数据的存储,链表是由若干个Node对象组成。添加或删除元素时不需要移动其他元素。

2023-05-29 15:05:48 58

原创 HashMap的数据结构

在jdk1.7之前,其存储方式为数组+单向链表,并且在链表中插入元素是采用头插法;在jdk1.8之后,存储方式变为数组+单向链表+红黑树,插入元素为尾插发。当新添加一个KV键值对元素时,通过该元素的key的hash值,计算该元素在数组中应该保存的下标位置。如果该下标位置如果已经存在其它Node对象,则采用链地址法处理。当链表的长度超过8并且数组长度大于64时,为了避免查找搜索性能下降,该链表会转换成一个红黑树。//静态内部类NodeV value;

2023-05-22 00:28:41 412 1

空空如也

空空如也

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

TA关注的人

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