技术面试问题整理-20250705
一、介绍
候选人简历分析
彭先生拥有 13 年工作经验,在工业数字化项目操盘、技术架构设计、团队管理等方面积累深厚。技术上精通 Java,熟悉 SpringCloud、Flink 等框架,具备数字孪生等物联网技术应用经验,参与过智慧园区、数据中台等项目,涉及大数据处理、数据安全等技术的整合应用。但简历中对 Python 应用经验提及较少,未明确描述 MES 系统、PLC 相关经验,需在面试中重点确认其在这些领域的实际能力。
以下是从技术和项目经历两方面,为面试工业数字化工程师岗位候选人准备的问题:
一、技术问题(5题)
-
在您过往的项目中,是否使用过Java或Python开发过工业物联网相关的应用?能否举例说明具体实现了哪些功能,以及遇到的技术难点和解决方案? (考察候选人对Java/Python在物联网场景的应用能力,以及问题解决经验)
-
您提到熟悉数字孪生等物联网技术,能否结合具体项目,阐述数字孪生在工业场景(如智慧园区、水务管理)中的技术架构和实施流程? (考察对物联网技术的理解深度,以及落地应用能力)
-
在MES(制造执行系统)或PLC(可编程逻辑控制器)相关项目中,您是否有过数据对接或系统集成的经验?请说明数据交互的方式和技术难点。 (考察候选人对工业信息化系统的认知,以及集成能力)
-
您在TCL实业数据中台项目中使用了Hadoop/Spark/Flink等技术,这些技术在工业数字化场景中如何优化生产数据的实时处理?请结合具体场景说明。 (考察大数据技术在工业场景的应用理解)
-
在数据安全管控平台项目中,您提到使用了SpringCloudAlibaba等组件,能否说明这些技术在工业系统安全防护中的具体应用,例如如何保障生产数据的传输和存储安全? (考察工业系统安全技术的应用能力)
二、项目经验问题(3题)
-
在智慧数享行业大数据平台项目中,您主导了医疗客户的实时计算需求,采用了Doris/Flink+Iceberg架构。如果将该架构应用于厨余垃圾处理工厂的生产数据实时监控,您认为需要做哪些调整?为什么? (考察项目经验迁移能力和技术适配思考)
-
某国际机场智慧水务数字孪生平台项目中,您通过激光雷达建模提升了数据安全性。若在厨余垃圾处理工厂中构建类似的数字孪生系统,您会如何结合工厂的环境特点(如潮湿、腐蚀性气体)设计技术方案? (考察工业场景定制化方案设计能力)
-
在S市政数局大数据深化应用项目中,您负责了数据治理和安全管控工具的建设。对于厨余垃圾处理工厂的生产信息化系统,您认为数据治理的重点环节是什么?如何通过技术手段保障生产数据的准确性和完整性? (考察工业数据治理的落地思路)
-
介绍一个**你曾经主导的工业数字化项目,并详细说明你的职责和成果**
二、技术问题
Java基础
-
问题:Java中的几种基本数据类型了解么?
-
考察点:考察候选人对Java基本数据类型的掌握程度。
-
期望回答:Java有8种基本数据类型,包括4种整数型(byte、short、int、long)、2种浮点型(float、double)、1种字符类型(char)和1种布尔类型(boolean)。需说明各类型的默认值及所占空间大小。
-
-
问题:常用的集合类型都有哪些?哪些是线程安全的?
-
考察点:考察候选人对Java集合框架的熟悉程度。
-
期望回答:常用集合有ArrayList、LinkedList、HashMap、HashSet等。其中HashTable是线程安全的。
-
-
问题:Java中的equals()方法和==操作符有什么区别?请举例说明。
-
考察点:考察候选人对Java中对象比较的理解。
-
期望回答:用于比较两个引用是否指向同一个对象,equals()方法用于比较两个对象的内容是否相等。例如,字符串对象通过比较的是内存地址,通过equals()比较的是字符串内容。
-
-
问题:什么是Java的反射机制?请举例说明如何使用反射来动态加载类和调用方法。
-
考察点:考察候选人对Java反射机制的理解和实际应用能力。
-
期望回答:反射机制允许程序在运行时查询类、接口、字段和方法的信息,并调用对象的方法。例如,通过Class.forName()动态加载类,通过getMethod()和invoke()调用方法。
-
-
问题:Exception和Error有什么区别?
-
考察点:考察候选人对Java异常体系的理解。
-
期望回答:Throwable是所有异常的共同祖先,其两个重要子类为Exception和Error。Exception是程序本身可以处理的异常,分为Checked Exception(受检查异常,必须处理)和Unchecked Exception(不受检查异常,可以不处理);Error属于程序无法处理的错误,不建议通过catch捕获,例如Java虚拟机运行错误等,发生时JVM一般会选择线程终止。
-
Java框架:
问题:请讲一下Spring Boot的自动配置原理。
考察点:考察候选人对Spring Boot自动配置核心机制、关键组件及流程的理解。
期望回答:
Spring Boot自动配置通过约定大于配置实现,简化配置,核心原理如下:
1、核心注解与触发机制
- @EnableAutoConfiguration(含于@SpringBootApplication)触发自动配置,通过AutoConfigurationImportSelector加载META-INF/spring.factories中的自动配置类(如XXXAutoConfiguration)。
- 自动配置类通过@Conditional系列注解(如@ConditionalOnClass)判断是否生效。
2、关键组件作用
● AutoConfigurationImportSelector:扫描并筛选自动配置类。
● spring.factories:定义自动配置类列表(如WebMvcAutoConfiguration)。
3、条件注解控制生效时机
● @ConditionalOnClass:类路径存在指定类时生效(如RedisAutoConfiguration依赖RedisOperations)。
● @ConditionalOnMissingBean:容器无指定Bean时生效。
4、配置优先级
用户配置(如application.yml)优先级高于自动配置默认值,自动配置会与用户自定义配置融合。
5、扩展方式 - 部分覆盖:通过@Configuration+@Bean自定义Bean(如DataSource)。
- 完全禁用:在@SpringBootApplication中用exclude排除自动配置类。
总结流程
扫描依赖→条件过滤配置类→注入Bean→融合用户配置,实现“开箱即用”的自动配置体验。
Java并发编程
-
问题:请解释Java中的volatile关键字的作用,并说明它与synchronized的区别。
-
考察点:考察候选人对Java并发编程的理解。
-
期望回答:volatile关键字用于保证变量的可见性,即一个线程修改变量后,其他线程能立即看到该修改;synchronized用于保证线程同步,同一时间只有一个线程可执行某个方法或代码块。volatile不能保证原子性,synchronized可以。
-
-
问题:请解释Java中的线程池(ExecutorService)的作用,并说明如何创建和使用线程池。
-
考察点:考察候选人对线程池的理解和实际应用能力。
-
期望回答:线程池用于管理和复用线程,避免频繁创建和销毁线程带来的性能开销。可通过Executors类的工厂方法(如Executors.newFixedThreadPool())创建线程池,使用submit()方法提交任务,通过Future对象获取任务执行结果。
-
-
问题:在 Java 中创建线程有哪几种方式?请分别说明它们的实现方法、优缺点及适用场景。
-
考察点:对 Java 多线程基础知识的掌握,对不同线程创建方式的理解深度,对线程池优势的认识
-
期望回答:
-
Java 创建线程的四种主要方式
- 继承 Thread 类
java
class MyThread extends Thread {
public void run() {
// 线程执行逻辑
}
}
// 使用
new MyThread().start();
- 实现 Runnable 接口
java
class MyRunnable implements Runnable {
public void run() {
// 线程执行逻辑
}
}
// 使用
new Thread(new MyRunnable()).start();
- 实现 Callable 接口(带返回值)
java
class MyCallable implements Callable<String> {
public String call() throws Exception {
// 线程执行逻辑
return "结果";
}
}
// 使用
FutureTask<String> futureTask = new FutureTask<>(new MyCallable());
new Thread(futureTask).start();
String result = futureTask.get(); // 获取返回值
- 使用线程池(Executor框架)
java
ExecutorService executor = Executors.newFixedThreadPool(5);
executor.execute(new Runnable() {
public void run() {
// 线程执行逻辑
}
});
// 或者提交Callable任务
Future<String> future = executor.submit(new MyCallable());
Java性能优化
-
问题:请解释Java中的垃圾回收机制(GC),并说明如何通过JVM参数优化垃圾回收性能。
-
考察点:考察候选人对Java虚拟机(JVM)的理解和性能优化能力。
-
期望回答:垃圾回收机制用于自动回收不再使用的对象所占用的内存。可通过设置JVM参数(如-Xms、-Xmx、-XX:MaxPermSize等)调整堆大小和垃圾回收策略,优化垃圾回收性能。
-
-
问题:请解释Java中的内存泄漏问题,并说明如何通过工具(如JProfiler、VisualVM)检测和解决内存泄漏问题。
-
考察点:考察候选人对Java内存泄漏问题的理解和实际解决能力。
-
期望回答:内存泄漏是指程序中已动态分配的内存因某种原因未释放或无法释放,导致程序占用内存不断增加。可通过JProfiler、VisualVM等工具分析内存使用情况,查找未释放的对象引用,通过代码审查和优化解决内存泄漏问题。
-
Spring Cloud/Spring Boot 配置相关考题
问题 1:在 Spring Cloud 与 Spring Boot 应用中,主要有哪些配置方式?请列举并说明其特点。
考察点:考察候选人对 Spring Boot/Spring Cloud 配置体系的理解,以及不同配置方式的应用场景。
期望回答:
Spring Boot/Spring Cloud 主要配置方式包括:
-
默认配置文件:加载 classpath 下的
application.properties或application.yml,用于通用配置。 -
环境特定配置文件:如
application-{profile}.properties(如application-dev.properties),用于不同环境(开发、测试、生产)的差异化配置。 -
命令行参数:启动时通过
java -jar app.jar --server.port=8081直接指定配置,灵活性高。 -
系统环境变量:应用自动读取操作系统的环境变量,如
export SERVER_PORT=8081。 -
外部配置文件:通过
--spring.config.location参数指定本地或网络路径(如file:/config/application.properties)。 -
Config Server(Spring Cloud):分布式配置中心(如 Nacos、Spring Cloud Config),集中管理多环境配置,支持动态刷新。
-
@PropertySource 注解:在配置类中通过
@PropertySource("classpath:custom.properties")加载额外配置文件。
问题 2:请详细说明 Spring Boot 应用中配置文件的加载顺序(优先级从低到高),并解释当不同配置方式存在冲突时的生效规则。
考察点:考察候选人对配置加载优先级的掌握,以及解决配置冲突的实际能力。
期望回答:
Spring Boot 配置加载顺序(优先级由低到高):
-
类路径下的
application.properties/.yml。 -
类路径下的环境特定配置文件(如
application-dev.properties)。 -
测试类中的
@TestPropertySource注解配置。 -
命令行参数(如
--server.port=8081)。 -
系统环境变量(如操作系统的环境变量)。
-
SPRING_APPLICATION_JSON中的 JSON 格式配置(如通过环境变量设置)。 -
Servlet 容器初始化参数(ServletConfig/ServletContext)。
-
JNDI 属性(如
java:comp/env)。 -
Java 系统属性(
System.getProperties())。 -
应用打包外部的配置文件(通过
spring.config.location指定)。 -
@PropertySource注解指定的配置文件。 -
默认属性(通过
SpringApplication.setDefaultProperties设置)。
冲突生效规则:后加载的配置会覆盖先加载的配置。例如,命令行参数优先级高于 application.properties,若两者都设置了 server.port,则以命令行参数为准。
问题 3:在 Spring Cloud 应用中,若同时存在 Nacos 配置、本地 application.yml 配置和命令行参数配置,且三者对同一参数(如 ai.key)的设置不同,最终生效的配置是哪一个?请结合配置优先级说明原因。
考察点:考察候选人对 Spring Cloud 分布式配置优先级的理解,以及实际场景中的配置冲突处理。当多种配置方式中存在相同的配置项时,优先级最高的配置项会最终生效。
期望回答:
最终生效的是 Nacos 配置,优先级从高到低为:
-
远程配置中心(如 Nacos):作为分布式配置中心,其配置在应用启动时最后加载,优先级最高。
-
命令行参数:优先级高于本地配置文件,但低于远程配置。
-
本地配置文件(如 application.yml):本地配置的优先级低于远程配置和命令行参数。
示例:
-
Nacos 配置:
ai.key=nacos-value -
命令行参数:
--ai.key=cmd-value -
application.yml:
ai.key=local-value
最终ai.key的值为nacos-value,因 Nacos 优先级最高。
问题 4:如何验证 Spring Boot 应用中配置的加载顺序?请列举至少两种方法。
考察点:考察候选人对配置加载过程的调试和验证能力。
期望回答:
验证方法:
-
日志输出:启动时添加
--debug参数(如java -jar app.jar --debug),日志会打印配置加载详情。 -
Actuator 端点检查:启用
configprops端点(如访问http://localhost:8080/actuator/configprops),查看最终生效的配置及其来源。 -
代码打印:在应用中通过
Environment.getProperty("参数名")打印配置值,并结合不同配置方式的优先级验证。
k8s问题
-
问题:k8s核心组件有哪些?之间是怎么通信的?master和worker怎么收集信息的?
-
考察点:考察候选人对k8s核心组件及其通信机制的了解。
-
期望回答:master组件包括apiServer、scheduler、ControllerManager;worker组件包括kubelet、kubeproxy,还有etcd。组件间通过API进行通信,master和worker通过kubelet收集信息。
-
-
问题:在k8s中如何实现日志采集?都有哪些方案,最常用的是哪些?
-
考察点:考察候选人对k8s日志采集方案的了解。
-
期望回答:通过EFK(es、fluentd、kibana)实现日志采集,这是常用方案之一。
-
-
问题:部署一个pod,如果该pod未运行起来,有哪几种情况,怎么排查?
-
考察点:考察候选人对k8s中pod部署问题的排查能力。
-
期望回答:可能情况包括镜像问题、资源不足、配置错误等。排查方法有查看pod事件、日志,检查配置等。
-
设计模式
-
问题:有用过设计模式吗,常用的设计模式有哪些,请举例说明。
-
考察点:考察候选人对设计模式的整体把握。请简述23种设计模式的分类。
-
期望回答:23种设计模式分为创建型模式(5种:工厂方法模式、抽象工厂模式、单例模式、建造者模式、原型模式)、结构型模式(7种:适配器模式、装饰器模式、代理模式、桥接模式、外观模式、组合模式、享元模式)、行为型模式(11种:策略模式、模板方法模式、观察者模式、责任链模式、访问者模式、中介者模式、迭代器模式、命令模式、状态模式、备忘录模式、解释器模式)。
-
-
问题:请简述设计模式的六大原则。
-
考察点:考察候选人对设计模式原则的理解。
-
期望回答:
-
开闭原则:对扩展开放,对修改关闭,通过接口或抽象类实现。
-
依赖倒转原则:针对接口编程,依赖抽象而非具体。
-
里氏替换原则:基类出现的地方,子类一定可以出现,是继承与复用的基石。
-
接口隔离原则:使用多个隔离的接口,降低接口间耦合度。
-
迪米特原则:一个类应尽量减少与其他实体相互作用,降低类的耦合,但要权衡避免产生过多中介和传递类。
-
合成复用原则:尽量使用组合/聚合方式,而非继承。
-
-
面试问题:
https://digtime.cn/articles/841/2023-mian-shi-ji-jin
三、其他问题
1、对未来是怎么规划的?
2、可以出差吗?
3、期待薪资
为者常成,行者常至
自由转载-非商用-非衍生-保持署名(创意共享3.0许可证)