【面经】迟来的八战腾讯系列
2025届腾讯移动客户端开发岗 面试经验总结 —— 复试
本文全文使用GPT4进行排版
【组成】:自我介绍+项目介绍+基础知识+算法题
整个面试过程比较离谱,我突发奇想,去外面的星巴克面试。模拟一下被毕业的全栈程序员找工作的感觉,结果面试到一半,因为我的【小米11pro】太热了,导致自动关闭热点,且无法打开...好在后面比较及时地处理了突发情况。
实际上,这篇博客早就应该写了。但是,由于周末偷懒,加上忙于联系导师和准备评奖材料,便一直拖延至今。
自我介绍
在这里,我必须特别提一下,遇到的这位HR真的非常好,是目前唯一一个真正关心我的自我介绍,并针对我做的项目进行提问的人。虽然显然,我准备得不是很充分,有些问题没能清楚地思考。
但截至写这篇博客的周一,我仍然对于项目的许多细节没有准备好,只能说大三的我确实懒了不少。
项目介绍:Flutter 开发实践
- 自定义的NavigationObserver
-
问:你为什么要用Map来存储一个路由结构呢?Flutter实现路由的原理又是什么呢?
答:在Flutter的Navigator 2.0中,通过Page类来表示页面。Page类里只保留页面路由相关信息,通过createRoute()方法来创建对应的Route实例。我们定义了一个LifecycleMixin接口,并通过LifecycleStatelessMixin和LifecycleStatefulMixin两个子类来实现这个接口,分别针对无状态和有状态的Widget进行生命周期的绑定和管理。LifeCycle类混入了WidgetsBindingObserver用于生命周期监测,它通过一个从Route到LifecycleMixin的映射和一个队列来管理页面路由的生命周期。
但实际上,我还是没有完全搞清楚WidgetBinding和element之间的关系,这才是“为什么用Map而不是其他数据结构”的根本原因。—— 立个FLAG,这周学习WidgetBinding。
- CachedImageWidget的实现原理
- 主要是关于图片缓存的处理。CachedImageWidget通过调用flutter_cache_manager库来实现缓存机制。缓存文件默认存储在应用的临时目录中,而文件信息则通过sqflite库在数据库中进行管理。
- 安卓和iOS的本地存储及其实现原理
- 通过Flutter的shared_preferences库进行实现。在安卓平台上,它使用SharedPreferences进行数据存储;而在iOS上,则使用NSUserDefaults。
关于安卓sharedpreferences的学习
基础知识(java)
在面试中,虽然问及了很多基础知识,但这里只记录我不熟悉的部分。
- ClassLoader的线程安全
- 问:ClassLoader是怎么保证线程安全的?
答:ClassLoader在加载类的过程中,通过在loadClass方法中使用synchronized关键字来保证线程安全。
算法题
- 典中典之单例模式
单例模式的实现在面试中是一个经典问题。我之前研究过双重检查锁定(Double-Checked Locking,DCL)机制,并了解到其在多线程环境下可能导致的线程安全问题。
-
问题的根源:Java对象的初始化过程非原子操作,大致可以分为实例化和初始化两个阶段。实例化分配对象内存,初始化则对对象进行具体赋值。由于Java内存模型允许所谓的“重排序”,在没有适当同步措施的情况下,其他线程可能会看到一个还未初始化完成的对象。
-
解决方案:为了避免这种情况,我们使用volatile关键字修饰单例对象的声明。这样,volatile关键字能防止指令重排序,并确保当对象的引用被线程访问时,对象的构造过程已经完全完成,从而保证了单例模式在多线线程环境中的线程安全性。
总结
看起来排版规整多了,但是似乎有些部分的语法和行文少了一丝来自我这种愚蠢大学生的混乱感。总之按照结果来说八面(其实是二面)也过了,明天正式挑战九面!!!