今日面试
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 性能
需要根据实际查询需求来设计联合索引
- 本文标签: SpringCloud
- 本文链接: http://119.91.109.247:8443//article/157
- 版权声明: 本文由张亚东原创发布,转载请遵循《署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0)》许可协议授权