JAVA八股文面经问题整理第6弹

文章目录

目录

文章目录

提问问题

问题1

问题2

问题3

问题4

问题5

问题6

问题7

问题8

问题9

问题10

问题11

问题12

写在最后


提问问题

  1. 介绍一下Linux常⽤命令,例如:Vim快捷键,常⽤查看Log的命令,路径相关,权限相关问题
  2. 介绍下策略模式、其他的常用的设计模式了解那些
  3. 为什么选Redis缓存?为什么不直接⽤MyBatis⾃带的缓存?
  4.  Redis有什么优缺点?
  5. 简单介绍一下分布式锁?为什么出现分布式锁?实现分布式锁需要注意的事项?
  6. Object有哪些方法?
  7. 项目中,代码的分支太多了,如何解决?
  8. 项目中不同接口不同,这个是怎么做的?
  9. MySQL什么情况下不走索引,给出具体的示例场景?
  10. 关于钱的问题,在数据库中的存储,以及实际编码阶段上对钱的操作?
  11. 给⼀个⼤⽂件,电脑内存有限,如何给这个⼤⽂件中的整数排序?
  12.  笔试题:求滑动窗口中的最大值给一个整数数组 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)。策略接口声明了算法的骨架,具体策略类实现了具体的算法,上下文环境则持有一个策略类的引用,并通过该引用来调用相应的算法。

除了策略模式,常用的设计模式还包括:

  1. 单例模式(Singleton):确保一个类只有一个实例,并提供全局访问点。
  2. 工厂模式(Factory):定义一个用于创建对象的接口,让子类决定实例化哪一个类。工厂模式让类的实例化延迟到子类进行。
  3. 抽象工厂模式(Abstract Factory):创建一系列相关或依赖对象的接口,而无需指定它们具体的类。
  4. 建造者模式(Builder):封装一个产品的构建过程,并允许按步骤构造。
  5. 原型模式(Prototype):通过复制现有的实例来创建新的实例。
  6. 适配器模式(Adapter):允许不兼容的接口之间工作。
  7. 桥接模式(Bridge):将抽象与实现分离,使两者可以独立变化。
  8. 组合模式(Composite):将对象组合成树形结构以表示“部分-整体”的层次结构。
  9. 装饰器模式(Decorator):动态地给一个对象添加一些额外的职责。
  10. 外观模式(Facade):提供一个统一的接口来访问子系统中的一群接口。
  11. 享元模式(Flyweight):通过共享技术支持大量细粒度对象的有效共享。
  12. 代理模式(Proxy):为其他对象提供一个代理以控制对这个对象的访问。
  13. 观察者模式(Observer):定义对象间的一种一对多的依赖关系,当一个对象改变状态时,所有依赖于它的对象都会得到通知并自动更新。
  14. 迭代器模式(Iterator):提供一种方法顺序访问一个聚合对象中各个元素,而又不暴露该对象的内部表示。
  15. 命令模式(Command):将一个请求封装为一个对象,从而使你可用不同的请求、队列或日志请求来参数化其他对象。
  16. 状态模式(State):允许一个对象在其内部状态改变时改变它的行为,对象看起来好像修改了它的类。
  17. 责任链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系。
  18. 备忘录模式(Memento):在不破坏封装的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态。
  19. 中介者模式(Mediator):用一个中介对象来封装一系列的对象交互。
  20. 解释器模式(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!

  • 16
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值