- 0
- 0
- 约3.82千字
- 约 11页
- 2026-02-14 发布于福建
- 举报
第PAGE页共NUMPAGES页
2026年面试题及答案:工程师面试题
一、编程语言基础(3题,每题10分,共30分)
1.题目:
请解释Java中的`volatile`关键字的作用,并说明它与`synchronized`关键字的主要区别。
答案:
`volatile`关键字在Java中用于确保变量的可见性和有序性,但不保证原子性。具体作用如下:
-可见性:当一个线程修改了volatile变量的值,其他线程能够立即看到这个变化,因为volatile变量会强制刷新缓存。
-有序性:volatile关键字可以防止指令重排序,确保代码的执行顺序与程序代码顺序一致。
与`synchronized`关键字的主要区别:
-性能:`volatile`仅作用于变量,开销较小;`synchronized`是重量级锁,涉及锁状态和线程切换,性能开销更大。
-原子性:`volatile`不保证复合操作的原子性(如`i++`);`synchronized`可以保证复合操作的原子性。
-适用场景:`volatile`适用于读多写少的场景;`synchronized`适用于写操作频繁的场景。
解析:
`volatile`通过内存屏障(MemoryBarrier)实现可见性和有序性,但不会阻塞线程。`synchronized`通过锁机制实现同步,会阻塞线程。在Java内存模型(JMM)中,`volatile`属于轻量级同步,而`synchronized`属于重量级同步。
2.题目:
请写出Python代码,实现一个线程安全的计数器,要求每次调用`increment()`方法时,计数器加1。
答案:
使用`threading.Lock`实现线程安全计数器:
python
importthreading
classThreadSafeCounter:
def__init__(self):
self.value=0
self.lock=threading.Lock()
defincrement(self):
withself.lock:
self.value+=1
returnself.value
解析:
通过`Lock`对象控制线程访问共享资源,确保每次只有一个线程能修改`value`。使用`with`语句自动释放锁,避免死锁。
3.题目:
请解释C++中智能指针的作用,并说明`std::unique_ptr`与`std::shared_ptr`的区别。
答案:
智能指针是C++11引入的RAII(ResourceAcquisitionIsInitialization)对象,用于自动管理动态内存,避免内存泄漏。主要类型:
-`std::unique_ptr`:独占所有权,只能被一个指针管理,不支持复制,但可以移动。
-`std::shared_ptr`:共享所有权,多个指针可以指向同一对象,通过引用计数管理生命周期。
区别:
-所有权模型:`unique_ptr`独占,`shared_ptr`共享。
-性能:`unique_ptr`开销小;`shared_ptr`因引用计数会有额外内存和性能开销。
-使用场景:`unique_ptr`适用于单对象管理;`shared_ptr`适用于多个对象共享同一资源。
解析:
智能指针通过构造函数自动分配内存,析构函数自动释放内存,避免手动`delete`。`unique_ptr`适用于单向资源管理,`shared_ptr`适用于多向资源管理。
二、数据结构与算法(4题,每题12分,共48分)
1.题目:
请解释快速排序(QuickSort)的基本原理,并说明其时间复杂度。
答案:
快速排序的基本原理:
1.选择一个基准值(pivot),通常选择最后一个元素。
2.将数组分区,小于基准值的放左边,大于基准值的放右边。
3.递归对左右子数组进行排序。
时间复杂度:
-最好/平均:O(nlogn),随机选择基准值可避免最坏情况。
-最坏:O(n2),基准值选择不均匀(如已排序数组选择尾元素)。
解析:
快速排序是分治算法,核心是分区操作。实际应用中常通过随机化基准值优化性能。
2.题目:
请实现一个二叉树的层序遍历(BFS)算法,要求返回遍历结果列表。
答案:
Python代码实现:
python
fromcollectionsimportdeque
classTreeNode:
def__init__(self,val=0,left=None,right=None):
self.val=val
self.left=left
self.right=right
deflevel_order(root):
if
原创力文档

文档评论(0)