2024java常见面试题笔记

1、jdk1.8的新特性

lambda表达式、Date Time API、Stream流等

2.concurrentHashMap和HashMap区别

(1)底层数据结构
JDK1.7,ConcurrentHashMap 底层采用分段的数组+链表实现,
JDK1.8 采用的数据结构跟HashMap1.8的结构一样,数组+链表+红黑树
(2)线程安全方面
HashMap是线程不安全的
JDK1.7,ConcurrentHashMap采用分段锁,对整个桶数组进行分割为segment,每一把锁,锁容器中的一部分数据,多线程访问容器中不同数据段,不会存在锁竞争,如果是同段数据则会竞争。
JDK1.8之后放弃这种设计,采用Node数组+链表+红黑树来实现,并发控制使用synchronized和CAS,synchronized只锁当前链表或者红黑树的头结点,只要hash不冲突,就不会有锁竞争。

3.线程池创建的方式

(1)Executors工具类
创建单线程的、固定长度型的、缓存型的、可定时执行的
(2)使用ThreadPoolExecutor构造函数创建线程池

4.线程池的拒绝策略有哪些

总共有四种,
(1)抛出异常
(2)是直接丢弃
(3)丢弃掉存活时间最长的任务
(4)谁提交谁执行

5.乐观锁和悲观锁

悲观锁是假定每次获取数据时都会认为会被修改,每次操作之前都会上锁
乐观锁是每次获取数据都认为不会被修改,都不会上锁
乐观锁的实现方式:
(1)版本号机制:数据表中加版本号version,表示数据被修改次数,每次修改加1,每次更新时都会读取version值,提交时候再进行判断version值是否有变化,相等时才成功
(2)CAS算法:compare and swap,多线程下更新,只有一个线程能更新成功,会取三个值,内存位置,预期原值和新值,只有当内存地址里面的值和预期原值一样才会更新成功

6.synchronized锁的升级

无锁—》偏向锁—》轻量级锁-》重量级锁
monitor 对象头中的线程 id 设置为当前线程 id

7.synchronized 和 Lock 有什么区别?

(1)首先synchronized是Java关键字,Lock是 Java 接口;
(2)synchronized 可以给方法、代码块加锁;而 lock 只能给代码块加锁。
(3)synchronized 不需要手动获取锁和释放锁,发生异常会自动释放锁,不会造成死锁;而 lock 需要自己加锁和释放锁,如果没有使用 unLock()去释放锁可能造成死锁。
(4)lock可以判断自己有没有成功获取锁

8.synchronized 和 ReentrantLock 区别是什么?

(1)本质区别:synchronized 是关键字,ReetrantLock是类
(2)加锁和释放锁,ReentrantLock 必须手动获取与释放锁,而 synchronized 不需要手动开启和释放锁;
(3)作用域:ReentrantLock 只能给代码块加锁,而 synchronized 可以给方法、代码块加锁。
(4)底层实现:ReentrantLock 底层调用的是 Unsafe 的 park 方法加锁,synchronized 操作的是对象头

9.CycliBarriar和CountDownLatch

CountDownLatch一般任务分为N个子线程去执行,state也初始化为N,N个子线程是并行执行的,每个子线程执行完后countDown()一次,state减1。等到state=0,会unpark()主调用线程,然后主调用线程就会从await()函数返回,继续后余动作。
CycliBarriar是可复用的,一般用于一组线程互相等待至某个状态,然后这一组线程再同时执行

10.MyISAM和InnoDB的区别

(1)事务方面,MyISAM不支持事务,InnoDB支持事务
(2)外键,MyISAM不支持外键和行锁,InnoDB支持外键和行锁
(3)索引方面,MyISAM采用非聚簇所用,InnoDB采用聚簇索引

11.索引设计的原则?

(1)经常查询的条件字段,where子句的列或者连接子句中的指定列
(2)经常需要排序、分组操作的字段
(3)更新频繁字段一般不适合创建索引
(4)最左前缀原则

12.事务的四大特性

ACID
(1)原子性,每个事务不可分割,要么全部成功,要么全部失败
(2)一致性,事务执行前和执行后必须处于一致性状态
(3)隔离性,并发访问数据库,事务之间是隔离的
(4)持久性,事务一旦被提交,就是永久性的改变

13.事务的隔离级别

(1)读未提交
脏读、不可重复读、幻读
(2)读已提交
不可重复读、幻读
(3)可重复读
幻读
(4)可串行化

14.什么是脏读?不可重复读?幻读?

(1)脏读
事务1读取到事务2未提交的数据,然后事务2回滚了
(2)不可重复读
事务1读取两次结果不一样,中间做了更新操作
(3)幻读
两次完全相同的查询结果不一样,中间可能做了新增和删除

16.MyBatis的一级缓存和二级缓存

(1)一级缓存
MyBatis默认开启,不能关闭,由MyBatis自己维护,其存储作用域为 SqlSession
(1)二级缓存
二级缓存的存储作用域是SqlSessionFactory ,默认关闭,所有的session可以共用,使用二级缓存的时候需要对象实现Serializable序列化接口

17.niginx的负载均衡策略

(1)轮询策略,按时间片轮询
(2)指定权重,权重和访问量成正比
(3)ip hash或url hash
(4)最少连接转发,请求转发到最少连接的那台服务器

18.rabbitmq的使用场景,好处?

(1)异步处理,提高了系统吞吐量
(2)应用业务解耦,不需要关心业务场景,只用做自己的事情
(3)流量削峰,通过增大消息队列长度,可以缓解短时间内高并发请求问题
(3)顺序消费,发送的消息按照发送顺序进行消费

19.rabbitmq的工作模式

(1)simple模式
简单模式,生产消息,放入队列,消费后删除
(2)work工作模式
消息生产到队列,消费者们同时监听同一个队列,消费消息
(3)发布订阅模式
消息生产到交换机,无条件的广播给订阅该交换机的队列进行消费
(4)路由模式
消息生产到交换机,根据Routing Key有条件的将消息筛选后发送给队列进行消费
(5)主题模式
通过用*和#的通配符来匹配队列,发布消息

20.rabbitmq消息基于什么传输?

RabbitMQ使用信道的方式来传输数据。信道是建立在真实的TCP连接内的虚拟连接,且每条TCP连接上的信道数量没有限制。

21.rabbitmq消息积压应该怎么办?

(1)调整消费者的消费能力
(2)增加队列长度上限
(3)采用限流控制
(4)使用惰性队列,接收到消息先存入到磁盘,消费的时候从磁盘加载到内存

22.rabbitmq消息如何保证不丢失

(1)采用消息确认机制,每消费一条消息会回复ack确认消息
(2)把消息持久化到磁盘
(3)增加备用队列

23.rabbitmq如何保证消息顺序一致性

(1)同类型的消费者绑定一个队列
(2)消费者进行排队消费

24.rabbitmq如何避免幂等性(消费者重复消费)

(1)消息增加唯一标识id,消费后持久化到磁盘,再次消费时进行查询,确认是否消费过
(2)设置补偿机制,确保在发生重复消费问题时,不会造成影响

25.你写代码有没有什么心得?

(1)注意方法的时间复杂度,尽量让时间复杂度降下来
(2)注意IO操作,包括数据库通信,网络通信。尽量减少IO时长
(3)打印日志,打印关键日志信息,日志信息要详细,不要冗余

26.Redis 与 普通缓存 相比有哪些优势?

(1)速度快,redis读数据每秒11万次,写数据每秒8万次
(2)可以持久化数据,支持AOF和RDB两种持久化方式
(3)存储数据结构丰富,支持string、list、hash、set、zset
(4)支持主从复制
(5)支持事务

27.Redis为什么快

(1)它是单线程的,避免了多线程下的线程切换,也没有锁的竞争
(2)采用I/O多路复用模型。非阻塞IO
(3)基于内存存储

28.Redis持久化数据

AOF:
写入机制:现将写命令进行校验,如果没问题就将该命令追加到.aof的日志文件中,也就是先放到 磁盘里,然后服务器再执行命令。如果redis宕机了,就对所有写操作进行命令重演。
写入缓存:在命令写入磁盘中,并不是直接将命令写入到磁盘,而是先放入到buffer中,等缓冲区填满的时候,异步的将缓冲区中内容写入到磁盘,这就会导致出现日志丢失
异步写入磁盘提供了三种策略:
(1)每写一条命令到都会调用fsync函数,将缓冲区命令写入到磁盘
(2)每秒调用一次fsync函数,写入磁盘
(3)服务器不主动调用,操作系统自己决定
重写机制:redis长期运行的时候,aof文件会越来越长,如果宕机后重演会非常耗时,
(1)服务器定时执行重写命令
(2)主进程fork出子进程执行重写操作,保证主进程不会被阻塞
(3)子进程遍历数据写入到新的aof文件,期间客户端的写请求写入到aof缓冲区和重写缓冲区。
(4)子进程写完aof文件后给主线程发信号,主线程把aof重写缓冲区数据写到新aof文件中
(5)新的aof文件覆盖旧的文件完成重写

RDB:全量备份,二进制文件
save命令:阻塞主线程,等待备份任务执行完
bgsave 命令:fork出子进程来执行持久化,只有在fork子进程的时候才会短暂阻塞

29.redis过期键的删除策略

三种
(1)定时过期,每个key创建定时器,到期清理
(2)惰性过期,当访问一个key时判断他是否过期,过期再清除
(3)定期过期,每隔一段时间进行检查,删除过期的key

30.redis内存淘汰策略

在Redis服务器用于缓存的内存不足时,如何处理新写入的数据
(1)全局所有数据的键选择性移除
移除最近最少使用的LRU、随机移除几个random、写操作报错
(2)设置过期时间的键选择性移除
移除最近使用少的LRU、随机移除几个random、最早过期的key先移除ttl

31.redis事务

redis事务不保证原子性,且没有回滚,中间某条事务执行失败了,前面已经执行的不回滚,后面继续执行

32.Redis 主从复制

(1)从节点执行slaveof命令
(2)从节点保存主节点信息
(3)从节点定时任务发现主节点信息,开启socket连接
(4)连接成功后,发送ping命令,主节点响应pong
(5)进行权限验证
(6)同步主节点中所有数据
(7)同步完成后,主节点持续发送写命令

33.redis的缓存

缓存雪崩:缓存同一时间大面积失效,导致所有请求都落到数据库上,造成数据库崩掉
解决方法:
(1)缓存数据过期时间设置随机
(2)热点数据永不过期
(3)定时检查更新数据
(4)使用锁控制并发读取线程数量

缓存穿透:缓存和数据库都没有数据,导致请求落在数据库上,导致数据库崩掉
解决办法:
(1)可以设置key-null的键值对
(2)采用布隆过滤器,将不存在的key拦截掉

缓存击穿:缓存中没有但是数据库中有数据,导致请求落在数据库上,导致数据库崩掉
解决办法:
(1)热点数据用不过期
(2)加互斥锁

34.如何保证redis的缓存一致性

(1)先写入数据库再更新缓存
(2)读操作双重检查,先读redis缓存,若缓存中没有数据或过期,则再去读数据库
(3)定时同步mysql数据到redis中
(4)采用消息队列,先发到消息队列中,再由消息队列同步mysql和redis中

  • 7
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
Java面试真题60道笔记是一本针对Java开发岗位的面试题集合。本书分为六个部分:基础知识与语法、面向对象、集合类、IO流与多线程、网络编程和数据库基础。每个部分都包括了该领域的常见问题和解答,以及一些实际场景中的应用题目。 在基础知识与语法部分,包括Java的数据类型、算术运算符、流程控制和异常处理等基本语法知识的问题。这些问题有助于检验应聘者对Java语言的熟悉程度。 面向对象部分则关注于类、对象、继承、多态和接口等面向对象的概念。这些问题旨在考察应聘者对面向对象编程的理解和实践经验。 集合类部分包括了常用的集合类容器,如List、Set和Map等,以及它们的特点和应用场景。这些问题可以考察应聘者对Java集合类的熟练掌握程度。 在IO流与多线程部分,问题主要涉及Java中的输入输出流和多线程编程。这些问题可以考察应聘者对Java的并发编程和IO操作的理解和应用能力。 网络编程部分主要涉及Java中的网络通信和Socket编程等知识。这些问题可以考察应聘者对网络编程的了解和实践经验。 最后,数据库基础部分主要涉及Java与数据库交互的知识,包括连接数据库、执行SQL语句和事务管理等内容。这些问题可以考察应聘者对数据库操作和数据持久化的了解和应用能力。 总之,Java面试真题60道笔记是一本综合性的Java面试题集,涵盖了基础知识、面向对象、集合类、IO流与多线程、网络编程和数据库基础等方面的内容,有助于应聘者在面试中更好地展示自己的技能和经验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值