小鹏/美团/支付宝安卓面试记录

小鹏/美团/支付宝安卓面试记录
最新回答
往事如风

2021-07-29 01:48:04

面试问题总结与解答小鹏面试问题
  • 一个线程中执行的任务如何确保顺序执行

    使用同步机制:通过synchronized关键字或ReentrantLock确保任务按顺序获取锁,避免并发执行。

    单线程执行器:利用ExecutorService的SingleThreadExecutor,所有任务由单一线程串行处理。

    任务队列:将任务按顺序加入队列(如BlockingQueue),线程从队列头部依次取出执行。

  • Binder无参调用如何知道Client是谁

    Binder线程池与线程跟踪:Binder驱动为每个Client连接分配唯一线程,Server端通过Binder.getCallingUid()或Binder.getCallingPid()获取调用方身份。

    Token机制:Client在调用前传递唯一Token,Server端通过Token反向查询Client信息。

  • ANR是如何分析的

    日志分析:通过traces.txt文件定位主线程阻塞位置,结合logcat中的ANR日志(如Input dispatching timed out)。

    工具辅助:使用Android Studio的Profiler或systrace监控主线程耗时操作,或通过adb pull /data/anr/traces.txt提取日志。

  • 中教云API设计:访问所有指定类型文件

    统一接口设计:定义通用接口(如List<File> getAllFilesByType(String type)),内部通过文件扩展名或MIME类型过滤。

    文件扫描策略:递归遍历目录,使用File.listFiles()结合过滤器(FilenameFilter)筛选目标文件。

  • TCP三次握手与四次挥手

    三次握手

    Client发送SYN包(seq=x)到Server。

    Server回复SYN+ACK包(seq=y, ack=x+1)。

    Client发送ACK包(ack=y+1),连接建立。

    四次挥手

    Client发送FIN包(seq=u),进入FIN_WAIT1状态。

    Server回复ACK包(ack=u+1),进入CLOSE_WAIT状态。

    Server发送FIN包(seq=v),进入LAST_ACK状态。

    Client回复ACK包(ack=v+1),连接终止。

  • 线程死锁

    死锁条件:互斥、占有并等待、非抢占、循环等待。

    预防方法:按固定顺序获取锁、使用tryLock超时机制、避免嵌套锁。

  • 实现O(1)复杂度的LRU

    哈希表+双向链表:哈希表存储键值对,双向链表维护访问顺序。访问时移动节点至头部,淘汰时直接删除尾部节点。

  • DNS解析域名访问网站过程

    浏览器查询本地DNS缓存,未命中则向配置的DNS服务器(如ISP的DNS)发起递归查询。

    DNS服务器查询根域名服务器,获取顶级域(如.com)的NS记录。

    继续查询顶级域服务器,获取权威域名服务器(如example.com的NS记录)。

    权威服务器返回域名对应的IP地址,浏览器发起HTTP请求。

美团外卖面试问题
  • 进程与线程的区别

    资源分配:进程是资源分配的基本单位,线程共享进程资源(如内存、文件句柄)。

    切换开销:进程切换需保存完整上下文,线程切换开销更小。

    通信方式:进程间通信(IPC)需通过内核(如管道、Socket),线程间可直接共享内存。

  • 死锁的概念与预防

    概念:多个线程因竞争资源陷入无限等待状态。

    预防方法:破坏死锁条件(如资源有序分配、超时释放)。

  • onNewIntent调用时机

    SingleTop模式:Activity位于栈顶时,重复启动不会创建新实例,直接调用onNewIntent()。

    SingleTask模式:Activity存在于栈中时,系统将其移至栈顶并调用onNewIntent(),清除其上所有Activity。

  • RecyclerView区分Header和Footer

    自定义ItemType:在onCreateViewHolder中根据viewType返回不同ViewHolder(如TYPE_HEADER=0、TYPE_ITEM=1)。

    布局分离:通过getItemViewType(position)判断位置,加载对应布局文件。

  • 跨进程通信方式

    Binder:Android原生IPC机制,基于C/S架构。

    Socket:支持跨网络通信,但性能较低。

    ContentProvider:用于数据共享(如联系人、媒体库)。

    Broadcast:通过Intent发送广播,需注意权限控制。

  • HashMap底层原理与线程安全

    原理:数组+链表(Java 8后引入红黑树),通过hash(key)%length定位桶位置。

    不安全原因:多线程扩容时可能导致链表成环(如Java 7的transfer方法)。

    线程安全方案:使用ConcurrentHashMap(分段锁或CAS+synchronized)或Collections.synchronizedMap。

支付宝面试问题
  • HTTP与HTTPS区别

    安全性:HTTPS通过SSL/TLS加密数据,防止中间人攻击。

    端口:HTTP默认80,HTTPS默认443。

    证书:HTTPS需CA签发的数字证书验证服务器身份。

  • 安卓安全机制

    权限系统:声明式权限(AndroidManifest.xml)与运行时权限(Android 6.0+)。

    沙箱机制:每个应用运行在独立Dalvik/ART实例中,数据隔离。

    代码签名:APK必须使用开发者证书签名,确保代码完整性。

  • ART虚拟机

    AOT编译:安装时将DEX字节码编译为本地机器码,提升运行效率。

    垃圾回收优化:采用并发标记-清除算法,减少STW(Stop-The-World)时间。

  • 安卓启动流程

    BootLoader阶段:加载内核和初始化硬件。

    Kernel阶段:启动内核,挂载根文件系统。

    Init阶段:解析init.rc脚本,启动Zygote进程。

    Zygote阶段:预加载类与资源,孵化SystemServer进程。

    SystemServer阶段:启动Binder线程池、PackageManagerService等核心服务。

  • Linux启动模型

    SysVinit:基于脚本的串行启动,通过/etc/inittab定义运行级别。

    Systemd:并行启动服务,依赖关系通过单元文件(.service)定义。

  • 网络安全性与密钥验证

    TLS握手:通过数字证书验证服务器身份,使用非对称加密交换对称密钥。

    证书链验证:客户端验证证书是否由受信任CA签发,且未过期或吊销。

  • OSI七层模型

    物理层:传输比特流(如以太网、WiFi)。

    数据链路层:封装成帧(如MAC地址、交换机)。

    网络层:路由选择(如IP协议、路由器)。

    传输层:端到端通信(如TCP/UDP)。

    会话层:建立/管理会话(如RPC、NetBIOS)。

    表示层:数据格式转换(如加密、压缩)。

    应用层:用户接口(如HTTP、FTP)。

  • Socket位置

    传输层:Socket是应用层与传输层之间的接口,封装了TCP/UDP协议细节。

  • 内存溢出(OOM)

    原因:申请内存超过系统限制(如堆内存溢出、栈溢出)。

    解决方案:优化数据结构、使用内存缓存(如LruCache)、增加堆大小(-Xmx)。

  • 热修复方案

    代码热修复

    类加载方案:如Tinker通过替换Dex文件实现(需兼容不同Android版本)。

    Instant Run:Android Studio工具,通过增量编译快速部署。

    资源热修复:通过AssetManager动态加载补丁资源文件。