面试题分享(一)

发布于:2024-11-28 ⋅ 阅读:(16) ⋅ 点赞:(0)

实习的项目

成员规模

用到过哪些设计模式?

策略、单例、工厂、代理

责任链模式了解吗?

责任链模式(Chain of Responsibility Pattern)是一种行为型设计模式,目的是为了避免请求的发送者与接收者之间的耦合关系。通过将多个处理对象连接成一条链,当请求发送时,沿着链传递,直到某个处理对象处理该请求为止。

项目部署的一些命令

jar 命令打包

然后上传服务器

Docker部署:

build构建镜像、run启动容器

linux的一些命令

  • ls:列出目录内容。
  • cd:切换目录。
  • pwd:显示当前目录。
  • <font style="color:#DF2A3F;">cat</font>:查看文件内容。
  • <font style="color:#DF2A3F;">grep</font>:文本搜索工具。
  • <font style="color:#DF2A3F;">ps</font>:查看进程信息。
  • <font style="color:#DF2A3F;">top</font>:查看系统实时资源使用情况。
  • <font style="color:#DF2A3F;">kill</font>:杀死进程。
  • df:查看磁盘空间。
  • chmod:修改文件权限。
  • tar:打包和解压缩文件。

怎么查看日志

查看日志的常用命令有:

  • <font style="color:#DF2A3F;">tail -f log.txt</font>:实时查看日志文件的更新。
  • <font style="color:#DF2A3F;">less log.txt</font>:分页查看日志文件。
  • <font style="color:#DF2A3F;">grep</font>:从日志中搜索特定的内容。
grep "error" log.txt

自动拆箱和装箱的过程

自动装箱是指 Java 自动将基本类型(如 <font style="color:#DF2A3F;">int</font><font style="color:#DF2A3F;">double</font>)转换成对应的包装类(如 IntegerDouble)。
自动拆箱是指 Java 自动将包装类(如 <font style="color:#DF2A3F;">Integer</font>)转换回基本类型(如 int)。

equals和==的区别?

二、比较的对象不同

1.equals

equals默认比较地址值

如果类中重写了equals方法,比较内容是否相等。

String、Date、File、包装类都重写了Object类的equals方法。

如果类中没有重写equals方法,比较地址值是否相等(是否指向同一个地址值)。

2.==

比较运算符,返回的就是一个布尔值true,false

如果比较的是基本数据类型变量,比较两个变量的值是否相等。(不一定数据类型相同)

如果比较的是引用数据类型变量,比较两个对象的地址值是否相同,即两个引用是否指向同一个地址值。

三、运行速度不同

1、equals():没有==运行速度快。

2、:运行速度比equals()快,因为只是比较引用。

四种引用

强引用、软引用、弱引用、虚引用

常见的创建对象的方式

  • 使用 <font style="color:#DF2A3F;">new</font> 关键字:
MyClass obj = new MyClass();
  • 通过反射获取Class对象,然后通过newInstance()创建对象实例:
Class<?> clazz = Class.forName("MyClass");
MyClass obj = (MyClass) clazz.getConstructor().newInstance();
  • 使用工厂方法:通过工厂类来创建对象,隐藏对象创建的复杂性。

深拷贝和浅拷贝的区别

  • 浅拷贝:复制对象时,如果对象中有引用类型的成员,拷贝的是引用地址,而不是实际的对象。因此,原对象和拷贝对象中的引用类型成员指向同一个对象。
  • 深拷贝:复制对象时,是把对象的全部内容都复制一份,确保原对象和拷贝对象互不影响。
  • 引用拷贝:是指创建一个新的引用指向原来的对象。

OOM和SOF了解吗

  • OOM(OutOfMemoryError):当 JVM 无法为对象分配足够的内存时,会抛出 <font style="color:#DF2A3F;">OutOfMemoryError</font> 错误。通常由内存泄漏或内存分配过多导致。
  • SOF(StackOverflowError):当栈内存溢出时,会抛出 <font style="color:#DF2A3F;">StackOverflowError</font>。通常发生在递归调用过深时。

程序、进程和线程的区别和关系?

  • 程序:指令的集合,是静态的,未执行时不占用系统资源。
  • 进程:程序执行时的实例,是操作系统分配资源的基本单位。
  • 线程:进程中的执行单元,是 CPU 执行任务的基本单位,多个线程可以在同一进程中并发执行。

JVM的内存模型?

堆、方法区

虚拟机栈、程序计数器、本地方法栈

什么情况下会触发Full GC?

1. Old Generation(老年代)空间不足

当对象从 Young Generation 晋升到 Old Generation 时,如果 Old Generation 没有足够的空间来容纳这些对象,JVM 会触发 Full GC 以尝试回收 Old Generation 中的空间。

2. Permanent Generation 或 Metaspace 空间不足

对于使用永久代(Permanent Generation)或元空间(Metaspace)的 JVM,当这些区域的空间不足时,也会触发 Full GC。例如,类加载器加载了大量的类或字符串常量池耗尽时。

3. System.gc() 调用

显式调用 System.gc() 方法会请求 JVM 进行 Full GC。不过,JVM 可能会忽略这个请求,具体取决于 JVM 的实现和配置。

有哪些线程池,分别用于什么场景?

  • FixedThreadPool:适用于执行固定大小的任务队列。
  • CachedThreadPool:可根据实际情况调整线程数量的线程池。
  • SingleThreadExecutor:单例线程池,只有一个线程按顺序执行任务。
  • ScheduledThreadPool:适用于去执行定时任务或者延迟任务的线程池。

IOC和AOP的理解?

  • IOC(Inversion of Control):控制反转,将对象的创建和管理交给容器(如 Spring),并通过依赖注入(DI)来管理对象之间的关系。
  • AOP(Aspect-Oriented Programming):面向切面编程,允许在不修改业务代码的情况下添加横切关注点(如日志、事务管理等)。

他们用到了哪些设计模式?

  • IOC:依赖注入(DI)是实现 IOC 的一种方式,使用了工厂模式、单例模式等。
  • AOP:使用了代理模式和装饰器模式。

缓存穿透、雪崩怎么解决的?

Redis的单线程模型?

Redis的网络模型就是使用I/O多路复用结合事件的处理器来应对多个Socket请求,比如,提供了连接应答处理器、命令回复处理器,命令请求处理器

在Redis6.0之后,为了提升更好的性能,在命令回复处理器使用了多线程来处理回复事件,在命令请求处理器中,将命令的转换使用了多线程,增加命令转换速度,在命令执行的时候,依然是单线程串行执行的。

I/O多路复用是指利用单个线程来同时监听多个Socket ,并在某个Socket可读、可写时得到通知,从而避免无效的等待,充分利用CPU资源。

IO多路复用的三种模式:select、poll、epoll

目前的I/O多路复用都是采用的epoll模式实现,它会在通知用户进程Socket就绪的同时,把已就绪的Socket写入用户空间,不需要挨个遍历Socket来判断是否就绪,提升了性能。

Redis的原子性

Redis的每个命令都是以单线程的方式执行的,整个命令的执行过程是不可中断的。这意味着每个命令要么完全执行成功,要么完全失败,不会出现部分执行的情况‌。

RPC的原理?

RPC(Remote Procedure Call) 是一种通信协议,允许程序调用远程计算机上的函数,就像调用本地函数一样。RPC 的工作原理一般包括以下几个步骤:

  1. 客户端调用本地代理函数:客户端调用一个本地的代理函数(stub),这个函数的作用是将函数的调用请求发送到远程服务器。
  2. 代理函数(Stub):代理函数是客户端的一部分,它负责将调用的信息(如函数名、参数等)打包,通常会将其序列化为字节流。
  3. 网络传输:将打包后的调用信息通过网络发送到服务器端。
  4. 服务器接收请求:服务器端接收到请求后,进行反序列化处理,将参数恢复成函数所需的类型,并调用实际的远程函数。
  5. 执行函数:远程服务器上的实际函数执行并产生结果。
  6. 返回结果:远程函数执行完毕后,将结果发送回客户端,并由代理函数将结果反序列化并返回给客户端。
  7. 客户端收到结果:客户端代理函数返回执行结果。

RPC 通过封装底层网络通信细节,使得分布式系统中不同服务之间的通信变得透明。常见的 RPC 实现包括:

  • gRPC:Google 提供的高效的 RPC 框架,基于 HTTP/2 和 Protocol Buffers。
  • Dubbo:阿里巴巴开源的 RPC 框架。
  • Thrift:Apache 提供的跨语言 RPC 框架。

有过项目部署的经验吗?

部署的脚本有写过吗?

docker脚本