原创

LD 科技fs

温馨提示:
本文最后更新于 2025年08月29日,已超过 287 天没有更新。若文章内的图片失效(无法正常加载),请留言反馈或直接联系我

hashmap,hashtable,currenthashmap

(1)HashTable和HashMap一样底层数组+链表实现,无论key还是value都不能为null,线程安全,实现线程安全的方式是在修改数据时锁住整个HashTable,效率低

(2)ConcurrentHashMap对整个桶数组进行了分段,HashMap和HashTable没有

(3)ConcurrentHashMap在jdk1.7(1.8的变化在下面会介绍)每一个分段上都用锁进行保护(16个段),从而让锁的粒度更精细一些,并发性能更好,而HashMap没有锁机制,不是线程安全的



HashMap 是一个非线程安全的集合类,适用于单线程环境。它允许 null 键和 null 值。其底层数据结构是数组+链表+红黑树,当链表长度超过一定阈值时会转换为红黑树,以提高查询效率。

HashTable 是一个线程安全的集合类,适用于多线程环境。它不允许 null 键和 null 值。其底层数据结构是数组+链表。由于所有方法都使用 synchronized 关键字进行同步,因此效率较低。

ConcurrentHashMap 是一个高效且线程安全的集合类,适用于高并发环境。它不允许 null 键和 null 值。其底层数据结构在 JDK 1.7 中是数组+链表,采用分段锁机制;在 JDK 1.8 中是数组+链表+红黑树,采用 CAS 和 synchronized 机制。


redis 保存方式rdb

:指定的时间间隔对快照进行存储,

redis 的 aof

:每一个收到的写命令都通过write函数追加到文件中。

如何防止穿透和雪崩。


pgsql如何配置分布式事务

1. 两阶段提交协议(2PC)

准备阶段

提交阶段

2. 使用Citus扩展

安装Citus

定义分布式表

执行sql语句

3. 其他方法

数据库的连接如何管理

  • Navicat
  • Idea  能自动补全、纠错
  • DataGrip  能自动补全、纠错

如何判断sql是高效的。

  1. 避免使用SELECT *
  2. 使用UNION ALL代替UNION
  3. 小表驱动大表
  4. 批量操作
  5. 多用LIMIT
  6. 控制索引的数量  5 个内
  7. 选择合理的字段类型
  8. 提升GROUP BY的效率
  9. 索引优化

数据库的表范式

第一范式(1NF)

第一范式要求数据表中的所有属性都是不可再分的数据项,即数据表中的每个列都应该是原子的。例如,一个包含商品名称和数量的列应拆分为两个独立的列。

第二范式(2NF)

第二范式在满足第一范式的基础上,要求每个非主属性完全依赖于主键,而不能部分依赖于主键的一部分。换句话说,非主属性必须完全依赖于主键,而不是仅依赖于主键的一部分。例如,一个学生成绩表中,学生ID和课程ID组成联合主键,成绩应完全依赖于这两个字段,而不是仅依赖于其中一个字段。

第三范式(3NF)

第三范式在满足第二范式的基础上,要求非主属性不依赖于其他非主属性,即消除传递依赖。例如,一个学生信息表中,性别描述应依赖于性别代码,而性别代码依赖于学生ID,这种传递依赖应通过拆分表格来消除。


常见的设计模式有哪些?

单列模式、工厂模式、观察者模式、外观模式、模板方法模式、状态模式

单例模式实现方式有几种?

饿汉式  懒汉式 双重检查锁 静态内部类 枚举

springcloud有没有定制化

  • 自定义配置:使用Spring Cloud Config或Spring Boot的配置管理。
  • 自定义负载均衡器:如使用Spring Cloud LoadBalancer代替Ribbon(参考引用[3])。
  • 自定义服务发现:例如,使用Consul或Eureka之外的注册中心。
  • 自定义API网关:如Spring Cloud Gateway的过滤器或路由定制。
  • 自定义断路器:如Hystrix或Resilience4j的配置。
  • 自定义Feign客户端:如引用[2]中的Feign接口降级处理类。
  • 安全定制:如Spring Cloud Security的定制。
  • 数据管理定制:如分布式事务处理。
  • 与云原生集成:如定制Kubernetes部署。


rabbbitmq的持久化机制

持久化类型实现方式
交换器的持久化指定Durability参数为durable实现
队列的持久化指定Durability参数为durable实现
消息的持久化通过消息的投递模式来实现,属于代码层面上的。可以控制每一条消息是否久化。

springmvc  controler多例还是单例。

默认是单例

如何变成多例

:注解@Scope("prototype"),将其设置为多例模式。

spring作用域有哪些类型?

singletonprototyperequestsessionapplication(在整个Web应用的生命周期内,Spring容器只会创建一个Bean实例。适用于存储全局的配置数据等。)websocket(每一个新的WebSocket会话中都会被创建一次。适用于WebSocket通信场景。)

controler的作用域是什么?

singletonprototype

介绍IOC和AOP

IOC控制反转

控制 :指的是对象创建(实例化、管理)的权力

反转 :控制权交给外部环境(Spring 框架、IoC 容器)


AOP

         AOP:Aspect oriented programming 面向切面编程,AOP 是 OOP(面向对象编程)的一种延续。

。IOC有哪些相关设计模式?


工厂模式、单例模式、策略模式、装饰者模式

将一个类声明为一个bean的注解

在 Spring 框架中,可以通过多种注解将类声明为 Spring 管理的 Bean。这些注解不仅简化了配置,还能根据不同的应用场景提供特定功能。

@Component 是最基础的注解,用于将一个普通的 Java 类声明为 Spring Bean。它适用于任何层次的组件,Spring 容器会自动扫描并实例化被标注的类。

@Repository 专用于数据访问层(DAO),除了具备 @Component 的功能外,还能将数据访问异常转换为 Spring 的 DataAccessException 类型,便于统一异常处理。

@Service 用于业务逻辑层,标注的类通常包含核心业务逻辑。它是 @Component 的特化版本,语义更明确,便于开发者理解代码结构。

@Controller 适用于 MVC 模式中的控制层,负责处理 HTTP 请求并返回视图。通常与 @GetMapping、@PostMapping 等注解配合使用。

@RestController 是 @Controller 和 @ResponseBody 的组合,专用于 RESTful Web 服务。它的返回值会直接写入 HTTP 响应体,通常以 JSON 格式返回数据。

@Configuration 用于声明配置类,配置类中可以通过 @Bean 注解定义具体的 Bean 实例,替代传统的 XML 配置文件。

@ComponentScan


注解autowire和resource的区别

 

@Autowired 属于Spring内置的注解,默认的注入方式为bytype(根据类型进行匹配),就是说会优先根据接口类型去匹配并注入Bean(接口的实现类)。当一个接口存在多个接口实现类的话,byType这种方式就无法正确注入对象了。因为这个时候Spring会同时找到多个满足条件的选择,默认情况下,它自己不知道选择哪一个。这种情况下,注入方式会变为byName(根据名称进行匹配),这个名称通常及时类名(首字母小写)

通过 @Qualifier 注解可以显式指定名称而不是依赖变量的名称

@Resource数据JDK提供的注解,默认注入方式为byName。如果无法通过byName匹配到对应的Bean,注入方式会变为byType

@Resource两个常用的属性:name(名称)、type(类型)。若仅指定name属性则注入方式为byName,若仅指定type属性则注入方式为byType,如果同时指定name和type,则注入方式为byType+byName。

spring bean的生命周期有哪些。


  1. 实例化 
  2. 属性填充 
  3. 初始化 
  4. 使用 
  5. 销毁 

spring bean是否安全?

Spring框架中的Bean是否安全,取决于其作用域和状态

prototype作用域下,不存在资源竞争问题,不存在线程安全问题

singleton作用域下,IOC容器只有唯一的bean实例,可能会存在资源竞争问题。若bean有状态,就存在线程安全问题(有状态:是指具有实例变量的对象,可以保存数据)

mybatis,如何做切面

在 MyBatis 中实现切面编程通常涉及以下几个步骤:

  1. 定义切点(Pointcut):指定切面的作用范围,例如,可以定义一个切点来匹配所有的 Mapper 接口或特定注解标记的方法。
  2. 编写通知(Advice):根据切点定义的范围,编写相应的前置通知(Before)、后置通知(After)、返回通知(AfterReturning)、异常通知(AfterThrowing)和环绕通知(Around)。
  3. 日志记录:在环绕通知中,通过获取执行的 SQL 语句并记录到日志中。这通常需要通过 MyBatis 提供的 API 来获取 BoundSql 对象,该对象包含了最终执行的 SQL 语句和参数。
  4. 异常处理:在异常通知中,可以捕获方法执行过程中的异常,并进行相应的处理,如记录错误日志等。

mybatis 如何在sql加条件

使用 where标签包裹,if 标签里 写条件,标签中间再使用 And + 其他条件

正文到此结束