春招复习:零散的八股文

Redis中的String类型基于SDS实现,提供动态字符串功能,支持O(1)复杂度长度计算和追加操作。Spring框架中,@Autowired按类型自动装配Bean,@Resource按名称装配,适用于明确Bean名称的情况。JVM内存模型包括程序计数器、虚拟机栈、本地方法栈、堆和方法区,其中堆存储对象实例,方法区存储类信息和常量。
摘要由CSDN通过智能技术生成

1、Redis 基础类型中的 String 底层实现是什么?

Redis 中的 String 类型底层实现是一个简单动态字符串(SDS,Simple Dynamic String),也就是字符串动态增长实现的一种方式。SDS 是 Redis 自己实现的字符串库,相对于 C 语言原生的字符串,SDS 在空间使用上更加灵活,而且支持 O(1) 复杂度的长度计算,避免了 C 语言字符串计算长度时的 O(N) 时空复杂度问题。

SDS 是一种动态字符串,它有如下特点:

  1. 首先 SDS 对内存的分配和释放进行了封装,使得字符串的空间可以根据需要进行增长或缩减,避免了 C 语言字符串需要手动分配空间的问题。

  1. SDS 除了记录字符串本身的长度外,还记录了分配给字符串的空间的长度,可以方便地计算出字符串是否需要扩容。

  1. SDS 使用了惰性空间释放,不会在空间缩减时立即释放空间,而是等到需要扩容时再重新分配内存。

  1. SDS 提供了字符串追加操作,可以在 O(1) 的时间内完成追加操作。

在 Redis 中,String 类型并不仅仅只是字符串类型,它还支持一些其他的操作,如递增/递减操作、位运算等,这些操作都是基于 SDS 底层实现的。

2、有哪些注解可以注入 Bean?@Autowired 和 @Resource 的区别?

在 Spring 框架中,常用的注入 Bean 的注解包括:

  1. @Autowired:自动注入,按照类型自动装配,如果有多个同类型的 Bean,则需要通过 @Qualifier 指定具体的 Bean。

  1. @Resource:Java 自带的注入方式,按照名称自动装配,默认是按照属性名称进行匹配,如果需要按照 Bean 的名称进行匹配,可以使用 @Resource(name="beanName")。

  • Autowired 默认的注⼊⽅式为 byType (根据类型进⾏匹配), @Resource 默认注⼊⽅式为byName (根据名称进⾏匹配)。

  • 当⼀个接⼝存在多个实现类的情况下, @Autowired @Resource 都需要通过名称才能正确匹配到对应的 Bean。 Autowired 可以通过 @Qualifier 注解来显示指定名称, @Resource 可以通过 name 属性来显示指定名称。

  • @Autowired 按照类型自动装配更为常用,而 @Resource 按照名称自动装配则比较适合需要明确指定 Bean 名称的情况。

  • @Autowired 是 Spring 提供的注解, @Resource 是 JDK 提供的注解。

  1. @Inject:和 @Autowired 类似,也是按照类型进行自动装配,但是 @Inject 注解是 JSR-330 提供的,而 @Autowired 注解是 Spring 框架提供的。

  1. @Value:用于注入配置文件中的属性值,可以指定默认值。

补充:将一个类声明为Spring的bean的注解

  1. @Component注解。通用的注解,可标注任意类为Spring组件。如果一个Bean不知道属于哪一个层,可以使用@Component注解标注。

  1. @Repository注解。对应持久层,即Dao层,主要用于数据库相关操作。

  1. @Service注解。对应服务层,即Service层,主要涉及一些复杂的逻辑,需要用到Dao层(注入)。

  1. @Controller注解。对应Spring MVC的控制层,即Controller层,主要用于接受用户请求并调用Service层的方法返回数据给前端页面。

3、请你介绍下 JVM 内存模型,分为哪些区域?各区域的作用是什么?

JVM 内存模型分为以下几个区域:

  1. 程序计数器(Program Counter Register):每个线程都有自己的程序计数器,用于指示当前线程执行的字节码指令的行号,以便线程执行时能够回到正确的位置。

  1. 虚拟机栈(JVM Stack):也称为 Java 方法栈,用于存储方法执行时的局部变量表、操作数栈、动态链接、方法出口等信息。每个线程在执行一个方法时,都会为该方法分配一个栈帧,并将该栈帧压入虚拟机栈,当方法执行完毕后,虚拟机会将其出栈。

  1. 本地方法栈(Native Method Stack):与虚拟机栈类似,用于存储本地方法的执行信息。

  1. 堆(Heap):用于存储对象实例,是 JVM 中最大的一块内存区域。堆是被所有线程共享的,当创建一个新对象时,对象实例存储在堆中,堆中存储的对象实例都有一个标记用于标记对象是否存活。垃圾回收器会周期性地回收那些没有被标记为存活的对象。

  1. 方法区(Method Area):用于存储已经被虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等数据。方法区也是被所有线程共享的。

  1. 运行时常量池(Runtime Constant Pool):是方法区的一部分,用于存储编译期间生成的各种字面量和符号引用,这些内容在类加载后进入常量池中。

其中,程序计数器、虚拟机栈、本地方法栈是线程私有的,堆、方法区、运行时常量池是线程共享的。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值