【面试记录】一年半 Java
Kiml Lv5
  • 前言
    还是裸辞了,大概休息了 3 个月,现在继续准备面试。很多八股文都忘记了。合并了之前华为 OD 的刷题记录,算是第一次跳槽的面试记录总结。一共面了三家,过了两个,推了外包。闲鱼上咨询了一下,意思是让我继续面,但是不想面了,而且这边offer已经接了,暂时就先这样吧。

  • 更新

1
2
3
4
24.03.28 华为 OD 刷题记录
24.08.21 合肥英泽信息科技(外包中华保险)面试记录
24.08.22 中吾科技、网新恒天(外派道富)面试记录
24.09.05 网新恒天(外派道富)二面记录及总结

华为 OD

刷题记录

为块术(不是),其实一直觉得二本毕业去这边也蛮好的,但是一直没有动力刷题。今天去面试,啥也没准备,就看了一天早已忘记的八股文,果然挂了。但是 Boss 上收到华为 OD 的 Hr 的消息(好像是最近突然加了岗位?),总之约了两周后机考(怎么敢的,真的一点都没准备过)

240328

1
思路居然是遍历,遇0清空计数,真的没想到。显得我的方法很笨。
1
语法糖就语法糖吧,我放弃了

240330

240402

1
用了API

240404(牛客华为机试题库

1
2
// 忘了这个API
String.join(" ", strings)

240406(华为 OD 机试 2024 年最新题库 -C 卷)

1
2
本题用滑动窗口进行求解。
之前都不会这个。标记一下需要二刷。

240407(华为 OD 机试 2024 年最新题库 -C 卷)

1
不会,没有思路,先跳过。

240408(华为 OD 机试 2024 年最新题库 -C 卷)

1
没有思路,200分题打算周末再刷了,先看看有没有类似的题解。
1
严重超时,不知道是不是因为一边上班一边做的原因思路都是乱的

240409(华为 OD 机试 2024 年最新题库 -C 卷)

240410(华为 OD 机试 2024 年最新题库 -C 卷)

240411(华为 OD 机试 2024 年最新题库 -C 卷)

1
2
3
4
5
不希望考到这题。怎么还有正则
正则实在不太熟,这题硬记((+-)?(\\d+[+-*])*\\d)
判断出最长正则式子之后的思路为:
1、记录初始加减号
2、如果是+,记录数乘1;如果是-,记录数乘-1;如果是乘,获取前一个数并乘并记录乘积

机试(240417)

没过。。。293 但是要 300 分。算了。本来也没报多大希望。

还是多刷点题再投简历。现阶段,辞不辞职都无所谓了(最好明天就把我裁了!!!大晚上 10 点群里@人是不是有病啊,又不是 bug????谁 tm 理你???!!!)

1 年多的 Java 现在真的狗都嫌,打算实在没有去处,6 个月之后再考一次,反正本次刷题感觉还行,不是特别难。

后续

打算先刷点算法 + 八股了。实在不行啃点存款,反正还没辞职。。。

合肥英泽信息科技(外包中华保险)

没意外应该一面挂了。

一面

面试官人很好,但是基本上问的都是关于项目的场景题,这次关于项目的题目一点都没有准备,感觉在乱答(那种分不清问题重点的乱答)。八股文只问了线程池的运行过程,会,但是马上就问后序的使用,基本上没有用过的技术我都说没有(包括线程池,微服务的治理等。实在不行这块写代码跑通了编一下看看)。

面试题和回答点

  1. 先问线程池运行顺序,背出来了。然后问线程池在项目中的使用。
    在想定这个项目中,用 AOP 切面进行了日志的记录,在日志记录的时候用到了线程池。使用的是常用的线程池中的ScheduledThreadPoolExecutor(定时/延时执行任务)。好处是可以将日志记录操作放入单独的线程中执行,从而释放主线程的资源,使其能够更快地处理其他任务。反正就围绕这个把线程池八股文都说一遍,包括核心线程数啥的。

  2. 讲一下微服务体系。
    说了注册中心 Nacos,网关 Gateway,远程调用 Feign,微服务治理(服务限流 Sentinal、分布式事务 Seata)

  3. 然后问项目中是否用了分布式事务 Seata。
    没有。不知道是不是也要去研究一下

  4. 问为什么要进行微服务拆分。
    首先这是个工厂项目,没有高并发。(这里需要按点回答!!!!)

    1. 模块化。通过拆分成微服务,每个服务都可以独立开发、部署和扩展,有助于团队聚焦于特定的业务功能或领域。
    2. 灵活性和弹性。服务可以独立扩展,只针对需要更多资源的特定服务进行扩展,而不必扩展整个应用,这样可以更有效地利用资源。
    3. 故障隔离:如果一个服务失败,其他服务仍然可以继续运行,这有助于提高系统的整体稳定性。
    4. 边界清晰:微服务之间的边界清晰,有助于明确接口定义和服务职责。
    5. 可重用性:微服务可以独立部署和运行,易于被其他服务或应用重用。(说一下注册和认证还有 activiti 这块调出来使用了
  5. Nacoa 作为注册中心,怎么考虑高可用的问题。
    用集群(这段建议背一下 Nacos 集群的相关问题),只能回答说,目前用的是单体启动,然后运维也是我负责,所以出问题也是我解决。。。

  6. 关于微服务远程调用造成的数据不一致问题,Feign 调用失败数据不一致?
    回答说没有遇到过,服务调用失败就是配置了一个 FallbackFactory。应该还是要问分布式事务管理的问题,太难了实在不会。

  7. Gateway 的作用。(前三个是答出来的、后面的真的没有用到过。后续面试时看情况吧)

    1. 请求路由:API 网关作为系统的单一入口点,负责将外部请求路由到正确的微服务实例上。它可以基于 URL 路径、请求参数、报头等信息进行路由决策。
    2. 跨域处理:API 网关可以处理跨域资源共享(CORS)问题,使得前端应用程序能够安全地与后端微服务进行通信。
    3. 认证与授权:API 网关负责对请求进行认证和授权,确保只有合法的请求能够访问后端的微服务。
    4. 协议转换:不同微服务可能使用不同的通信协议,API 网关可以将外部使用的协议(如 HTTP/HTTPS)转换为内部服务使用的协议(如 Thrift、gRPC 等)。
    5. 聚合服务:当一个请求需要多个微服务协作才能完成时,API 网关可以聚合多个服务的结果,减少客户端与多个微服务的直接通信。
    6. 限流与熔断:为了保护后端服务,API 网关可以实现限流(限制请求的频率)和熔断(在服务不可用时防止系统雪崩)。
    7. 监控与日志:API 网关可以记录所有进入系统的请求,并监控这些请求的处理时间和状态,这对于故障排查和性能分析非常有用。
    8. 缓存:对于某些不经常变更的数据,API 网关可以实现缓存机制,减少对后端服务的调用,提高响应速度。
    9. 静态资源服务:API 网关可以用来服务静态资源,如 HTML、CSS、JavaScript 文件等。
  8. 既然说到了跨域,说一下跨域的原因。(😭忘记准备了,这个应该是必须要会的,需要总结)

内链:[[跨域产生的原因及解决方案]]
外链:跨域产生的原因及解决方案

  1. 说一下 Gateway 怎么解决跨域问题(这个直接背一下,说出来了,但是还是要问原因)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
spring:
cloud:
gateway:
globalcors:
cors-configurations:
'[/**]': # 匹配所有请求
allowedHeaders: "*"
allowedOrigins: "*" #跨域处理 允许所有的域
allowedMethods: # 支持的方法
- GET
- POST
- PUT
- DELETE
- OPTIONS
  1. Gateway 认证,用了什么(考虑要不要加上一些复杂的框架知识)
    说了 JWT。继续问 token 能不能被伪造。(这里要背之前的回答❗❗❗太久了有点忘记了)

  2. 想定远程调用的图生图,是什么。
    这个没什么好说的,就说是别人部署的。

  3. 问了这个项目主要负责哪一块。关于商城的上架支付等一系列功能是不是都实现了。
    额我说都是我负责的,其实下一步应该要问具体的业务逻辑讲一下。我说是的,然后包括 H5,Android ,后台,但是都是前端打包。(好像能讲的比较少,只有支付的 MQ 可以讲一下,但是一开始就问了这个。问题是 RabbitMQ 在哪个部分用到,就说了这边支付延时的问题)

  4. RabbitMQ 继续问还有哪里可以用到
    回答了异步,随便举了一个支付成功发邮件的例子。

  5. 继续问发失败了怎么办(这里要问的是 ACK,但是忘记准备 MQ 相关的八股文了❗❗❗)
    一直在引入 ACK 的机制,但是真的想不起来了。就说了一个设置消息重发的配置。

  6. 看到项目用了 Flowable,问为什么使用,是流程比较复杂吗。
    不是复杂,是需要流程可视化配置

  7. 后序问开发中感觉比较难的部分。(不知道要不要说这个难点,还是换一个难点
    说了流程这块(好像没有什么可以说了)。一开始是网上搜索用能直接生成 xml 文件的代码,把这个流程部署到我们的服务上(但是需求是能快速部署流程使用)。一开始用的开源项目的流动过程的配置比较难(因为这里当时还要配置结束的监听器之类的操作,可能直接给不会开发的人使用比较困难),后面搜到一个开源项目,就引入我们系统(下次就说参考开源项目,写的流程自动化配置😖)。然后统一在结束节点的地方加了一个监听器,根据不同的流程,调用微服务控制业务表的操作(这里以后问可以说一下用策略模式优化了服务间的调用,嗯但是可能有问题就是调用失败了怎么办,不然说写到 MQ 了?)

  8. 问了这种问题为什么没有老员工带什么的。
    额我说后面开发就我一个了,所以我自己解决的。已经有点破防了。

  9. 问学了什么新技术(因为简历里乱写热爱技术,学习新技术。。。)
    说了 copilot,我也不知道说什么了。反正就说了 GPT 那一套,还说了自己在写博客(真的内心已经在喊救命了)

  10. 问获取和交流代码的途径
    神经我说开源项目的群(不知道我在说什么,胡言乱语)、博客

  11. 反问
    感觉没戏就简单问了一下有几轮面试。

总结

没有根据简历准备面试(大忌❗❗❗)

总结的时候发现问的好难啊,基本上要问的就是分布式事务和多线程(线程池),多线程可以去准备一下(顺便这块的八股文也背的还行)。没有什么八股文,除了第一个,难道是因为第一个我背的太明显了吗。

中吾科技

听说团队缩减了一半,然后重新招人,十几份里选一两个。等通知。。。两天面试都提到了分布式锁相关的内容,这个需要好好研究一下❗❗❗没有及时记录,有点混乱了。

后来搜到了公司的官网,但是没有注册入口❔。

一面(就一面)

面试题和回答点

  1. 关于项目问了很多(之前的团队,开发人数,微服务整合等等)
    实话实说我一个人干的。

  2. 仓库部分的表设计,关于怎么锁库存的
    我说我分表了,简单的说了一下,但是应该不是他想要的答案,网上搜了一下分布式锁库存的问题(准备好了这个,后面面试重难点可以说这个❗❗❗)。

    这块如果是单体架构可以参考之前的开源项目可以设计一个出入库事务表,然后所有的出入库表关联这个出入库事务表,但是是分布式就不行 // todo 关于这块详细设置。

    1. 乐观锁: 乐观锁是一种在数据操作时不使用传统锁机制,而是在数据提交时检查数据冲突的策略。在乐观锁中,当一个操作尝试更新库存时,它假设其他操作不会修改同一数据。如果在提交时发现冲突,通常会回滚操作并通知用户。

    2. 悲观锁: 悲观锁是一种在数据操作时立即获取锁的策略。当一个操作尝试更新库存时,它会立即获取一个独占锁,阻止其他操作在同一时间内修改同一数据。当操作完成后,锁会被释放,其他操作可以继续执行。

    3. 分布式锁: 在分布式系统中,由于数据可能分布在多个节点上,因此需要使用分布式锁来保证对共享资源的互斥访问。常见的分布式锁实现包括 ZooKeeper、Redis 等。

    4. 事务管理: 使用数据库的事务管理功能来保证库存操作的原子性。在一个事务中,所有对库存的修改要么全部成功,要么全部失败,确保库存的一致性。

    5. 库存锁定机制: 某些仓库管理系统可能会实现自己的库存锁定机制,比如在提交库存更新请求时,系统会检查当前库存是否可以满足请求,如果可以,则锁定库存,执行操作,最后解锁库存。

    6. 库存预留机制: 在某些情况下,可能需要提前预留库存以支持订单处理。这通常涉及到一个额外的库存状态,如“预留”或“预留中”,在实际出库前,库存状态保持为“预留中”,从而实现对库存的锁定。

    7. 消息队列: 在某些情况下,可以通过消息队列来实现库存的锁机制。例如,当一个操作需要更新库存时,它首先向消息队列发送一个消息,然后等待响应。如果响应表明库存可以更新,则执行操作;如果响应表明库存不可更新,则放弃操作。

  3. 然后是问一点关于技术的问题,关于 Java 中的集合
    八股文关于集合全背。说到 HashMap 底层问了要不要继续。

  4. 嗯然后说可以说下多线程的问题,比如 HashTable 和 ConcurrentHashMap。
    HashTable 底层就是加锁,很少用;ConcurrentHashMap 全背。然后提了一下 ArrayList 也是线程不安全的,可以用 Collections.synchronizedList(),但是遍历的时候还是要加锁,因为只有 add,remove 等方法加了锁。

  5. 问 List 遍历能不能 remove
    说不行,会 Fail-fast(下次加上迭代器是可以的)

  6. 问 Redis 的问题,分布式多线程问题。
    应该是要问这个,但是我直接整到多线程,线程池那里去了😥。(然后问不是在问 Redis,咋整到那里去了😗)。我说 Redis 我只是简单的使用,存短信验证码用到了。

  7. 然后问多线程,核心线程参数
    (可能被我带跑偏了)说了面试前刚刚准备的那个线程池(日志记录的那个),包括这块的八股,多扯一点,加上线程池的执行顺序、拒绝策略什么的。

  8. MQ 的消息保证
    不会这个。和之前回答一样重试机制,但是继续问队列满了怎么办。需要加强背。MQ 的相关八股忘记准备了,这周末的重点❗❗❗

  9. 服务器部署,有没有用过 jekins
    没有,后来他说他们是,我说我去看一下。。。

  10. 离职状态,投了多久简历,有没有 offer,为什么离职,只剩我一个开发的话,应该还是蛮重要的。。。
    直接说发不出工资。

  11. 期望薪资,反问

总结

提供了面试重难点的新思路,感觉如果是物流仓储必会问到这个,还有需要关注一下高可用相关的问题,这周好好准备一下。

总结

这个过了,最后去的这里。

网新恒天(外派道富)

嗯,又在胡言乱语,一紧张就胡言乱语。后面搜了如果到好的项目组就是 1055,后悔,早知道最后面这个,居然还有这种外包😭。全部都是八股文。(其实正常外包应该都是这样吧,第一天背了半天八股没有怎么问,嗯应该也问了,但是没有这么频繁,感觉这边面试是八股文集合)

一面(八股)

面试题和回答点

  1. 自我介绍(+ 简单的英文自我介绍)
    英文,嗯,忘光了。

  2. ArrayList 和 LinkedList 区别

  3. ArrayList 初始容量

  4. HashMap 底层结构

  5. HashMap 扩容机制
    卡住了,卡到 put 了,然后说说几倍就行

  6. AOP 的原理🤡

  7. SPI 机制🤡

  8. Java 中有哪些锁?
    只说了 Lock 和 synchronized,顺便提到了公平锁和非公平锁。

  9. 还有吗?
    可能想问 CAS?还是锁的分类?不知道我直接说的没有了吧。。。

  10. 线程的 run() 和 start() 有什么区别?

  11. sleep() 和 wait() 有什么区别?

  12. MySQL 的索引
    不知道具体要问什么。。。说了一下 innodb 是聚簇索引。然后问了一下这个要问什么。。。然后说不问了

  13. 事务的几个特性?ACID 是什么🤡

  14. SQL 优化

  15. 有没有用过序列、触发器
    我说我不知道,问我有没有用过 Oracle

  16. MQ,有没有用过 Kafka

  17. Linux 常见命令🤡

  18. 怎么在系统中找到一个文件
    find。

  19. 会不会前端

  20. 最后英语自我介绍,反问
    英语真的想不出来阿巴了半天,反问懒得问了就说没有。

总结

八股文不熟,总览里的题目必会。好像过了,在推项目组,不知道行不行。

二面(项目)

间隔的时间比较久了,面试通过了,只记录一下过程中让做的一道比较有意思的题目。

不借助 java 自带的并发容器类,实现一个吞吐率尽可能高的先入先出数据结构,最多能容纳1000个元素。实现线程无锁安全。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
/**  
 * @author ZYF
 * @date: 2024/8/28 17:26
 * @description:
 */
public class LockFreeQueue<E> {
    private final AtomicReferenceArray<E> array;   
    private final AtomicInteger head;
    private final AtomicInteger tail;   
    private final int capacity;

    public LockFreeQueue(int capacity) {
        // 环形缓冲区实际大小为 capacity + 1
        this.capacity = capacity + 1;
        this.array = new AtomicReferenceArray<>(this.capacity);       
        this.head = new AtomicInteger(0);
        this.tail = new AtomicInteger(0);
    }   
   
    public boolean offer(E item) {
        if (item == null) {
            throw new NullPointerException("Item cannot be null");
        }

        while (true) {
            int currentTail = tail.get();
            int nextTail = (currentTail + 1) % capacity;

            if (nextTail == head.get()) {
                // 队列已满
                return false;
            }

            if (array.compareAndSet(currentTail, null, item)) {
                // 插入成功,更新尾指针
                tail.compareAndSet(currentTail, nextTail);
                return true;
            }
        }
    }

    public E poll() {
        while (true) {
            int currentHead = head.get();
            int currentTail = tail.get();

            if (currentHead == currentTail) {
                // 队列为空
                return null;
            }

            E item = array.get(currentHead);
            if (item != null && array.compareAndSet(currentHead, item, null)) {
                // 读取成功,更新头指针
                head.compareAndSet(currentHead, (currentHead + 1) % capacity);
                return item;
            }
        }
    }

    public boolean isEmpty() {
        return head.get() == tail.get();
    }

    public boolean isFull() {
        return (tail.get() + 1) % capacity == head.get();
    }
}

总结

最后没有去这里,因为外包。但是待遇比现在的好,希望之后不会后悔。

 评论
评论插件加载失败
正在加载评论插件
由 Hexo 驱动 & 主题 Keep
访客数 访问量