快手本地生活-Java实习一面【面试真题】
- 前言
- 版权
- 推荐
- 快手本地生活-Java实习一面
- 1.自我介绍
- 2.秒杀详细说一下
- 3.异步扣减库存,用户会收到什么,一定成功吗
- 4.异步用户怎么拿到结果
- 5.论坛es和数据库怎么保持一致,为什么有redis
- 6.dns解析过程
- 7.静态变量作用,项目中是如何使用的
- 8.String,StringBuffer,StringBuilder的区别
- 9.重载和重写具体是什么
- 10.java多态是什么
- 11.ArrayList和LinkedList的区别
- 12.介绍一下hashmap
- 13.为什么要使用多线程,缺点是什么
- 14.jvm运行时数据区,具体介绍一下
- 15.jvm的垃圾回收算法,说一下过程
- 16.MySQL事务特性
- 17.MySQL索引结构,聚簇和非聚簇的区别
- 18.平常用什么索引,最左前缀原则是什么
- 19.慢查询优化,怎么排查问题,具体哪些情况
- 20.relay和binlog是什么,用途是什么
- 21.了解过监听binlog吗
- 22.redis数据结构
- 23.zset介绍一下
- 24.redis过期策略,介绍一下
- 25.aop是什么,具体怎么用的
- 29.jdk的动态代理
- 30.cglib动态代理
- 31.git为什么冲突,怎么解决
- 32.LRU
- 33.反问
- 最后
前言
2023-7-28 11:00:00
发布于
2024-5-17 17:20:52
以下内容源自《【面试真题】》
仅供学习交流使用
版权
禁止其他平台发布时删除以下此话
本文首次发布于CSDN平台
作者是CSDN@日星月云
博客主页是https://blog.csdn.net/qq_51625007
禁止其他平台发布时删除以上此话
推荐
快手本地生活-Java实习一面
快手-本地生活
受试者:js
1.自我介绍
2.秒杀详细说一下
异步扣减库存的流程
异步创建订单:createOrderAsync{
生成库存流水
**生成库存流水完成**
发送事务消息
rocketMQTemplate.sendMessageInTransaction
**尝试投递扣减库存消息**
}
执行本地事务:createOrder{
预扣库存:在redis
失败直接返回库存不足
生成订单
异步投递增加销量消息
更新库存流水状态
}
**本地事务提交完成**
3.异步扣减库存,用户会收到什么,一定成功吗
下单成功或下单失败
4.异步用户怎么拿到结果
5.论坛es和数据库怎么保持一致,为什么有redis
kafka来进行的
每次修改帖子之后,会加入事件消息
消费消息的时候利用到了es
没有redis
6.dns解析过程
域名解析成IP
输入URL后,先查询浏览器缓存,再查询操作系统缓存,查询hosts文件
本机->本地DNS服务器
根域名服务器 权限域名服务器
7.静态变量作用,项目中是如何使用的
8.String,StringBuffer,StringBuilder的区别
不可变类 底层数组是不可变的
线程安全的 synchronize
线程不安全 高效
9.重载和重写具体是什么
重载:一个类中相同的方法名不同的参数列表:个数 顺序 类型
重写:子类重写父类的方法 返回值是他的子类 抛出异常是超类
10.java多态是什么
继承
子类重写父类的方法
父类引用指向子类对象
运行时多态
11.ArrayList和LinkedList的区别
底层:数组
底层:链表
12.介绍一下hashmap
说了一下参数
没有说put resize
13.为什么要使用多线程,缺点是什么
多线程:实现了高效
同步互斥 一致性 死锁
单个进程中同时运行多个线程
好处:提高CPU利用率,避免等待网络IO或磁盘IO
举例:Tomcat并行处理多个请求
局限:太多的线程导致CPU上下文切换的开销增大
线程安全性问题:操作临界资源,数据不一致;涉及到锁可能会引起死锁。
14.jvm运行时数据区,具体介绍一下
程序计数器
JVM堆
方法区
JVM栈
本地方法栈
15.jvm的垃圾回收算法,说一下过程
复制算法
标记-清除算法
标记-整理算法
16.MySQL事务特性
ACID
原子性 一致性 隔离性 持久性
17.MySQL索引结构,聚簇和非聚簇的区别
B+ 和Hash 聚簇和非聚簇
数据和索引存储在一起
18.平常用什么索引,最左前缀原则是什么
主键 经常查询的索引
举例:账户注册 邮箱注册 需要查询
a b c
19.慢查询优化,怎么排查问题,具体哪些情况
默认是关闭慢查询 开启
配置慢查询时间 配置慢查询文件存储
执行计划
慢查询日志分析工具 mysqldumpslow
可以得到慢查询的语句
查看 SQL 执行成本:SHOW PROFILE
分析查询语句的工具:EXPLAIN
分析优化器执行计划:trace
MySQL监控分析视图-sys schema
https://jsss-1.blog.csdn.net/article/details/126141216
20.relay和binlog是什么,用途是什么
数据库注册复制
数据库恢复
文件+偏移
GTID
21.了解过监听binlog吗
binlog(二进制日志)是MySQL数据库的一种日志文件,用于记录对数据库的修改操作,包括插入、更新和删除等操作。监听binlog可以帮助我们实时获取数据库的变更并进行相应的处理。
在MySQL中,可以通过以下两种方式来监听binlog:
基于MySQL原生的binlog监听功能:MySQL提供了一些工具和API,可以通过订阅binlog来监听数据库的变更。例如,可以使用MySQL自带的mysqlbinlog命令行工具来实时解析并输出binlog中的内容,或者使用MySQL提供的Java API(如MySQL Connector/J)来编写程序来处理binlog。
使用第三方库:除了使用MySQL原生的功能,还可以使用一些第三方库来简化监听binlog的操作。例如,Debezium是一个开源的用于监听MySQL binlog的库,它提供了一套简单而强大的API,可以轻松地将binlog的变更信息传递给应用程序。
通过监听binlog,我们可以实现一些有用的功能,例如:
数据同步:可以将MySQL的变更同步到其他数据库或数据仓库中,实现数据的实时复制和备份。
数据变更审计:可以记录和审计数据库的变更操作,包括谁在何时做了什么修改。
实时数据分析:可以将数据库的变更直接传递给实时数据分析系统,用于实时查询和分析。
需要注意的是,监听binlog对性能有一定的影响,因为它需要实时地读取和解析binlog文件。因此,在应用中需要合理地配置和使用binlog监听功能,以免对数据库性能造成过大的影响。
22.redis数据结构
string list hash set zset
23.zset介绍一下
跳表 score
项目中关注粉丝使用此实现
24.redis过期策略,介绍一下
惰性删除
定期删除
25.aop是什么,具体怎么用的
service层 记日志
26.同一个类中方法调用,aop有用吗
在同一个类中的方法调用中,AOP可能会有一些特殊的应用场景,但通常情况下AOP在这种情况下的用处相对较少。
AOP主要用于解决横切关注点(cross-cutting concerns)的问题,而同一个类中的方法调用通常不涉及不同模块或对象之间的横切关注点。因此,AOP在同一个类中方法调用中的应用较少。
然而,有一些特殊情况下AOP可能仍然有用:
日志记录:如果同一个类中的某个方法需要记录日志,可以使用AOP在方法执行前或执行后插入日志记录的逻辑,避免在每个方法中都手动添加日志记录代码。
性能监控:如果同一个类中的某个方法需要进行性能监控,可以使用AOP在方法执行前后记录方法的执行时间,或者统计方法的调用次数等。
异常处理:如果同一个类中的某个方法需要进行异常处理,可以使用AOP在方法执行过程中捕获异常并进行处理,避免在每个方法中都手动添加异常处理代码。
需要注意的是,同一个类中方法调用的AOP应用相对较少,因为在同一个类中的方法调用通常可以直接在代码中处理,而不需要使用AOP来解决横切关注点。AOP更常用于解决不同模块或对象之间的横切关注点问题。
27.aop原理,具体描述一下
AOP(面向切面编程)是一种编程范式,它通过在程序运行过程中动态地将额外的逻辑(称为切面)插入到原有的代码中,以实现横切关注点的模块化。
AOP的原理主要涉及以下几个关键概念和步骤:
切面(Aspect):切面是一个横跨多个对象的模块,它定义了横切关注点(cross-cutting concerns),如日志记录、性能监控、异常处理等。切面由切点和通知组成。
切点(Pointcut):切点定义了在程序中哪些位置应该插入切面的逻辑,通常使用表达式或注解来描述切点的位置。
通知(Advice):通知是切面在切点位置执行的逻辑,它定义了在切点位置应该执行的代码。通常有以下几种类型的通知:前置通知(Before advice),在切点之前执行;后置通知(After advice),在切点之后执行;异常通知(After throwing advice),在切点抛出异常之后执行;返回通知(After returning advice),在切点返回结果之后执行;环绕通知(Around advice),在切点前后都执行。
织入(Weaving):织入是将切面应用到目标对象上的过程。织入可以在编译时、类加载时或运行时进行。编译时织入需要特殊的编译器支持,类加载时织入需要使用特殊的类加载器,而运行时织入则通过动态代理实现。
当程序运行时,AOP框架会根据切点的定义来确定在哪些位置插入切面的逻辑。当程序执行到切点位置时,AOP框架会根据指定的通知类型执行对应的通知逻辑。这样,切面的逻辑就被动态地织入到原有的代码中,实现了横切关注点的模块化。
总结来说,AOP的原理是通过切面、切点和通知的组合来将额外的逻辑插入到原有的代码中,以实现横切关注点的模块化。织入过程将切面应用到目标对象上,并在切点位置执行切面的逻辑。这样,AOP能够在不修改原有代码的情况下添加额外的功能。
28.动态代理有几种
基于接口的动态代理和基于类的动态代理。
可是对于代理设计模式有两种实现形式:JDK的代理支持(是基于父接口的代理形式)、CgLib代理支持(是基于类的代理形式),对于常规的业务层的项目开发,那么采用JDK的代理设计模式很方便,但是如果要是对一些控制层的类进行代理设计,那么就要使用到CgLib了。
Java代理模式分为静态代理和动态代理两种类型。
静态代理:在编译期间就已经确定了代理类的代码,代理类和被代理类通过实现同一个接口或者继承同一个父类来达到代理的效果。静态代理的优点是结构简单、易于理解和实现,但是缺点是每个被代理类都需要一个代理类,导致类的数量增多,维护起来较为困难。
动态代理:在运行时动态生成代理对象的代理模式。通过Java的反射机制,在运行时动态地生成代理类和代理对象。相比静态代理,动态代理不需要提前定义代理类,使得代理类的编写更加灵活和简便。常用的动态代理技术有Java的Proxy类和CGLIB库。动态代理的优点是可以代理任意类型的对象,缺点是实现较为复杂。
总的来说,静态代理适用于对特定类进行代理的场景,而动态代理适用于需要代理多个类或者接口的场景。
AOP(Aspect-Oriented Programming,面向切面编程)是一种编程范式,用于解决分散在不同模块或对象中的横切关注点(cross-cutting concerns)问题。AOP可以通过动态代理来实现。
AOP动态代理指的是在运行时动态生成代理对象,通过拦截方法的调用,将额外的逻辑(横切关注点)插入到方法的前后或者周围。这些额外的逻辑可以是日志记录、事务管理、安全检查、性能监控等。
Java中的动态代理有两种实现方式,一种是使用Java自带的Proxy类,另一种是使用第三方库CGLIB。
Java的Proxy类:Java提供了一个Proxy类,可以在运行时动态地创建代理对象。代理对象实现了指定接口,并且通过调用InvocationHandler接口的方法来拦截被代理对象的方法调用。在InvocationHandler中可以处理额外的逻辑,如在方法前后添加日志记录。使用Proxy类创建动态代理需要了解被代理接口。
CGLIB:CGLIB是一个强大的第三方库,可以在运行时动态生成代理对象,而不需要被代理类实现接口。CGLIB通过继承被代理类,生成子类作为代理类,并通过重写方法的方式实现方法的拦截。CGLIB的动态代理更加灵活,可以代理没有实现接口的类。
AOP动态代理在实际应用中广泛使用,可以帮助开发者解耦业务逻辑和横切关注点,提高代码的重用性和可维护性。
29.jdk的动态代理
JDK的动态代理是Java语言提供的一种实现AOP的方式。它通过在运行时动态生成代理类来实现对目标对象的代理操作。
JDK的动态代理主要涉及以下两个关键类和一个接口:
InvocationHandler接口:该接口定义了一个invoke方法,用于在代理对象的方法被调用时进行拦截和处理。在invoke方法中,可以通过反射机制调用目标对象的方法,并在方法调用前后加入额外的逻辑。
Proxy类:该类提供了用于创建代理对象的静态方法。它接收一个InvocationHandler对象和一个目标对象作为参数,然后通过反射机制动态生成一个代理类的字节码,并创建一个代理对象。
使用JDK的动态代理,需要按照以下步骤进行:
创建一个实现InvocationHandler接口的类,并实现其invoke方法。在invoke方法中,编写代理对象的逻辑处理代码。
创建目标对象(被代理对象)。
使用Proxy类的静态方法newProxyInstance来创建代理对象。该方法接收三个参数:ClassLoader对象用于加载代理类的字节码,Class[]对象数组用于指定代理类实现的接口,InvocationHandler对象用于处理代理对象方法的调用。
使用代理对象调用方法,实际上会触发InvocationHandler的invoke方法,在该方法中执行拦截和处理逻辑。
JDK的动态代理的限制是,只能代理实现了接口的类。如果目标对象没有实现接口,可以考虑使用其他方式,如CGLIB(Code Generation Library)来实现动态代理。
30.cglib动态代理
CGLIB(Code Generation Library)是一个基于ASM(Java字节码操作和分析框架)的动态代理库,它可以在运行时动态生成代理类,实现对目标对象的代理操作。与JDK的动态代理不同,CGLIB可以代理没有实现接口的类。
CGLIB的动态代理主要涉及以下两个关键类:
Enhancer类:该类是CGLIB的核心类,用于创建代理对象。通过调用Enhancer的create方法,传入目标对象的Class对象、Callback接口(可以是MethodInterceptor或NoOp)和一些其他参数,即可生成代理对象。
MethodInterceptor接口:该接口定义了一个intercept方法,用于在代理对象的方法被调用时进行拦截和处理。在intercept方法中,可以通过MethodProxy对象调用目标对象的方法,并在方法调用前后加入额外的逻辑。
使用CGLIB的动态代理,需要按照以下步骤进行:
创建一个实现MethodInterceptor接口的类,并实现其intercept方法。在intercept方法中,编写代理对象的逻辑处理代码。
创建Enhancer对象,并设置其父类为目标对象的Class对象,设置回调对象为实现了MethodInterceptor接口的类。
调用Enhancer的create方法来创建代理对象。
使用代理对象调用方法,实际上会触发MethodInterceptor的intercept方法,在该方法中执行拦截和处理逻辑。
CGLIB的动态代理相比于JDK的动态代理,可以代理没有实现接口的类,但代理过程中会消耗更多的时间和内存。因此,在选择使用动态代理时,可以根据具体情况选择合适的方式。
31.git为什么冲突,怎么解决
合并分支:当你尝试将一个分支合并到另一个分支时,如果两个分支对同一个文件进行了不同的修改,Git 就会报告冲突。
Pull 操作:在从远程仓库拉取代码(pull)时,如果你本地的修改与远程分支的修改产生冲突,Git 会报告冲突。
Rebase 操作:在执行 git rebase 操作时,如果存在冲突,Git 会暂停 rebase 进程,让你解决冲突后继续。
Git冲突是指在合并或合并拉取过程中,存在不同分支上对同一文件的修改,导致无法自动合并的情况。冲突通常发生在以下情况下:
合并分支时:当多个分支上对同一文件的同一部分进行了修改,Git无法自动合并这些修改。
拉取远程分支时:当本地分支和远程分支都对同一文件的同一部分进行了修改,并且远程分支上的修改与本地分支上的修改不兼容时,Git无法自动合并。
解决Git冲突的一般步骤如下:
使用git status命令查看冲突文件列表。冲突的文件会以未合并(unmerged)状态显示。
打开冲突文件,可以看到类似于以下内容的标记:
<<<<<<< HEAD
// 当前分支的修改
=======
// 合并分支的修改
>>>>>>> branch_name
其中<<<<<<< HEAD到=======之间是当前分支的修改,而=======到>>>>>>> branch_name之间是合并分支的修改。
手动解决冲突,根据需要保留或修改其中的内容。可以选择保留当前分支的修改,也可以选择保留合并分支的修改,也可以进行二者的组合。
保存文件,并执行git add命令将解决冲突的文件标记为已解决。
继续执行合并操作(如git merge或git pull),Git会将解决冲突的文件添加到合并提交中。
使用git commit命令提交合并结果,完成冲突解决。
在解决冲突时,也可以使用一些工具和编辑器来辅助处理,例如使用Git自带的合并工具或使用图形化的Git客户端。另外,及时进行代码审查和合并冲突的解决可以帮助尽早发现和解决冲突,减少冲突带来的问题。
32.LRU
使用LinkedHashMap
33.反问
最后
2023-7-28 12:00:00
我们都有光明的未来
祝大家考研上岸
祝大家工作顺利
祝大家得偿所愿
祝大家如愿以偿
点赞收藏关注哦