女Java年底被裁努力面试第三天

过了一个年啥都忘了,约的第二天面试,临时被调到了当天一小时后面,哈哈慌得一批被虐了

上海 Java开发工程师 15-18k

驻场极氪外包,试用期不打折

岗位职责:

  1. 强制:熟悉 Java 核心 AP|,熟悉 JVM 内存模型,深度理解面向对象、面向服务编程,熟
    练在日常开发中应用设计模式;
  2. 强制:熟练掌握 Springboot、Spring Cloud、Mybatis,框架,并可以灵活运用解决实际业务问题;加分项:深入理解框架底层实现;←
  3. 强制:熟练使用常用的分布式中间件技术,如负载均衡、RPC 框架、缓存、消息系统等加分项:熟悉底层实现原理,有阅读源码解决实际问题经验;
  4. 强制:了解云原生领域,熟悉 kubernetes,总体架构,以及相应的日志 监控 报警解决方案,了解常用的日志监控报警解决方案,如elk,skywalking,Prometheus 等;
  5. 强制:掌握 Linux/Unix 操作系统指令,能熟练使用命令行排查系统问题;
  6. 强制:有很强的 debug 能力,认真负责,有良好的沟通和团队协作能力;←
  7. 加分:有 Python/Shell 脚本编程经验者优先;
  8. 加分:对数据清洗、处理、数仓建设有经验者优先,有Flink、Hive、Spark、Kafka .Hbase 等大数据技术经验者优先

视频面试 20分钟

  1. 自我介绍
  2. 要不你直接介绍下项目经验,说一下主要设计的功能

主要负责商品、菜单、门店、库存这些模块

  1. 换句话说,除了这些CRUD以外,有做过什么功能么

额 有点蒙 哈哈

  1. 我看你这些应该都是偏商城相关的项目,除了这些增删改查的其他有设计过哪些功能

  2. 那么来问点基础的吧,说说你对集合一般常用的有哪些

image.png

  1. 什么时候用ArrayList 什么时候用LinkedList

需要频繁进行随机访问操作时,应该选择 ArrayList
需要频繁进行插入和删除操作时,应该选择 LinkedList

7.实际场景当中能举例子么

菜单商品列表可以用ArrayList
购物车这种修改比较多可以用LinkedList

8.ArrayList、LinkedList区别

ArrayList 是基于动态数组实现的,它通过数组来存储元素,并支持随机访问。当元素数量超过数组容量时,ArrayList 会自动调整容量以适应新增元素。
LinkedList 是基于双向链表实现的,它通过节点之间的连接来存储元素,支持快速的插入和删除操作。在 LinkedList 中,每个节点除了存储元素值外,还存储了指向前后节点的引用。

9.ArrayList数组初始化有固定长度的,ArrayList基本上也没有长度限制,那是如何实现的

在 Java 中,ArrayList 的内部实现是基于数组的动态扩容机制来实现长度的动态变化。虽然 ArrayList 在初始化时需要指定初始容量,但它并不限制实际存储元素的数量,可以动态地根据需要进行扩容。
当我们向 ArrayList 中添加元素时,如果当前元素个数已经达到了内部数组的容量上限,ArrayList 会执行扩容操作。具体扩容的过程如下:

  1. 当要添加的元素个数超过当前内部数组的容量时,ArrayList 会创建一个新的更大容量的数组。
  2. 然后将原来数组中的元素复制到新数组中。
  3. 最后,原来的数组会被丢弃,新数组取代原来的数组成为 ArrayList 内部的存储结构。

这样,通过动态扩容的方式,ArrayList 可以灵活地存储任意数量的元素,并且在添加元素时最坏情况下的时间复杂度仍然是 O(n)。ArrayList 内部的扩容机制允许我们在开发过程中不需要考虑数组大小的限制,从而更加方便地管理和操作数据。

10.ArrayList、LinkedList线程上是安全的么

线程不安全

11.如果想做一个线程安全的怎么做到

使用 Collections 工具类的 synchronizedList 方法: 可以通过 Collections.synchronizedList(List<T> list) 方法来创建一个线程安全的 List 集合,该方法返回的集合会对所有对集合的修改操作进行同步处理,从而保证线程安全。
使用并发集合类: Java 提供了一些并发集合类,如 CopyOnWriteArrayList、ConcurrentLinkedQueue 等,它们是专门设计用来在多线程环境下进行高效并发操作的集合类。
使用线程安全的锁机制: 可以使用 synchronized 关键字或者 Lock 接口提供的锁机制来保证对 ArrayList 和 LinkedList 的访问操作是原子的,从而保证线程安全。

12.Map说一下对这个的了解,一般用到的都有哪些

并发性有序性底层数据结构初始容量负载因子实例化方式一致性k/v是否可为null
HashMap不支持无序数组+链表/红黑树160.75懒加载-k/v可为null
LinkedHashMap不支持有序(插入序或者访问序)数组+单向链表+双向链表----k/v可为null
TreeMap不支持自然序(左小右大)红黑树----仅v能为null
ThreadLocalMap不支持无序数组160.75懒加载-仅v能为null
HashTable支持无序数组加链表110.75初始化创建强一致性均不能为null
ConcurrentHashMap(1.7)支持无序分段锁+数组+链表160.75懒加载强一致性均不能为null
ConcurrentHashMap(1.8)支持无序数组+链表/红黑树+特殊结构160.75懒加载弱一致性均不能为null
ConcurrentSkipListMap支持自然序(左小右大)跳跃表---弱一致性均不能为null

13.concurrentHashMap如何实现线程安全

分段锁机制: ConcurrentHashMap 内部采用了分段锁(Segment)的机制,将整个哈希表分成多个小的段(Segment),每个段都可以看作是一个独立的 HashMap。不同的线程可以同时访问不同的段,从而减小了并发冲突的范围,提高了并发度。
读操作的无锁并发访问: ConcurrentHashMap 允许多个线程同时进行读操作,这些读操作是无锁的并发访问,因为每个段内的操作都是线程安全的。
使用 CAS 操作: 在写操作(插入、删除等)时,ConcurrentHashMap 使用了 CAS(Compare and Swap)操作来保证线程安全。CAS 是一种乐观锁的方式,它允许线程在不加锁的情况下尝试更新内存中的变量,并通过比较预期值和当前值是否相等来确定是否更新成功。
扩容策略: ConcurrentHashMap 在扩容时采用了一种不会阻塞读操作的扩容策略,通过将旧的数据迁移到新的段中,从而避免了扩容过程中对读操作的影响。

14.了解AQS么

AQS(AbstractQueuedSynchronizer)是 Java 中用于实现同步器的抽象框架。它提供了一种基于 FIFO 等待队列的机制,可以帮助开发者实现各种复杂的同步器,如 ReentrantLock、Semaphore、CountDownLatch 等。AQS 主要包含以下两个核心部分:

  1. 状态管理: AQS 通过一个 int 类型的状态来管理同步状态,开发者可以使用 getState()、setState(int newState) 等方法来操作这个状态。不同的同步器可以根据具体需求自定义状态的含义和变化规则。
  2. 等待队列: AQS 使用一个 FIFO 的等待队列来管理等待获取同步状态的线程。当一个线程尝试获取同步状态但失败时,会被加入到等待队列中,进入阻塞状态;当同步状态可用时,AQS 会从等待队列中唤醒部分或所有线程,让它们重新竞争获取同步状态。
    通过继承 AQS 并重写其中的几个关键方法,开发者可以相对容易地实现自定义的同步器。其中最重要的方法包括:
  • tryAcquire(int arg) :尝试获取同步状态,成功返回 true,失败返回 false。
  • tryRelease(int arg) :尝试释放同步状态。
  • tryAcquireShared(int arg) :尝试获取共享同步状态。
  • tryReleaseShared(int arg) :尝试释放共享同步状态。

15.聊一下springcloud五大神兽指的哪五个

Eureka: Eureka 是 Spring Cloud 中的服务注册与发现组件,实现了微服务架构中的服务注册与发现功能。通过 Eureka,各个微服务可以注册自己的信息,并通过 Eureka 服务器来发现其他微服务,实现了服务之间的通信和协作。
Zuul: Zuul 是 Spring Cloud 中的网关组件,提供了统一的访问入口和路由转发功能。通过 Zuul,可以实现请求的过滤、路由、负载均衡等功能,为微服务架构提供了统一的访问控制和管理。
Ribbon: Ribbon 是 Spring Cloud 中的客户端负载均衡组件,用于在客户端实现负载均衡。通过 Ribbon,可以实现对请求的负载均衡策略的选择,从而提高系统的性能和可靠性。
Hystrix: Hystrix 是 Spring Cloud 中的容错管理组件,用于处理分布式系统中的故障和延迟问题。通过 Hystrix,可以实现服务的降级、断路器、线程隔离等功能,保证系统的稳定性和可靠性。
Feign: Feign 是 Spring Cloud 中的声明式服务调用组件,简化了服务之间的调用和依赖关系。通过 Feign,可以通过定义接口的方式来调用其他服务,避免了繁琐的 HTTP 请求和参数传递,提高了开发效率。

16.服务注册中心做了哪些事情

服务注册: 微服务启动时,会向注册中心注册自己的服务信息,包括服务名、IP 地址、端口号等。注册中心会将这些信息存储起来,以便其他服务可以发现和调用该服务。
服务发现: 其他微服务需要调用某个服务时,会向注册中心查询该服务的信息。注册中心会返回符合条件的服务实例列表,供调用方选择合适的实例进行调用。
服务健康检查: 注册中心会定期检查已注册的服务实例的健康状态,例如检查服务是否正常运行、是否能够及时响应请求等。如果某个服务实例出现故障或不可用,注册中心会将其标记为不可用,避免请求发送到异常的服务上。
负载均衡: 注册中心可以提供负载均衡的功能,根据一定的策略将请求分发给多个服务实例,以实现负载均衡和提高系统的性能和可用性。
服务元数据管理: 注册中心通常还会管理服务的元数据信息,如版本号、环境信息、运行状态等,帮助开发者更好地管理和监控微服务系统。

17.网关功能

路由转发: 网关作为整个系统的入口,负责接收外部请求并将其转发到对应的微服务实例。通过配置路由规则,网关可以将不同的请求路由到不同的微服务上,实现统一的访问入口。
请求过滤: 网关可以对进入系统的请求进行过滤和处理,包括身份验证、请求日志记录、请求参数校验等。通过请求过滤,可以增强系统的安全性和稳定性。
负载均衡: 网关可以集成负载均衡功能,将请求均衡地分发给多个微服务实例,提高系统的性能和可用性。通过负载均衡,可以避免单一服务实例的性能瓶颈问题。
熔断与降级: 网关可以实现熔断和降级功能,当后端服务出现故障或响应缓慢时,网关可以进行限流、熔断或降级处理,保证系统的稳定性和可靠性。
安全认证: 网关可以集成认证和授权功能,对请求进行身份验证和权限校验,确保只有合法的用户可以访问系统资源。通过安全认证,可以保护系统免受恶意攻击

18.当前端一个请求过来,正常上线部署的项目会是怎么一个流程,一个请求的生命周期
比如CLB证书认证啊、走到网关啊、到数据库什么的

19.jvm内存结构有了解么

程序计数器(Program Counter Register) : 程序计数器是一块较小的内存空间,可以看作是当前线程所执行的字节码的行号指示器。每个线程都有独立的程序计数器,确保线程切换后能够恢复到正确的执行位置。
Java 虚拟机栈(JVM Stack) : Java 虚拟机栈用于存储方法执行时的局部变量、操作数栈、动态链接、方法出口等信息。每个方法在执行时会创建一个栈帧(Stack Frame),栈帧包含了方法的参数、局部变量和操作数栈等信息。
本地方法栈(Native Method Stack) : 本地方法栈类似于 Java 虚拟机栈,只不过它为 native 方法(使用 JNI 调用的方法)服务。
堆内存(Heap) : Java 堆是 Java 虚拟机管理的最大一块内存区域,用于存储对象实例。堆内存可以被所有线程共享,是 GC(Garbage Collection) 进行垃圾回收的主要区域。
方法区(Method Area) : 方法区用于存储类的结构信息、常量、静态变量、即时编译器编译后的代码等数据。在 Java 8 及之前的版本,方法区是 HotSpot 虚拟机实现的永久代(Permanent Generation)。从 Java 8 开始,方法区被元空间(Metaspace)取代。
运行时常量池(Runtime Constant Pool) : 运行时常量池是方法区的一部分,用于存放编译期生成的各种字面量和符号引用。
直接内存(Direct Memory) : 直接内存并不是 JVM 内部的一部分,但是被频繁地用于 NIO 等操作中。直接内存通过本地方法库来分配内存,而不是通过 JVM 进行分配,因此不受 JVM 堆大小限制。

20.oom时怎么排查,比如现在有一个项目部署在linux上,cpu彪的很高怎么排查

1.看日志
2.如果有设置了 JVM 的参数 -XX:+HeapDumpOnOutOfMemoryError,则当发生 OOM 错误时会生成堆转储文件(Heap Dump),可以使用工具分析堆转储文件,查看内存中的对象分布情况,找出内存占用较大的对象或者内存泄漏的情况。
3.检查代码是否有内存泄漏

21.linux常用命令

  1. 文件和目录操作
  • ls:列出目录内容
  • cd:切换目录
  • pwd:显示当前工作目录
  • mkdir:创建新目录
  • rm:删除文件或目录
  • cp:复制文件或目录
  • mv:移动文件或目录
  • touch:创建空文件或更新文件时间戳
  1. 文本处理
  • cat:查看文件内容
  • grep:在文件中搜索指定模式
  • head:显示文件头部内容
  • tail:显示文件尾部内容
  • wc:统计文件行数、字数和字符数
  1. 系统管理
  • ps:显示进程状态
  • top:实时显示系统中各个进程的资源占用情况
  • kill:终止进程
  • df:显示磁盘空间利用情况
  • free:显示内存使用情况
  1. 权限管理
  • chmod:修改文件权限
  • chown:修改文件所有者
  • chgrp:修改文件所属组
  1. 网络相关
  • ping:测试网络连接
  • ifconfig:显示或配置网络接口信息
  • netstat:显示网络状态和统计信息
  • ssh:远程登录到另一台主机
  1. 压缩和解压缩
  • tar:打包和解包文件
  • gzip:压缩文件
  • unzip:解压缩文件

22.垃圾回收这块有了解吗

在 JVM 中,垃圾回收器(Garbage Collector)负责执行垃圾回收的工作,它会定期检查程序中不再使用的对象,并将这些对象所占用的内存标记为可回收。常见的垃圾回收算法包括:

  1. 标记-清除算法(Mark and Sweep):该算法首先标记所有活跃对象,然后清除所有未被标记的对象,释放它们所占用的内存空间。但是标记-清除算法可能会产生内存碎片。
  2. 复制算法(Copying):该算法将堆内存分为两块,每次只使用其中一块,将活跃对象复制到另一块内存中,然后清除旧的内存块中所有对象。这样可以避免内存碎片问题。
  3. 标记-整理算法(Mark and Compact):该算法结合了标记-清除和复制算法的优点,先标记并整理活跃对象,然后将它们紧凑地排列在一起,清除未使用的对象。

23.商城做一个抽奖活动,lv1 lv2 lv3的用户分别抽不同的奖池,怎么用设计模式

  1. 工厂方法模式(Factory Method Pattern):
  • 定义一个抽奖活动工厂接口(AbstractFactory),包含创建不同等级用户奖池的方法。
  • 实现不同等级用户奖池的具体工厂类,如 Level1FactoryLevel2Factory 和 Level3Factory,分别负责创建对应用户等级的奖池对象。
  • 奖池对象可以定义一个统一的抽奖方法,供用户调用进行抽奖操作。
  1. 策略模式(Strategy Pattern):
  • 定义一个抽奖策略接口(PrizePoolStrategy),包含抽奖方法。
  • 实现不同等级用户奖池的具体策略类,如 Level1PrizePoolLevel2PrizePool 和 Level3PrizePool,每个类实现自己等级用户的抽奖逻辑。
  • 在工厂方法中,根据用户等级选择对应的奖池工厂,然后根据具体的策略类来创建奖池对象。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值