2023java面试题整理

1-6奥深科技面试题 线下面试一面
1、对aop有什么了解吗?
2、谈谈你对redis的了解。
aof与rdp的区别
有用过哪些数据结构list与set的区别
3、Mysql 自增id、uuid与雪花id、还有未指定主键的场景
4、bean的生命周期有哪些?
5、死信队列
天天拍车电话面试一面
6、怎么保证下单订单的唯一性,如果订单号生成重复了呢?是重新生成吗还是怎么样
7、雪花算法你能讲下吗?
8、如果让你自己设计一套分布式锁,你会考虑哪些东西?比如说用redis实现呢
setNx
那如何续期呢
引入redission,它是如何实现的
9、接口上的防重,除了使用锁的方式,你还有哪些其他操作吗?
10、jvm的内存模型
哪下是线程私有的?本地方法栈、程序计数器
11、垃圾回收器G1
12、线程的几个参数你能简要介绍下吗
13、线程池有哪些应用场景
14、线程池你们在一个服务里会创建多个吗
15、多线程如果我关心返回值,应该有什么方法呢
16、索引优化的逻辑?mysql索引的数据结构是怎样的,b+tree与b tree的区别
17、讲下eureka的服务注册或发现的流程
18、谈谈spring容器的看法(open问题)
ioc是什么、aop是什么
19、spring bean的存储是怎样的?
20、spring事务的机制?@Transaction的传播特性,它底层是通过什么实现的?
21、rabbitMq的有几种交换机?
学透医疗
22、eureka、nocas作为注册中心,底层是通过什么机制或原理实现的?或者说底层代码是什么样的?
在这里插入图片描述
23、String = 和 new String 的区别

String = 是在常量池 创建;new String是在堆中创建
参考:https://blog.csdn.net/weixin_44057803/article/details/125065223?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522170109803316800227441822%2522%252C%2522scm%2522%253A%252220140713.130102334..%2522%257D&request_id=170109803316800227441822&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduend~default-1-125065223-null-null.142^v96^pc_search_result_base5&utm_term=string%E5%92%8Cnew%20string%20%E6%AF%94%E8%BE%83&spm=1018.2226.3001.4187

24、hashmap的数据结构。是否线程安全?什么原因导致的不安全?线程安全我们应该用哪个?HashTable是怎么实现线程安全的
25、synchronic关键字的锁升级的一个机制

26、arrayList与linkList数据结构的特点及各自的优劣
27、springboot的自动装配的过程,springBoot 自己做一个start你怎么做
28、rabbitMq 生产者的confim模式有哪几种?

三种,
方式一:channel.waitForConfirms()普通发送方确认模式;
方式二:channel.waitForConfirmsOrDie()批量确认模式;
方式三:channel.addConfirmListener()异步监听发送方确认模式;

29、Hystrix是怎么进行熔断、降级或者什么技术
华傲数据
30、@Resource和@Autowired的区别

(1)来源不同:@Autowired是Spring定义的注解,而@Resource是java定义的注解。
(2)依赖的查找顺序不同:依赖注入的功能,是通过在springIOC容器(单例池)中查找对象,再将对象引入到当前类中,而查找又分为两种实现:按名称查找	(byName)查找和按类型(byType)查找:
@autowired是先按照类型查找,如果存在多个bean再根据名称(byName)进行查找。
@Resource是先按照name查找,如果查询不到,再按照type查找。
(3)支持的参数不同
@Autowired只支持设置一个required的参数,而@Resource支持七个参数。
(4)依赖注入方式不同
@Autowired支持:属性注入、构造方法注入和setter注入。
@Resource支持:属性注入和setter注入。
(5)编译器错误提示不同
使用idea在编写依赖注入的代码时,如果是注入的是mapper对象,那么使用@Autowired编译器会提示报错信息。如果使用@Resource则不会。

31、char与varchar的区别

区别一,定长和变长
char 表示定长,长度固定,varchar表示变长,即长度可变。char如果插入的长度小于定义长度时,则用空格填充;
varchar小于定义长度时,还是按实际长度存储,插入多长就存多长。

因为其长度固定,char的存取速度还是要比varchar要快得多,方便程序的存储与查找;
但是char也为此付出的是空间的代价,因为其长度固定,所以会占据多余的空间,可谓是以空间换取时间效率。varchar则刚好相反,以时间换空间。

区别之二,存储的容量不同
对 char 来说,最多能存放的字符个数 255,和编码无关。
而 varchar 呢,最多能存放 65532 个字符。varchar的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是 65,532字节。

32、spring怎么开启事务?@Transactional失效的几种场景。
未使用public 修饰方法;try…catch捕获了异常;同类中A调用加事务注解的B方法
33、有什么办法能解决HashMap线程不安全的问题呢?

Java 中有 HashTable、Collections.synchronizedMap、以及 ConcurrentHashMap 可以实现线程安全的 Map。
HashTable 是直接在操作方法上加 synchronized 关键字,锁住整个table数组,粒度比较大;
Collections.synchronizedMap 是使用 Collections 集合工具的内部类,通过传入Map 封装出一个 SynchronizedMap 对象,
内部定义了一个对象锁,方法内通过对象锁实现,锁的是一段代码块;
ConcurrentHashMap 在jdk1.7中使用分段锁,在jdk1.8中使用CAS+synchronized。

34、list去重的方式
35、
在这里插入代码片在这里插入图片描述
第一题

首先,我们需要明确学生信息和考试结果之间的关系。从给定的表结构中,我们可以推断以下关系:

学生信息存储在student表中。
学科信息存储在subject表中。
学生的考试结果存储在result表中。
要查询参加学科名称为"计算机"考试的学生信息,我们需要联接这三个表,并根据学科名称进行筛选。

以下是三种可能的SQL查询方法:

方法1: 使用INNER JOIN
sql
SELECT s.student_no, s.student_name  
FROM student s  
INNER JOIN result r ON s.student_no = r.student_no  
INNER JOIN subject sub ON r.subject_no = sub.subject_no  
WHERE sub.subject_name = '计算机';
解释:
此查询首先通过student_no将student表和result表联接,然后通过subject_no将结果与subject表联接。最后,它筛选出学科名称为"计算机"的记录。

方法2: 使用子查询
sql
SELECT student_no, student_name  
FROM student  
WHERE student_no IN (  
    SELECT student_no   
    FROM result   
    WHERE subject_no IN (  
        SELECT subject_no   
        FROM subject   
        WHERE subject_name = '计算机'  
    )  
);
解释:
此查询首先查找学科名称为"计算机"的subject_no,然后使用该subject_no来查找在result表中有相关记录的学生。最后,它从student表中获取这些学生的信息。

方法3: 使用EXISTS子句
sql
SELECT student_no, student_name  
FROM student s  
WHERE EXISTS (  
    SELECT 1   
    FROM result r   
    JOIN subject sub ON r.subject_no = sub.subject_no   
    WHERE sub.subject_name = '计算机' AND r.student_no = s.student_no  
);
解释:
此查询使用EXISTS子句来查找在result表和subject表中有相关记录的学生。如果学科名称为"计算机"且学生编号与student表中的学生编号匹配,则返回该学生的信息。

第二题

针对你给出的events表结构,以下是三种查询每个玩家每个登录日期前已经累计通过的关卡数的SQL写法:

写法1: 使用SUM()窗口函数
sql
SELECT  
  player_id,  
  event_date,  
  SUM(game_played) OVER (PARTITION BY player_id ORDER BY event_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_games_passed  
FROM  
  events;
写法2: 使用自连接
这种方法不使用窗口函数,而是使用自连接和聚合函数来实现累计计算。

sql
SELECT  
  e1.player_id,  
  e1.event_date,  
  SUM(e2.game_played) AS cumulative_games_passed  
FROM  
  events e1  
JOIN  
  events e2 ON e1.player_id = e2.player_id AND e2.event_date <= e1.event_date  
GROUP BY  
  e1.player_id, e1.event_date;
写法3: 使用临时表或子查询
这种方法首先计算每个玩家的累计关卡数,然后再基于这个结果进行查询。

sql
SELECT  
  t.player_id,  
  t.event_date,  
  (SELECT SUM(game_played) FROM events WHERE player_id = t.player_id AND event_date <= t.event_date) AS cumulative_games_passed  
FROM  
  events t;
或者你可以使用临时表:

sql
CREATE TEMPORARY TABLE temp_cumulative AS   
SELECT  
  player_id,  
  event_date,  
  SUM(game_played) OVER (PARTITION BY player_id ORDER BY event_date ASC ROWS BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW) AS cumulative_games_passed  
FROM  
  events;  
  
SELECT * FROM temp_cumulative;
注意:上述SQL语句可能需要根据具体的数据库管理系统和其版本进行调整。在实际应用中,建议先在一个安全的环境中测试这些查询,以确保它们的行为符合预期。

36、ConcurrentHashMap原如何保证的线程安全?1.8具体哪个位置用CAS、Synchronized?

JDK1.7:使用分段锁,将一个Map分为了16个段,每个段都是一个小的hashmap,每次操作只对其中一个段加锁
JDK1.8:采用CAS+Synchronized保证线程安全,每次插入数据时判断在当前数组下标是否是第一次插入,是就通过CAS方式插入,
然后判断f.hash是否=-1,是的话就说明其他线程正在进行扩容,当前线程也会参与扩容;删除方法用了synchronized修饰,保证并发下移除元素安全。

37、ArrayList和LinkedList的区别

ArratList的底层使用动态数组,默认容量为10,当元素数量到达容量时,生成一个新的数组,大小为前一次的1.5倍,然后将原来的数组	copy过来;
因为数组在内存中是连续的地址,所以ArrayList查找数据更快,由于扩容机制添加数据效率更低。
LinkedList的底层使用链表,在内存中是离散的,没有扩容机制;
LinkedList在查找数据时需要从头遍历,所以查找慢,但是添加数据效率更高。

38、你们项目中都用redis做什么 ?
缓存、消息队列、redis作为分布式锁(这是最重要的三点),其他还有 作为 计数器、数据库、实现分布式缓存、实时统计、推荐系统、热点数据存储、地理位置存储和时序数据存储等应用场景

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值