原创

今日面试

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

1、java中有哪几种基本数据类型,各占几个字节?

Java中的基本数据类型及其占用的字节数如下:

- `byte`:1个字节,取值范围为-128到127
- `short`:2个字节,取值范围为-32,768到32,767
- `int`:4个字节,取值范围为-2,147,483,648到2,147,483,647
- `long`:8个字节,取值范围为-9,223,372,036,854,775,808到9,223,372,036,854,775,807
- `float`:4个字节,单精度浮点数
- `double`:8个字节,双精度浮点数
- `char`:2个字节,表示Unicode字符
- `boolean`:Java规范中未明确规定字节数,通常虚拟机实现会使用1个字节或更少的空间来存储boolean值

这些基本数据类型是Java语言的基础,它们不是对象,而是直接存储值的简单数据类型。

Redis的内存回收机制主要通过以下几种方式工作


## 1. 过期键删除策略

Redis采用两种策略来处理过期键:

- **定时删除**:在访问键时检查过期时间,如果已过期则删除
- **定期删除**:周期性地随机检查一部分键,删除其中的过期键

## 2. 内存淘汰策略

当内存使用达到 `maxmemory` 限制时,Redis会根据配置的淘汰策略进行回收:

- `noeviction`:不淘汰数据,返回错误
- `allkeys-lru`:从所有键中淘汰最近最少使用的键
- `volatile-lru`:从设置了过期时间的键中淘汰最近最少使用的键
- `allkeys-random`:从所有键中随机淘汰
- `volatile-random`:从设置了过期时间的键中随机淘汰
- `volatile-ttl`:优先淘汰剩余生存时间短的键

## 3. LRU算法实现

Redis使用近似LRU算法:

- 随机采样若干键
- 按访问时间排序
- 淘汰最久未访问的键

## 4. 内存回收进程

Redis的内存回收是集成在主进程中的,通过以下方式触发:

- 定时任务定期执行
- 内存使用达到阈值时主动触发
- 命令执行过程中实时检查和回收

在 queue 中,poll 和 remove 方法的主要区别如下

返回值处理方式
poll 方法:
当队列为空时,返回 null
不会抛出异常
remove 方法:
当队列为空时,抛出 NoSuchElementException 异常
不会返回 null
使用场景
poll:适用于希望避免异常处理的场景,通过检查返回值是否为 null 来判断队列是否为空
remove:适用于明确知道队列不为空,或者希望在队列为空时立即得到异常反馈的场景

java中,为什么允许静态方法返回非静态变量?()

1. 实例创建机制
静态方法虽然属于类级别,但可以在方法内部创建对象实例
通过 new 关键字创建的实例对象可以被静态方法返回
2. 对象引用传递
静态方法可以接收对象参数并返回该对象
可以通过其他方式获取到实例对象的引用并返回
3. 设计模式应用

public class Example {
    // 工厂模式中的静态工厂方法
    public static Example createInstance() {
        return new Example(); // 返回非静态实例
    }
    
    // 单例模式
    private static Example instance;
    public static Example getInstance() {
        if (instance == null) {
            instance = new Example();
        }
        return instance; // 返回非静态实例
    }
}

4. 方法作用域独立性
static 关键字只限制了方法的调用方式
方法内部的逻辑和返回值类型不受静态修饰符限制
静态方法可以访问和操作任何类型的对象
因此,静态方法返回非静态变量是完全合法且常见的编程实践。

JDK1.8支持最高springboot的版本?

JDK 1.8 支持的最高 Spring Boot 版本
Spring Boot 2.7.x 是最后一个支持 JDK 1.8 的主要版本
具体来说,Spring Boot 2.7.18 是 2.7.x 分支的最后一个版本,完全支持 JDK 1.8
从 Spring Boot 3.0 开始,最低要求是 JDK 17
版本兼容性说明
Spring Boot 2.x 系列:支持 JDK 8 到 JDK 17
Spring Boot 3.x 系列:需要 JDK 17 或更高版本
建议使用 Spring Boot 2.7.18 作为 JDK 1.8 环境下的最终选择
如果仍在使用 JDK 1.8,建议升级到 Spring Boot 2.7.18 以获得最佳兼容性和安全性支持

mysql用的是哪个引擎?innodb和MyISAM的区别?B+树?


1. 事务支持
InnoDB:支持事务(ACID 特性),提供提交、回滚和崩溃恢复能力
MyISAM:不支持事务
2. 锁机制
InnoDB:支持行级锁,适合高并发环境
MyISAM:只支持表级锁,并发性能较差
3. 外键约束
InnoDB:支持外键约束
MyISAM:不支持外键
4. 存储结构
InnoDB:数据和索引存储在同一个文件中
MyISAM:数据和索引分别存储在 .MYD 和 .MYI 文件中
5. 崩溃恢复
InnoDB:具有崩溃恢复能力,数据安全性高
MyISAM:崩溃后数据恢复困难
B+ 树索引结构
B+ 树特点
内部节点:只存储键值,不存储实际数据记录
叶子节点:存储所有键值和对应的数据记录指针
链表连接:叶子节点通过指针连接成有序链表
平衡性:所有叶子节点到根节点的距离相同
B+ 树优势
适合范围查询,叶子节点的链表结构便于遍历
磁盘读写效率高,内部节点只存储键值,能容纳更多索引项
查询性能稳定,任何查询都需要遍历到叶子节点
在 MySQL 中的应用
InnoDB:使用 B+ 树作为主键索引和二级索引的底层数据结构
MyISAM:也使用 B+ 树作为索引结构,但叶子节点存储的是数据记录的地址

联合索引?

联合索引是指在表的多个列上创建的索引,也称为复合索引或组合索引。

语法:CREATE INDEX `index_name` ON `table_name` (`column1`, `column2`, `column3`);

工作原理
联合索引遵循最左前缀原则
数据按照索引列的顺序进行排序存储
只有从最左边的列开始连续使用索引才会生效
最左前缀原则示例
假设创建联合索引 idx_abc on (a, b, c):
✅ 有效使用索引的情况:
WHERE a = ?
WHERE a = ? AND b = ?
WHERE a = ? AND b = ? AND c = ?
WHERE a = ? ORDER BY b
❌ 无法使用索引的情况:
WHERE b = ?
WHERE c = ?
WHERE a = ? AND c = ?(跳过了 b)
优势
减少磁盘 I/O 操作
提高查询性能
减少存储空间(相比多个单列索引)
注意事项
列的顺序很重要,应将选择性高的列放在前面
过多的联合索引会影响 INSERT、UPDATE、DELETE 性能
需要根据实际查询需求来设计联合索引
正文到此结束