JAVA八股文面经问题整理第6弹
文章目录
目录
文章目录
提问问题
问题1
问题2
问题3
问题4
问题5
问题6
问题7
问题8
问题9
问题10
问题11
问题12
写在最后
提问问题
介绍一下
Linux常⽤命令,例如:Vim快捷键,常⽤查看Log的命令,路径相关,权限相关问题介绍下策略模式、其他的常用的设计模式了解那些
- 为什么选Redis缓存?为什么不直接⽤MyBatis⾃带的缓存?
- Redis有什么优缺点?
- 简单介绍一下分布式锁?为什么出现分布式锁?实现分布式锁需要注意的事项?
- Object有哪些方法?
- 项目中,代码的分支太多了,如何解决?
- 项目中不同接口不同,这个是怎么做的?
- MySQL什么情况下不走索引,给出具体的示例场景?
- 关于钱的问题,在数据库中的存储,以及实际编码阶段上对钱的操作?
给⼀个⼤⽂件,电脑内存有限,如何给这个⼤⽂件中的整数排序?
-
笔试题:求滑动窗口中的最大值:给一个整数数组
nums
,有一个大小为k
的滑动窗口从数组的最左侧移动到数组的最右侧。每次移动一位。
问题1
Linux常用命令:
- Vim快捷键:
i
进入插入模式,Esc
退出插入模式,:wq
保存并退出,:q!
强制退出不保存。 - 查看日志:
tail -f /var/log/syslog
实时查看日志,grep
用于搜索特定内容,如grep error /var/log/syslog
。 - 路径相关:
cd
切换目录,ls
列出目录内容,pwd
显示当前工作目录的完整路径,mkdir
创建新目录,rm
删除文件或目录。 - 权限相关:
chmod
修改文件或目录的权限,chown
更改文件或目录的所有者,ls -l
查看详细的文件权限信息。
问题2
策略模式是一种行为设计模式,它定义了一系列算法,将每个算法封装起来,并使它们可以互换。这种模式让算法的变化独立于使用算法的客户端。
策略模式通常由三个部分组成:策略接口(Strategy),具体策略类(Concrete Strategy),以及上下文环境(Context)。策略接口声明了算法的骨架,具体策略类实现了具体的算法,上下文环境则持有一个策略类的引用,并通过该引用来调用相应的算法。
除了策略模式,常用的设计模式还包括:
- 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
- 工厂模式(Factory):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式让类的实例化延迟到子类进行。
- 抽象工厂模式(Abstract Factory):创建一系列相关或依赖对象的接口,而无需指定它们具体的类。
- 建造者模式(Builder):封装一个产品的构建过程,并允许按步骤构造。
- 原型模式(Prototype):通过复制现有的实例来创建新的实例。
- 适配器模式(Adapter):允许不兼容的接口之间工作。
- 桥接模式(Bridge):将抽象与实现分离,使两者可以独立变化。
- 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。
- 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。
- 外观模式(Facade):提供一个统一的接口来访问子系统中的一群接口。
- 享元模式(Flyweight):通过共享技术支持大量细粒度对象的有效共享。
- 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。
- 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
- 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
- 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求、队列或日志请求来参数化其他对象。
- 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。
- 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
- 备忘录模式(Memento):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
- 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。
- 解释器模式(Interpreter):给定一个语言,定义它的文法的一套解释规则。
问题3
Redis缓存通常比MyBatis自带的缓存更快,因为它是基于内存操作的。此外,Redis支持更丰富的数据结构和操作,可以实现更复杂的缓存策略。
问题4
Redis优点:
- 速度快,基于内存操作。
- 支持丰富的数据类型。
- 可以持久化数据到磁盘。
- 具备原子操作和事务支持。
Redis缺点:
- 内存资源有限。
- 数据持久化可能导致写入延迟。
- 高可用性配置较为复杂。
问题5
分布式锁是为了解决分布式系统中多个进程或服务需要协调访问共享资源时的同步问题。
出现分布式锁的原因是单个进程锁不能跨多个节点或服务器工作。
实现分布式锁需要注意的事项:
- 确保锁的互斥性,即同一时间只有一个客户端能持有锁。
- 考虑锁的超时和重试机制,以防客户端崩溃后锁永久持有。
- 确保锁的高可用性和一致性。
问题6
Java中
Object
类提供了一些基本方法,如equals()
,hashCode()
,toString()
,clone()
,getClass()
,notify()
,notifyAll()
,wait()
等。
问题7
项目中代码分支太多时,可以通过代码重构、合并相似功能的分支、删除不再维护的分支、使用特性开关来减少分支数量。
问题8
项目中接口差异通常通过适配器模式、策略模式或者使用多态来处理,以保证代码的通用性和可维护性。
举例厂商的参数变了,如何满足
1.把所有的参数封装成一个对象,然后在对象里面获取,最后再根据配置中心的内容,执行不同的逻辑
2.重载
3.所有的api抽象成一个配置,然后修改某个字段,再结合配置中心来实现
问题9
MySQL不走索引的情况:
- 数据表非常小,全表扫描比索引查找更快。
- 索引列数据类型不一致或者存在大量NULL值。
- WHERE子句中包含范围查询,如
BETWEEN
,>
,<
操作符。- 数据库优化器判断使用索引不会提高查询性能。
问题10
在数据库中通常使用固定小数点的数字格式存储钱(如使用DECIMAL类型),以避免浮点数运算的精度问题。
在编码阶段,应该使用货币库(如Java中的BigDecimal)来处理钱的加减乘除等操作。
问题11
如果计算机内存有限,可以使用外部排序算法对大文件进行排序。
首先,将文件分割成多个可以在内存中处理的小块,对每块进行排序,然后将排序好的块合并起来得到最终的排序结果。这通常涉及到使用流或者临时文件来处理排序过程。
问题12
力扣上有原题;滑动窗口最大值
思路是设计单调队列;其他详细思路看 思路详解
class MyQueue {
Deque<Integer> deque = new LinkedList<>();
//弹出元素时,比较当前要弹出的数值是否等于队列出口的数值,如果相等则弹出;
void poll(int val) {
if (!deque.isEmpty() && val == deque.peek()) { //也要判断队列当前是否为空
deque.poll();
}
}
//添加元素时,如果要添加的元素大于入口处的元素,就将入口元素弹出,这样保证队列元素单调递减
//比如此时队列元素4,3,1 ;5将要入队,比4,3,1都大,所以都弹出,此时队列:5
void add(int val) {
while (!deque.isEmpty() && val > deque.getLast()) {
//push元素的数值小于等于队列入口元素的数值为止
deque.removeLast();
}
deque.add(val);
}
//队列队顶元素始终为最大值
int peek() {
return deque.peek();
}
}
class Solution {
public int[] maxSlidingWindow(int[] nums, int k) {
if (nums.length == 1) {
return nums;
}
int len = nums.length - k + 1;
int[] res = new int[len];//存放结果元素的数组
int num = 0;
MyQueue myQueue = new MyQueue();//自定义队列
//先将前k的元素放入队列
for (int i = 0; i < k; i++) {
myQueue.add(nums[i]);
}
res[num++] = myQueue.peek();
for (int i = k; i < nums.length; i++) {
myQueue.poll(nums[i - k]); //滑动窗口移除最前面的元素,移除是判断该元素是否放入队列
myQueue.add(nums[i]);//滑动窗口加入最后面的元素
res[num++] = myQueue.peek();//记录对应的最大值
}
return res;
}
}
写在最后
PS:以上是网络上收集的一些常见的问题以及自己对答案搜索整理;一次整理基本上就是面试一次的题量,适合对自己的知识的查缺补漏
面试一般根据岗位要求或者简历上写的来进行扩展提问,也有些是直接问公司常用到的相关方面的技术问题,无论怎么准备都祝大家能拿到心怡的offer!