测试文章
这是一篇测试文章,用于验证博客功能是否正常。
Java基础八股文
Java基础八股文接口和抽象类有什么区别?接口 是用来定义行为规范的,适用于多个类需要实现相同的功能
抽象类 本质还是类,用来定义类的模板,适用于需要提供通用功能的同时有需要部分功能由子类实现
具体区别如下:
接口用interface定义,方法默认public abstract,字段是public static final,没有构造器,不能实例化。
抽象类用abstract定义,可以包含抽象方法(没有方法体)和普通方法,可以有构造器,但不能直接实例化
一个类可以实现多个接口,但只能继承一个抽象类,(多继承会造成菱形继承问题)
JDK 动态代理和 CGLIB 动态代理有什么区别?
特性
JDK 动态代理
CGLIB 动态代理
实现方式
基于 Java 的反射机制,使用 java.lang.reflect.Proxy 类。
基于字节码生成技术,依赖 net.sf.cglib 包。
代理目标
只能代理接口(必须有接口)。
可以代理类(不需要接口)。
原理
动态生成代理类,代理类实现目标对象的接口并重写方法。
动态生成目标类的子类,并覆盖其非 final 方法。
字节码 ...
操作系统常见八股文
操作系统常见八股文线程和进程有什么区别?
进程:是资源分配的基本单位。每个进程都有自己独立的内存空间(如代码段、数据段、堆栈等),可以看作是一个独立运行的程序实例。进程之间相互独立。
线程:是CPU调度的基本单位。一个进程可以包含多个线程,线程共享进程的内存空间和资源(如文件句柄、数据段等),但每个线程有自己的独立栈和寄存器。
资源分配方式:
进程需要为其分配独立的内存空间和系统资源,因此创建和切换进程的开销较大。
线程共享进程的资源,因此创建和切换线程的开销较小,效率较高。
通信方式:
进程间通信需要使用复杂的机制(如管道、消息队列、共享内存、套接字等),因为各自拥有独立的内存空间。
同一进程内的线程共享内存,因此线程间通信更加方便,直接通过内存读写即可,但需要注意同步以避免数据冲突。
使用场景:
进程适用于需要较高隔离度和独立性的场景,如运行不同的服务或应用。
线程适用于需要高效执行、共享资源且任务关联性较高的场景,如多线程并发计算。
进程之间的通信方式有哪些?进程间的通讯方式有管道、消息队列、共享内存、信号量、信号、套接字和文件
管道:管道是一种单向通信方式,通常 ...
计算机网络常见八股文
计算机网络常见八股文常见的 HTTP 状态码有哪些?常见的 HTTP 状态码包括:
1xx (信息性状态码)
100 Continue:继续请求,客户端应继续发送请求的其余部分。
101 Switching Protocols:服务器根据客户端请求切换协议。
2xx (成功状态码)
200 OK:请求成功,返回请求的数据。
201 Created:请求成功并且创建了新的资源。
204 No Content:请求成功,但没有返回内容。
3xx (重定向状态码)
301 Moved Permanently:资源已被永久移动到新位置,客户端应使用新的 URL。
302 Found:资源临时被移动,客户端应继续使用原 URL。
304 Not Modified:资源未被修改,可以使用缓存的版本。
4xx (客户端错误状态码)
400 Bad Request:请求格式错误,服务器无法理解。
401 Unauthorized:未授权,客户端需要提供身份验证。
403 Forbidden:禁止访问,服务器理解请求但拒绝执行。
404 Not Found:请求的资源未找到。
5xx ( ...
设计模式常见八股文
设计模式常见八股文单例模式有哪几种实现?如何保证线程安全?单例模式有懒汉式、饿汉式、双重检查锁定、静态内部类和枚举单例
懒汉式: 通过使用 synchronized 来确保线程安全,但可能会影响性能。
饿汉式:实例在类加载时就创建,线程安全
双重检查锁定: 通过双重检查 instance == null 来减少锁的竞争,提升性能,并且需要使用 volatile 关键字保证实例的正确性。
静态内部类: 通过类加载机制确保线程安全,避免了不必要的资源浪费。
枚举单例: 使用枚举的特性,天生线程安全,推荐使用。
什么是策略模式?一般用在什么场景?策略模式是一种行为型设计模式,它定义了一系列算法,并将每个算法封装起来,使它们可以互相替换,且算法的变化不会影响使用它的客户代码(调用方)。通过策略模式,可以消除代码中大量的 if-else 或 switch 语句,提升代码的灵活性和可维护性。
策略模式的核心特点:
算法封装:将算法的实现与使用算法的代码分离,通过封装提高代码的灵活性和可扩展性。
动态替换:可以在运行时选择和替换算法,适应不同场景的需求。
遵循开闭原则:增加新的策略时无需修改现有代 ...
Redis常见八股文
Redis常见八股文Redis 中常见的数据类型有哪些?Redis常见的数据类型主要有五种:String、List、Set、Hash和Zset(sorted set),高级数据结构有BitMap、HyperLogLog、GEO、stream
String: 可以存储任何类型的数据,包括文本、数字和二进制数据,最大长度512MB
场景: 缓存(用户会话、页面缓存)、计数器(统计访问量、点赞数等)
List: 列表是有序的字符串集合,支持从两端插入和弹出。可以用做队列或栈,底层双向链表
场景: 消息队列(任务调度、消息传递等)、历史记录
Set: 集合是无序且不重复的字符串集合,哈希表实现,可以实现快速查询,和去重操作
场景: 标签存储、去重(如统计独立IP)
Hash: 存储键值对集合,适合存储对象。内部类似于一个小型的键值对集合
场景: 存储用户信息,存储配置数据
Zset: 类似于Set,但每个元素会关联一个分数,自动按分数排序。支持快速的范围查询
场景: 排行榜,任务调度(优先级)
BitMap: 一种以位为单位存储数据的高效方式,适合用来表 ...
MySQL数据库八股文
MySQL数据库八股文MySQL InnoDB 引擎中的聚簇索引和非聚簇索引有什么区别?聚簇索引:是将数据和索引放在一起,索引的叶子结点存储到就是完整的数据行,一个表只能有一个聚簇索引,一般就是主键索引
非聚簇索引:数据和索引是分开存储,索引的叶子结点存储对应数据的主键值和索引列,如果想要获取完整数据行,需要根据这个主键值,去聚簇索引中找到完整的数据,这个过程叫“回表”
比喻:
假设一本书的目录和索引是连在一起的,当你翻到目录的某一页,就能读到正文的内容,就是聚簇索引,而非聚簇索引就是,另外有一个关键字索引表,通过索引表,找到关键字对应的页码,然后翻到那页才能读到内容。
其他必备知识:
MySQL InnoDB 引擎中的索引结构均是B+树,而B+树的非叶子结点仅存储索引,叶子结点包含所有数据。
聚簇索引直接就可以查询到完整数据,查询效率高
非聚簇索引通过索引指向数据,更灵活
MySQL 的存储引擎有哪些?它们之间有什么区别?MySQL的存储引擎常见的有三种,分别是InnoDB、MyISAM和Memory
其中InnoDB支持事务、行级锁和外键,使用聚簇索引,而且是MySQL5.5 ...
Spring Cloud (二)
SpringCloud(二)1.Nacos配置管理Nacos除了可以做注册中心,同样可以做配置管理来使用。
1.1.统一配置管理当微服务部署的实例越来越多,达到数十、数百时,逐个修改微服务配置就会让人抓狂,而且很容易出错。我们需要一种统一配置管理方案,可以集中管理所有实例的配置。
Nacos一方面可以将配置集中管理,另一方可以在配置变更时,及时通知微服务,实现配置的热更新。
1.1.1.在nacos中添加配置文件如何在nacos中管理配置呢?
然后在弹出的表单中,填写配置信息:
注意:项目的核心配置,需要热更新的配置才有放到nacos管理的必要。基本不会变更的一些配置还是保存在微服务本地比较好。
1.1.2.从微服务拉取配置微服务要拉取nacos中管理的配置,并且与本地的application.yml配置合并,才能完成项目启动。
但如果尚未读取application.yml,又如何得知nacos地址呢?
因此spring引入了一种新的配置文件:bootstrap.yaml文件,会在application.yml之前被读取,流程如下:
1)引入nacos-config依赖
首 ...
Spring Cloud (一)
SpringCloud (一)1.认识微服务1.1.单体架构单体架构:将业务的所有功能集中在一个项目中开发,打成一个包部署。
单体架构的优缺点如下:
优点:
架构简单
部署成本低
缺点:
耦合度高(维护困难、升级困难)
1.2.分布式架构分布式架构:根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。
分布式架构的优缺点:
优点:
降低服务耦合
有利于服务升级和拓展
缺点:
服务调用关系错综复杂
分布式架构虽然降低了服务耦合,但是服务拆分时也有很多问题需要思考:
服务拆分的粒度如何界定?
服务之间如何调用?
服务的调用关系如何管理?
人们需要制定一套行之有效的标准来约束分布式架构。
1.3.微服务微服务的架构特征:
单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责
自治:团队独立、技术独立、数据独立,独立部署和交付
面向服务:服务提供统一标准的接口,与语言和技术无关
隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题
微服务的上述特性其实是在给分布式架构制定一个标准,进一步降低服务之间的耦合度,提供服务 ...
万字理清Redis
RedisRedis是什么?Redis 是一个 基于内存的 key-value 存储系统,它可以用作数据库、缓存和消息中间件。
内存存储:
Redis 将数据存储在内存中,读写速度非常快,非常适合需要高性能的应用场景。支持每秒数十万次的读写操作,是需要快速响应场景如缓存,的理想选择。
数据类型:
string(字符串): 基本的数据存储单元,可以存储字符串、整数或者浮点数。
hash(哈希): 一个键值对集合,可以存储多个字段。
list(列表): 一个简单的列表,可以存储一系列的字符串元素,可以添加一个元素到列表的头部(左边)或者尾部(右边)。
set(集合): 一个无序集合,可以存储不重复的字符串元素,是通过哈希表实现的,所以添加,删除,查找的复杂度都是 O(1)。
zset(sorted set:有序集合): 类似于集合,但是每个元素都会关联一个double类型的分数,redis正是通过分数来为集合中的成员进行从小到大的排序,zset的成员是唯一的,但分数(score)却可以重复,适合做排行榜。
位图(Bitmaps):基于字符串类型,可以对每个位进行操作。
超日志(Hy ...
