华为od面试全流程总结
Posted 默归
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了华为od面试全流程总结相关的知识,希望对你有一定的参考价值。
一、笔试
笔试是三道算法题,时间是150分钟也就是两个半小时,分值是100、100、200,如果是目标院校的话,好像150分就过了,不是的话分数线好像会高很多。我抽到的题不难,满分通过。
完整的笔试题和解析见我的博客: 华为机试(6.17笔试题解析)
二、性格测试
笔试通过后会做一套性格测试题,不要忽视这个环节,这部分是有可能挂人的。(终面的时候面试官告诉我,我的性格测试结果显示我有点焦虑,还让我说明原因)
三、技术一面
技术一面是你入职后所在的项目组的面试官来面,所以会轻松一点,像我就是全程在和面试官聊天,手撕的代码题也很简单,就不详细说了。
四、技术二面
二面是不同项目组交叉面试,时间相当之长,面了我足足一个小时。。。
1.自我介绍
2.JVM的组成?
3.一个java文件怎么被加载到jvm里?
4.SPI(Server Provider Interface)了解吗?(没听说过)
5.怎么确定某个对象是需要被回收的?
6.线程创建有哪些方式?
7.Runnable和Callable有什么区别?它们如何处理异常?(异常处理那块没答出来,基础不牢啊)
8.为什么会发生线程安全问题?Java的内存模型(JMM)?
9.如何保证线程安全?(提到了 volatile和synchronized)
10. volatile和synchronized的区别,结合JMM说说?
11.说一说线程池的工作流程?
12.线程池的拒绝策略?实际生产中我们怎么设置拒绝策略?(啊啊啊,这个问题牛客上是有的,当时没复习!!!)
13.SpringAOP?原理(设计模式)?
14.现在我想实现一个权限验证的功能,而且不想使用安全框架,你有什么思路?(这个我正好有做过这样的一个需求,就是自定义一个注解,在需要权限验证的方法前加上该注解,然后用AOP去做验证,用拦截器也可以实现)
15.SpringBoot相比Spring做了什么改进?(起步依赖和自动装配)
16.说说SpringBoot的自动装配流程?(提到了@Conditional注解)
17.我现在有一个Provider类,它被容器管理,但是我不想用它了,想用一个新的Provider类,那么如果我直接将它交给容器,会报Bean冲突,那么怎么使用@Conditional注解,让这个新Provider的Bean直接替换掉原来Provider的Bean?(实际上就是怎么用@Conditional注解实现按条件注入Bean,可惜我没有自己动手试过,没答上)
18.MyBatis怎么实现分页?
19.手撕代码:大意是给一串数字,如104032,将它用中文表示:十万四千零三十二。(当时就想到按部就班去做,每隔四位就会出现万、亿这样的单位,可以除4判断,而十百千是循环出现的取模判断就行,麻烦的地方在于零,多个零只能保留一个,如一千零一,不能是一千零零一,而在个位的(只有个位的时候还是要保留)、万位的、亿位的零不能被保留,如二十,不能是二十零,但是面试官说我对这个问题还是没有彻底抽象出来,做法略显麻烦了点,但最后他也没说最佳做法是啥...)
20.反问
五、综合面式
1.自我介绍
2.询问我的主要项目,特意问了代码量有多少。
3.问实习经历,在实习的项目里主要负责哪块。
4.性格测试结果显示你是有点焦虑的,能说下原因吗?
5.期望薪资?
6.期望工作地点?
7.反问
六、资格面试
类似于hr面,就询问了下个人基本情况,期望薪资,为什么不考研等等。
华为OD面试,技术一面问什么?常用设计模式,自定义的bean,多线程处理共享变量等问题
文章目录
华为 OD 面试流程
- 机试:三道算法题,关于机试,橡皮擦已经准备好了各语言专栏,可以直接订阅。
- 性格测试:机试
- 技术一面
- 技术二面
- 主管面试
- 定级定薪发 offer
- 体检入职
本专栏的所有博客,将为大家整理技术一面二面中【面试官问到的真题】,并提供大家答案。
⭐️ 华为 OD 机考 Python https://blog.csdn.net/hihell/category_12199275.html
⭐️ 华为 OD 机考 C++ https://blog.csdn.net/hihell/category_12199283.html
⭐️ 华为 OD 机考 JS https://blog.csdn.net/hihell/category_12201825.html
⭐️ 华为 OD 机考 JAVA https://blog.csdn.net/hihell/category_12201821.html
⭐️ 华为 OD 机考真 C 语言 https://blog.csdn.net/hihell/category_12225286.html
⭐️ 华为 OD 机考 Golang https://blog.csdn.net/hihell/category_12231589.html
所有问题都来自通过华为 OD 机考通过人员反馈信息。
每篇博客会涉及 7 个面试题,题目和答案仅供参考~
一、常用设计模式
- 单例模式 🕰️
- 工厂模式 🏭
- 抽象工厂模式 🏭🎨
- 建造者模式 🛠️
- 原型模式 🐑
- 适配器模式 🔌
- 桥接模式 🌉
- 组合模式 🌿
- 装饰器模式 🎀
- 外观模式 🏢
- 享元模式 🧊
- 代理模式 🕵️
- 观察者模式 👀
- 模板方法模式 📝
- 策略模式 🏹
- 命令模式 📜
- 职责链模式 🔗
- 状态模式 🚦
- 访问者模式 👥
- 中介者模式 🤝
- 解释器模式 💬
二、springmvc 的流程
- 客户端发送请求 📩
- DispatcherServlet 接收请求 🤖
- HandlerMapping 根据请求 URL 查找对应的处理器(Handler) 🗺️
- HandlerAdapter 调用 Handler 进行处理 📲
- Handler 处理请求并返回 ModelAndView 对象 🧾
- ModelAndView 包含视图名称和模型数据,传递给 DispatcherServlet 处理 👩💻
- ViewResolver 根据视图名称解析出视图对象(View) 🧐
- View 渲染模型数据,生成响应内容并返回给 DispatcherServlet 处理 📤
- DispatcherServlet 将响应内容返回给客户端 📫
三、自定义的 bean 怎么交给 spring 管理
- 在自定义 Bean 类上添加 @Component 或其他注解,以声明该类是一个 Bean 🌱
- 在 Spring 的配置文件中声明组件扫描,以使 Spring 能够自动扫描到该 Bean 的注解 🧐
- 或者,在 Spring 的配置文件中手动声明该 Bean,以使 Spring 能够将该 Bean 加载到容器中 📜
@Component // 添加注解声明该类是一个 Bean
public class MyBean
// 类实现
<!-- 声明组件扫描,让 Spring 能够自动扫描到 MyBean 的注解 -->
<context:component-scan base-package="com.example" />
<!-- 手动声明 MyBean,将该 Bean 加载到容器中 -->
<bean id="myBean" class="com.example.MyBean" />
四、bean 的加载过程
- Spring 启动时读取配置文件 📖
- Spring 实例化 BeanFactory,准备加载 Bean 🌱
- Spring 根据配置文件中的定义,实例化 Bean(实例化 Bean 并不代表 Bean 已经就绪)🚀
- Spring 对 Bean 进行依赖注入(DI):将 Bean 所依赖的其他 Bean 注入到该 Bean 中 💉
- Spring 调用 Bean 的初始化方法(如果有定义的话) 🎬
- Bean 可以被应用程序使用了 🏃♀️
- 当应用程序关闭时,Spring 调用 Bean 的销毁方法(如果有定义的话) 🌇
<bean id="myBean" class="com.example.MyBean" init-method="init" destroy-method="destroy">
<!-- Bean 的属性定义 -->
</bean>
五、spring 容器加载哪些 bean,加载哪些配置文件
- Spring 容器加载哪些 Bean 取决于配置文件中定义的 Bean 和注解声明的 Bean 🌱
- 加载哪些配置文件也取决于配置文件中定义的 Bean 和注解声明的 Bean,因为这些 Bean 可能需要依赖其他 Bean,而这些依赖关系通常在配置文件中声明 📜
- Spring 容器默认会加载名为 applicationContext.xml 的配置文件,但也可以通过在 web.xml 文件中配置 ContextLoaderListener 和 ContextLoaderServlet 来加载其他配置文件 📁
<!-- 定义一个 Bean,这个 Bean 将被 Spring 加载到容器中 -->
<bean id="myBean" class="com.example.MyBean">
<!-- Bean 的属性定义 -->
</bean>
@Component // 添加注解声明该类是一个 Bean,这个 Bean 将被 Spring 加载到容器中
public class MyBean
// 类实现
<!-- 在 web.xml 中配置 ContextLoaderListener 和 ContextLoaderServlet 来加载其他配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/applicationContext.xml</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<servlet>
<servlet-name>MyServlet</servlet-name>
<servlet-class>com.example.MyServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring/myServlet-context.xml</param-value>
</init-param>
</servlet>
六、非 spring 管理的 bean 怎么使用 spring 管理的 bean
- 将非 Spring 管理的 Bean 实例化 🌱
- 将非 Spring 管理的 Bean 注入到 Spring 管理的 Bean 中 💉
- 使用 Spring 管理的 Bean 来操作非 Spring 管理的 Bean,或者让非 Spring 管理的 Bean 来操作 Spring 管理的 Bean 🤝
public class NonSpringBean
// 类实现
@Component
public class MySpringBean
private NonSpringBean nonSpringBean;
@Autowired
public MySpringBean(NonSpringBean nonSpringBean)
this.nonSpringBean = nonSpringBean;
public void doSomething()
// 使用非 Spring 管理的 Bean
nonSpringBean.doSomethingElse();
// 让非 Spring 管理的 Bean 来操作 Spring 管理的 Bean
nonSpringBean.setSomeProperty(this.someProperty);
@Configuration
public class AppConfig
@Bean
public NonSpringBean nonSpringBean()
return new NonSpringBean();
七、多线程处理共享变量的几种方式
- 加锁(synchronized):通过加锁来保证同时只有一个线程访问共享变量,避免并发问题 🗝️
- 使用 volatile 关键字:使用 volatile 关键字修饰共享变量,强制所有线程从主内存中读取该变量,避免线程间的变量不一致问题 💥
- 使用 Atomic 类型:使用 Atomic 类型(如 AtomicInteger、AtomicBoolean 等)来保证共享变量的原子性,避免并发问题 ⚛️
- 使用 synchronized 容器:使用 synchronized 容器(如 Collections.synchronizedList、Collections.synchronizedMap 等)来保证对容器中元素的操作是线程安全的 📦
- 使用并发容器:使用并发容器(如 ConcurrentHashMap、CopyOnWriteArrayList 等)来保证对容器中元素的操作是线程安全的,避免并发问题 🚀
public class MyRunnable implements Runnable
// 共享变量
private volatile int count = 0;
private AtomicInteger atomicCount = new AtomicInteger(0);
// synchronized 方式
public synchronized void incrementCount()
count++;
// Atomic 方式
public void incrementAtomicCount()
atomicCount.incrementAndGet();
@Override
public void run()
// 加锁方式
synchronized (this)
incrementCount();
// 使用 volatile 关键字
incrementCount();
// 使用 Atomic 类型
incrementAtomicCount();
// 使用 synchronized 容器
List<Integer> synchronizedList = Collections.synchronizedList(new ArrayList<>());
Map<String, Integer> synchronizedMap = Collections.synchronizedMap(new HashMap<>());
// 使用并发容器
ConcurrentMap<String, Integer> concurrentMap = new ConcurrentHashMap<>();
CopyOnWriteArrayList<Integer> copyOnWriteArrayList = new CopyOnWriteArrayList<>();
以上是关于华为od面试全流程总结的主要内容,如果未能解决你的问题,请参考以下文章
华为OD面试,技术一面问什么?包含工厂模式,full gc,priorityQueue底层原理等问题,