JAVA基础面试题
-
String final 修饰的好处
Stiring 类被 final修饰,表示此类不能被继承
方便做 hash中的key,不可变,使hash值不可变,所以只需要一次计算
安全性,线程安全 -
线程池的工作状态,是如何工作的
线程池的状态有5种:
Running:可以接收新任务,对已添加的任务进行处理
ShutDown:不能接收新任务,可以处理已添加的任务
Stop:不能接收新任务,不能处理已添加的任务,中断正在处理的任务
Tidying:当所有的任务为已终止,线程池就会变为此状态
Terminated:线程池彻底终止
如何进行工作:
a、线程池判断核心线程池里的线程是否都在执行任务
不是:创建一个新的工作线程来执行任务
是:执行b
b、线程池判断工作队列是否已经满了
没有:将新提交的任务存储在这个工作队列中进行等待
满了:执行 c
c、线程池判断线程池中的线程是否都处于工作状态
没有:创建一个新的工作线程池来执行任务
满了:交给饱和策略来处理任务 -
动态代理是如何实现的?JDK Proxy 和 CGLib 有什么区别?
-
为什么 HashMap 加载因子一定是0.75?而不是0.8,0.6?
-
Java访问修饰符的作用范围
private 同一个类 不能被子类继承和访问
default 同一个类+同一个包中的类
protected 同一个类+同一个包中的类+不同包的子类
public 所有的类 -
Java基本数据类型各占多少字节,对应的包装类型,取值范围
-
自动拆箱和装箱了解吗
自动拆箱:基本数据类型 调用了xxValue()
自动装箱:包装类 调用了valueOf() -
Java字符串拼接有几种方式
使用+号拼接
concat拼接
join拼接
StringBuffer拼接
StringBuilder拼接
StringJoiner进行拼接 -
String、StringBuffer、StringBuild的区别
String 因为被final修饰,所以是不可变对象,可以通过 new String()/直接赋值的方式创建
StringBuilder 可变的类,只能通过new StringBuilder()来创建,底层是数组,当调用toString()才算生成一个字符串,是线程不安全的
StringBuffer 可变的类,只能通过new StringBuffer()来创建,底层是数组,当调用toString()才算生成一个字符串,是线程安全的 -
StringBuffer和StringBuilder相同点
底层都是通过char数组实现,初始化容量都是16,都继承了AbstractStringBuilder
在对线程安全性不高的情况下,字符串拼接速度从小到大排序是:
StringBuilder > StringBuffer > String -
== 和 equals() 的区别
== : 是一个运算符,比较的是引用地址的值
equals():是Object中的方法,不重写的话,比较的是地址值。 -
重写了equals(),可以不重写hashCode()吗
-
hashcode相同,equals()也一定相等吗
-
了解Java反射吗
-
jar包和War包的区别
-
java中int和Integer的区别,两个Integer怎么做比较
Spring Boot 相关
-
Spring Boot的优点
独立运行、简化配置、自动配置、应用监控、开箱即用 -
springBootApplication注解中包含哪些注解
@SpringBootConfiguration:组合了 @Configuration 注解,实现配置文件的功能
@EnableAutoConfiguration:打开自动配置的功能,也可以关闭某个自动配置的选项,如关闭数据源自动配置功能: @SpringBootApplication(exclude = { DataSourceAutoConfiguration.class })。
@ComponentScan:Spring组件扫描。 -
Spring Boot是怎么实现自动配置的
注解 @EnableAutoConfiguration, @Configuration, @ConditionalOnClass 就是自动配置的核心,首先它得是一个配置文件,其次根据类路径下是否有这个类去自动配置。 -
什么是Spring Boot Stater,常用的Stater都有哪些
Spring Boot Stater是一个
常用的Stater有:
spring-boot-starter-web Web 和 RESTful 应用程序
spring-boot-starter-actuator 监控和跟踪应用的高级功能
spring-boot-starter-aop
spring-boot-starter-data-redis
spring-boot-starter-logging 使用 logback 进行日志记录 -
Spring Boot的运行流程
-
Spring Boot中常用的注解有哪些?
@RestController、@Autowired、@RequestMapping、@Service、@Value、@Component、@SpringBootApplication -
@RestController和@Controller的区别
两者都用来表示Spring某个类的是否可以接收HTTP请求
@Controller标识一个Spring类是Spring MVC controller处理器
@RestController是@Controller和@ResponseBody的结合体 -
@Autowired 实现自动注入的原理
-
Spring Boot配置文件有哪几种,加载顺序
yml和 properties
yml -> yaml -> properties
.yml 格式不支持 @PropertySource 注解导入配置
Maven 相关
- maven 常用的命令有哪些,作用是什么
maven clean:清除target下的文件
maven install: 将项目安装到本地仓库
maven package: 用于项目打包
maven deploy: 将本地jar发布到远程仓库
Redis相关
-
什么是Redis
Redis 是一个完全开源免费的,是一个高性能的key-value数据库 -
Redis的特点
支持丰富的数据类型:String、Hash、List、Set、ZSet
支持数据持久化
性能高,数据处理全部在内存中
支持事物:原子性-> 要么全部成功要么全部失败 -
Redis是单进程单线程的吗?
Redis6以前:Redis是单进程单线程的。
Redis6以后:之前核心逻辑是单线程,6之后IO变成多线程 处理请求还是单线程。 -
一个字符串类型的最大容量是多少?
512M -
redis持久化机制了解吗,你们用的哪种持久化机制
RDB:将内存中所有的数据暂存到一个临时文件中,并打包成dump.rmb
优点:数据集比较大的时候,比AOF启动效率高
只会有生成一个文件
性能最大化。主进程可以继续执行命令,子进程进行持久化
缺点:数据安全性低。当数据在存储时,突然发生宕机,重启之后,没有持久化的数据将会丢失
在进行持久化时,内存会膨胀
文件内容存储的形式是二进制
AOF:将数据以redis命令请求协议格式记录。持久化保存为 .aof文件
优点:数据安全,相当于执行一次命令,就会持久化一次
通过append模式追加,即使服务器宕机,也可以通过 redis-check-aof工具来解决数据一致性问题
缺点:AOF文件比RDB文件大,恢复速度慢
我们通常使用 RDB+AOF -
Redis过期键的删除策略
定时删除:在设置键的过期时间的同时,创建一个定时器timer。在键快过期时,定时器立即执行删除操作
定期删除:每隔一段时间,会对数据库进行一次检查,删除里面的过期键。
惰性删除:每次从键空间中获取键时,都会检查键是否过期。过期 则删除,否则返回 -
如果有大量的key需要设置同一时间过期,需要怎么处理
最好不要让大量的key设置同一时间过期,因为在进行删除操作时,会出现卡顿现象。
一般需要在时间上加一个随机值,让过期时间分散一些 -
Redis 的回收策略(淘汰策略)
共有 6 种机制
volatile:对已设置过期时间的数据集淘汰
volatile-lru:在已设置过期时间的数据集中,删除最近最少访问的数据
volatile-ttl:在已设置过期时间的数据集中,删除即将过期的数据淘汰
volatile-random:在已设置过期的数据集中,随机删除任意数据
allkeys:对全部数据集淘汰数据
allkeys-lru:在全部数据集中,删除最近最少访问的数据
allkeys-random:在全部数据集中,随机删除任意数据
no-enviction(驱逐):禁止驱逐数据 (不删除数据)
使用策略规则:
数据呈现幂律分布(也就是冷数据和热数据之分),使用 allkeys-lru
数据访问频率相同,使用 allkeys-random -
Redis为什么需要把所有数据放到内存
redis需要达到最快的读写速度,并通过异步的方式将数据写入磁盘。
减少磁盘I / O 的影响 -
Redis内存达到了最大使用内存会发生什么情况
达到了最大使用使用内存,写入数据时,会根据设定的淘汰策略进行淘汰,一次只会淘汰一条数据,淘汰之后,写入数据占用的内存=剩余内存,则写入成功,否则 写入失败,并抛出异常。但是可以正常的查询数据 -
Redis 的同步机制了解么?
同步机制有两种:
主从同步,从从同步
第一次同步时,主节点做一次 bgsave,并同时将后续修改操作记录到内存 buffer,待完成后将 rdb 文件全量同步到复制节点,复制节点接收完成后将 rdb 镜像加载到内存。加载完成后,再通知主节点将期间修改的操作记录同步到复制节点进行重放就完成了同步过程。 -
Redis集群是否了解
Redis Sentinal(哨兵) 着眼于高可用,在 Master 宕机时会自动将 slave 提升为master,继续提供服务。
Redis Cluster(集群) 着眼于扩展性,在单个 Redis 内存不足时,使用 Cluster 进行分片存储 -
集群什么情况下会出现不可用的情况
集群使用的是哈希槽,在分配了哈希槽的主从节点都不可用
集群中超过多一半节点不可用的情况 -
Redis 哈希槽的概念
集群中有16384个哈希槽,每个key通过CRC16校验后对16384取模来决定在槽中的位置,集群中的每个节点负责一部分hash槽。 -
Redis 最适合的场景?
会话缓存、全页缓存、队列、排行榜/计数器、发布/订阅 -
假如 Redis 里面有 1 亿个 key,其中有 10w 个 key 是以某个固定的已知的前缀开头的,如果将它们全部找出来?
使用 keys 指令可以扫出指定模式的 key 列表,不建议在线上的业务使用,因为redis是单线程的,keys指令会导致线程阻塞一段时间,服务会出现卡顿。可以使用 scan 替换,scan可以无阻塞的取出key列表,但是会出现一定的重复,需要在客户端做一次去重。
总体来说:scan耗费的时间比keys所花费的时间更长 -
redis怎么保证数据是最新的
Spring Cloud相关
- SpringCloud是什么
- 常用的组件有哪些
- 服务是怎么进行拆分的
- 服务之间通过fegin相互调用,当服务不可用的时候,怎么解决
- 网关里面进行了哪些处理
- spring cloud eureka 当服务断掉之后,是怎么处理的
- eureka服务宕掉之后,会立即从eureka上摘掉吗
- eureka 的自我保护机制是什么
- 熔断和限流有几种
代码版本管理
- 代码管理用的是什么,常用的命令有什么
代码管理用的是 git
常用的命令有: - 提交命令的流程
- 代码冲突怎么解决
- 代码回退的命令是什么,回退到某个版本号的命令是什么
- 如何查看私有仓库中的依赖有没有更新
RabbitMQ相关
- 为什么要用rabbitmq以及应用场景是什么
- rabbitmq 消息堆积是怎么处理的