Android 面经总结分享(相当走心)

news2024/11/15 18:57:58

背景描述

这是来自一位粉丝朋友的面经分享,他在 「Android 开发行业」 摸爬滚打5年多的开发,呆过的互联网公司有三家,均从事的Android 开发的工作。最后离职的一家公司也是做的最久的一家,工作了将近3年多时光。

废话不多说了,直接进入主题。👇👇👇

至于离职原因?

其实这个问题一直都不是一个单一性的问题,它是一多元化多维度的问题。对我来说主要是体现在以下几个方面:

  1. 当前所使用的技术对自身成长不是很大;
  2. 当前负责的项目发展空间到达了一定的瓶颈;
  3. 认为自己的职场履历需要有一段大厂经历;(相信每个程序员都想这样在履历上添加这么一笔)
  4. 那就是组织架构频繁变动,导致业务线频繁变更,这一点对业务很不利,需要一直磨合。

面试目标顺序

当时我的面试大厂目标并不是单一的,大家看下图就知道了:

「因为这次面的都是大厂,所以面试的准备周期有点长,准备了2个多月的时间,进行复习学习、刷题等操作。」

面试思路

面试是一个漫长的过程,这个过程不单纯只是面试这么简单,它也是一个 「自我考察」 的过程,在这个过程中也是 「讲究方式方法」。下面我从 「自我考察和方式方法」 两个方面来进行简单的阐述。

自我考察

技术实力是面试的大前提,你需要非常清晰的了解自己,了解自己所要面试岗位,这是决定面试是否成功的先决条件。

比如我工作时间4年多,我要面试的岗位是高级Android工程师,那我这个自身素质是否能满足面试岗位所要求的条件?

其实这一点在我刚刚面试的时候也是拿不准的,因为在公司已经3年,这段时间对外界的发展其实是不了解的,所以我做了以下几件事:

  1. 把自己负责的项目业务进行整体总结。
  2. 把项目中用到的所有技术进行整体总结。
  3. 复习常用 框架/系统 源码,比如Glide,Okhttp,Reteofit,Activity启动流程,Hander,HashMap,锁等等常用的源码原理。
  4. 查看BOSS,拉勾对应岗位所要求的技能。

方式方法

面试环节中即便你技术很好,项目经验很丰富,你也不乏有知识盲区,也有未能顾及的技术点,当这些点集中出现的时候你面试的成功率也会大大降低。所以针对面试我总结了以下几个流程:

「1.面试分为3个阶段(初期,中期,高offer期)。」

「初期」: 主要通过(BOSS,拉勾投递即可),初期主要投递小公司,这部分公司有两个目的。第一是相互交流技术点,不断完善自己的技术覆盖度。第二是了解当前市场的需求点。

「中期」: 主要通过猎头去投递,这个阶段主要投递中场,这类公司要求技术深度会比初期公司要深一些,算法的考察会加重,同时面试官的技术水平也会偏高一些,甚至有的中场面试难度会达到大场的水平,这个中期尽可能的持续长一些,非常有利于后续的面试经验总结。

「高offer期」: 这个阶段主要投递你的目标企业,切记面试优先级从最不意向的公司开始投递。投递的方式也是通过猎头,这样可以加快面试流程。以上的初中期更多的是完善你的技术覆盖度,以及你的面试感。为了是让你以最好的姿态去挑战你最想去的企业,这样一路走来你面试的成功率会大大提高。

**「2.沟通能力」**面试除了考察你的技术实力以外,还有一点是比较重要的,那就是沟通能力,你面试的岗位越高,对你沟通能力的要求也就越高。

沟通是特别重要的一个点,这决定你是否能非常清晰的把你所知所想完整的阐述出来。

我们面试的过程就是自我营销的一个过程,所以当你觉得自己沟通能力不是很强的时候,那么你就需要定向的去总结几个点:

比如一个出色的自我介绍, 项目中遇到的最难解决的一个问题,如果让你设计一个架构你应该怎么设计,简单的介绍一下你负责的业务 等…

**「3.面试频率」**面试周期我建议15-30天。

「初期」:小公司,我建议一天面试3个,如果有精力的话可以4个,这里需要注意一点,小公司有很多不靠谱的,比如还用Eclipse的,比如上来还没问技术就先打击你的,这种可以找机会离开,不要浪费时间。面试时长建议控制在60分钟以内,不要太抠细节。有条件的可以打开录音器,方便结束后晚上复盘。你复盘3-4天的时候你会发现面试内容开始大批量重复了。

「中期」:这个时期我建议一天最多2个公司,因为中场一般都是3轮或者以上的面试,有一部分是一路走完的。所以你需要给二面三面留出时间以方便充分沟通。千万不要一面完就打算走,因为一二三面所考察的完全不同,一面主要是基础,二面主要是框架/源码/简历里的技术,三面一般会聊项目,方案或者思路。

「高offer期」: 这个环节需要你按实际情况伺机而动,因为有的大厂是一条龙面完,有的是每一次面试都单独约,但是大厂一般的流程都比较慢,都在1周以上才能完成整场面试。一般都在4-6面之间。但是建议一天最多安排2场面试,这个面试时长不确定性因素会比较多。如果面试官不是很讨厌你,一般都会在60分钟以上。

面试的基本流程

我先后面试了差不多20几家公司,最后到手的OFFER有8个左右,最后选择的是自己想去的 「阿里」,面试内容我下面会简单总结一些,共分为两部分。一个是面试中出现的频率比较高的问题,二就是面试的这些公司的一些体验分享。

面试高频问题区:

  • HashMap 1.7,1.8的差异,1.8中什么情况下转换为红黑树,构造函数中参数代表的意思
  • 用什么Map可以保证线程安全,为什么?ConcurrentHashMap为什么能保证线程安全?1.7和1.8原理有什么差异。
  • 有多少种单例模式,枚举算不算单例,单例模式中不用volatile会导致什么问题?volatile特性是什么?为什么android中不推荐使用枚举。
  • 进程优先级
  • 反向输出字符串
  • 两个有序链表合并
  • 字符串移除多余空格,且技术单词首字符大写。
  • 二叉树中和为某一值的路径
  • 本地广播和正常广播的区别
  • 二进制低位转高位
  • 字符串数组判重
  • 二叉树 判断是否为搜索二叉树
  • Activity启动流程,Launcher启动流程
  • Glide中怎么实现图片的加载进度条,Glide的缓存是怎么设计的?为什么要用弱引用。
  • implementation 和 api的区别是什么?
  • 事件分发的流程,以及怎么解决滑动冲突?
  • 事件是怎么产生的?mFirstTarget 为什么是一个链表?
  • 自定义View需要经历哪几个过程?
  • A 跳转到 B页面,两个页面的生命周期怎么走?什么情况下A的stop()不会执行。
  • Activity 的4中启动模式分别是什么,有什么不同。
  • okhttp中有几个队列?分别干什么用的?怎么取消一个请求?
  • Rxjava中map和flatMap有什么区别,都用过什么操作符。
  • 如果Rxjava组合发送任务,中间任务出现异常,其他任务该怎么处理。
  • 哪个场景会发生内存泄露,内存泄露怎么检测,怎么解决。以及leak cannery内部原理是什么?为什么新版本的不需要在Application中注册了。
  • 手机适配问题怎么处理,都有什么方案。
  • Android9 10 11 都更新了什么新特性,新版本中无法获取IMEI怎么处理。
  • 数据序列话有那俩种方式,Serialization和Parcelable区别,如果持久化需要用哪一个
  • 组件化怎么分层,各个组件之间怎么通信。
  • 怎防止程序崩溃,如果已经到了Thread.UncaughtExceptionHandler是否可以让程序继续运行。
  • Handler Looper mesaageQueue message 之间的关系。
  • 子线程一定不能更新ui么?什么时候可以?什么时候不可以。检测逻辑是在什么阶段初始化的。
  • ANR发生的原理是什么, 怎么排查。
  • 说下路由ARoute的实现原理,怎么处理页面过多内存占用过大问题。
  • 线程池都什么时候用,怎么创建,构造函数中的参数分别代表什么意思?

公司面试体验分享

「拟合未来」
  • 这公司面试体验很好,一共三轮面试,技术面二面,HR一面。
  • 「一面:」 自定义view、Handler机制、组件化和插件化、HashMap的源码、retrofit和okhttp的源码用到了哪些设计模式、NDK静态库和动态库编译流程、openGL渲染模式、Android中的动画有哪些它们之间的区别、谈谈mvvm。
  • 「二面:」 讲之前做的项目负责哪块,根据业务采用什么架构、使用过哪些设计模式,项目中遇到哪些棘手的问题,如何解决的。
  • 「三面:」 HR整体问下以前公司的情况等问题
  • 总体下来基本面试官都是根据简历来问的。体验心得就是要对自己以前做的项目也好好梳理,提前组织好语言,挖掘项目闪光点。
「百度」
  • 这里主要负责的业务是手机百度开发,总共面试了三次。
  • 「一面内容:」
  1. java引用,以及引用队列,以及使用场景;
  2. 拆装箱
  3. LeakCanary
  4. map
  5. 线上性能监控
  6. SharedPrefrence 遇到的问题
  7. 手写算法
  • 「二面内容:」
  1. Handler
  2. 进程间通信
  3. 序列化
  4. 动画,
  5. native崩溃捕获原理
  6. 结合项目提问
  7. Recyclerview的点击事件原理
  8. 启动一个空的apk,回启动几个线程
  9. 手写算法
  • 「三面内容:」
  1. 跳槽原因
  2. 原来公司规模
  3. 预期薪资
  4. 个人优势
  • 「个人体验心得:」
  1. 简历上写的一定要了解,并且知道原理
  2. 多熟悉项目,找出一些能聊得功能点
  3. 崩溃捕获,以及解决(java ,native)
  4. 优化需要知道(大厂都会问)
  5. 了解由点到面,需要把知识连贯起来
「中软国际」
  • 岗位业务荣耀手机内置APP-主要负责推送,一共两面
  • 「一面:」 问的项目中哪些用到了hook技术,是怎么实现的,Okhttp底层原理,点击应用图标的启动流程,hashmap在java7和java8的区别,为什么要引入红黑树
  • 「二面:」 项目是怎么搭建的,用到了哪些技术点,arouter用到了什么技术点,是用来解决什么问题,socket底层原理,是如何带领团队的,一个功能是如何从分析需求到落地的
  • 「个人体验心得:」 尽量围绕简历上的点来刷面试题,不一定都要研究透彻,被问到自己不熟的点,可以尽量尝试着往自己熟悉点带,例如之前我被问到pms是怎么管理package信息的,我就说目前我对pms了解不深,主要也是研究了ams,然后就把自己了解的说一下就好了。
「杭州红花朵朵(总共三面)」
  • 「一面:」 Fragment和Activity生命周期联动,及Fragment显示与隐藏的一些方法,Handler原理, View绘制流程,事件分发,APP从安装到启动都做了什么,设计模式相关。
  • 「二面:」 线程都有那些状态,线程锁相关的东西,对称与非对称加密,HTTPS请求过程,数组,链表,红黑树二叉树等一些数据结构相关的东西,还有一些开放性的问题
  • 「HR面:」 自由回答
  • 「个人体验:」 基础最重要,不仅要会用,还要知道其中的原理。
「京东到家(总共三面)」
  • 「一面:」 线程,进程,消息,通信,handler,okhttp
  • 「二面:」 事件分发,java一些基础,算法
  • 「三面:」 聊项目
  • 「体验:」 除了技术,沟通,理解能力要好
「apus(总共三面)」
  • 「一面:」 问了java基础,java synchronized和volatile 关键字的作用,问了hashMap数组大小为什么是2的次方,如果经过一次扩容,元素下标会变吗,sharedPreference commit与apply的区别,还有apply为什么会造成anr,view的绘制流程,如何检测应用帧率,gradle的一些知识(没答出来,具体问题忘了)
  • 「二面:」 可能是看我对view的绘制流程比较了解 就主要问了这一块的内容,测量、布局、绘制,然后拿出了一个效果,问我怎么实现
  • 「HR面:」 公司是北京和郑州这边协同办公,经常要和那边协作,如果出了问题,如何解决
  • 「个人感受:」 基础要熟悉,如果一面有哪一个方向回答的好的话,二面就可能深入到那个方向深入的问
「阿里巴巴」
  • 面试的岗位是音视频开发,总共是 3轮技术面+1轮HR面。
  • 「一面内容:」
  1. MediaCodec连环炮:MediaCodec报错,只有错误码,没有任何其它信息,如何解决?使用MediaCodec遇到了哪些问题?同步使用和异步使用有什么区别?
  2. 如何计算音频帧,一帧音频帧有多大
  3. YUV基础知识,相比于RGB减少了多少空间,YUV 各个分量都是0实际渲染出来是什么颜色的,NV21和NV12有什么区别
  4. MP4是如何存储音视频文件的,它是什么结构
  5. OpenSL 相关的问题,如何使用。可以干什么不可以干什么
  6. 结合项目问题
  • 「二面内容:」
  1. SurfaceView和TextureView区别
  2. OpenGL ES相关问题,MVP矩阵左乘和右乘有什么区别,什么是外部纹理,为什么叫外部
  3. OpenGL如何渲染一个View
  4. VBO是用来干嘛的解决什么问题
  5. 结合项目问问题
  • 「三面内容:」
  1. 项目是什么架构,如何设计的,为什么这么设计
  2. 算法题:字符串反转
  3. 平时如何学习的
  • 「个人感受:」 音视频开发感觉OpenGL ES问的比较多,这方面多看看LearnOpenGL这个网站的教程,多加体会。

其实还有几家小型公司的面试,我就不在此一一的说明了,因为文章篇幅长度有限,所以就挑选了几个自己觉得面的还不错的公司进行跟大家分享。庆幸的是等到了自己想要的 「阿里 OFFER」,看了自己前期的2个多月的面试准备没有白费。

推荐分享

他之前在做面试准备的时候,从网上查找收集整理了一些 Android 开发相关的学习文档、面试题、Android 核心笔记等等文档,进行刷题复习 Android 相关的知识,通过这次的面试效果检测,也体验出了结果。这次面试能通过一半原因是自己的技术还过的去,另一半的原因就是吸收了这些学习文档精华。

Android 性能优化篇:https://qr18.cn/FVlo89
Android 车载篇:https://qr18.cn/F05ZCM
Android 逆向安全学习笔记:https://qr18.cn/CQ5TcL
Android Framework底层原理篇:https://qr18.cn/AQpN4J
Android 音视频篇:https://qr18.cn/Ei3VPD
Jetpack全家桶篇(内含Compose):https://qr18.cn/A0gajp
Kotlin 篇:https://qr18.cn/CdjtAF
Gradle 篇:https://qr18.cn/DzrmMB
OkHttp 源码解析笔记:https://qr18.cn/Cw0pBD
Flutter 篇:https://qr18.cn/DIvKma
Android 八大知识体:https://qr18.cn/CyxarU
Android 核心笔记:https://qr21.cn/CaZQLo
Android 往年面试题锦:https://qr18.cn/CKV8OZ
2023年最新Android 面试题集:https://qr18.cn/CgxrRy
Android 车载开发岗位面试习题:https://qr18.cn/FTlyCJ
音视频面试题锦:https://qr18.cn/AcV6Ap

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1080052.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

机器学习 - 似然函数:概念、应用与代码实例

目录 一、概要二、什么是似然函数数学定义似然与概率的区别重要性举例 三、似然函数与概率密度函数似然函数(Likelihood Function)定义例子 概率密度函数(Probability Density Function, PDF)定义 区别与联系 四、最大似然估计&am…

Haskell网络编程:从数据采集到图片分析

概述 爬虫技术在当今信息时代中发挥着关键作用,用于从互联网上获取数据并进行分析。本文将介绍如何使用Haskell进行网络编程,从数据采集到图片分析,为你提供一个清晰的指南。我们将探讨如何使用亿牛云爬虫代理来确保高效、可靠的数据获取&am…

写爬虫?前端er何必用python

前言 说起网络爬虫,很多人第一时间想到python,但爬虫并非只能用python实现,虽然网上大部分爬虫文章都在说python爬虫,但对于前端程序员来说,我觉得js才是最屌的(对于简单爬取任务来说,复杂的我暂时没碰到~),下面说说我的经验(是的,仅限本人经验),希望能给各位前…

Qt 常用控件按钮Button 案例分析

目录 常用控件按钮 1.QPushButton 2.QToolButton 3.QRadioButton 4.QCheckBox 5.QCommandLinkButton 6.QDialogButtonBox 常用控件按钮 Push Button: 命令按钮。 Tool Button:工具按钮。 Radio Button:单选按钮。 Check Box: 复选框按钮 Command Link Button: 命今链…

2023年中国自动化微生物样本处理系统竞争现状及行业市场规模分析[图]

微生物检测能够对感染性疾病的病原体或者代谢物进行检测分析,是IVD的细分领域之一。2022年中国体外诊断市场规模1424亿元。 2015-2022年中国体外诊断市场规模 资料来源:共研产业咨询(共研网) 微生物检测由于样本类型多样&#xf…

HttpServletResponse对象

1.介绍 在Servlet API中,定义了一个HttpServletResponse接口,它继承自ServletResponse接口,专门用来封装HTTP响应消息。由于HTTP响应消息分为状态行、响应消息头、消息体三部分,因此,在HttpServletResponse接口中定义…

Netty RPC 实现

1 概念 RPC,即 Remote Procedure Call(远程过程调用),调用远程计算机上的服务,就像调用本地服务一样。RPC 可以很好的解耦系统,如 WebService 就是一种基于 Http 协议的 RPC。这个 RPC 整体框架如下&#…

优盘中毒了怎么办?资料如何恢复

在现代社会中,优盘成为我们日常生活与工作中必备的便携式存储设备。然而,正是由于其便携性,优盘也成为病毒感染的主要目标之一。本篇文章将帮助读者了解如何应对优盘中毒的情况,以及如何恢复因病毒感染丢失的资料。 ▶优盘为什么…

【Java】 DirectByteBuffer堆外内存回收

PhantomReference虚引用 在分析堆外内存回收之前,先了解下PhantomReference虚引用。 PhantomReference需要与ReferenceQueue引用队列结合使用,在GC进行垃圾回收的时候,如果发现一个对象只有虚引用在引用它,则认为该对象需要被回…

nvm的简介、安装、使用(简单明了)

一、nvm是什么? nvm是一个node的版本管理工具,可以简单操作node版本的切换、安装、查看。。。等等,与npm不同的是,npm是依赖包的管理工具。 二、nvm的安装。 1、windows包下载地址: 2、点击如下文件进行安装&#…

配置接口策略路由

【微|信|公|众|号:厦门微思网络】 【微思网络www.xmws.cn,成立于2002年,专业培训21年,思科、华为、红帽、ORACLE、VMware等厂商认证及考试,以及其他认证PMP、CISP、ITIL等】 组网需求 如图1所示,缺省情况下…

【TensorFlow2 之013】TensorFlow-Lite

一、说明 在这篇文章中,我们将展示如何构建计算机视觉模型并准备将其部署在移动和嵌入式设备上。有了这些知识,您就可以真正将脚本部署到日常使用或移动应用程序中。 教程概述: 介绍在 TensorFlow 中构建模型将模型转换为 TensorFlow Lite训练…

第九章-线程

初始时,CPU的执行流为进程;当产生了线程概念后,CPU执行流变为了线程,大大增大了一个周期以内进程的执行速度。 线程产生的作用就是为了提速,利用线程提速,原理就是实现多个执行流的伪并行,让处…

vue3前端开发系列 - electron开发桌面程序(2023-10月最新版)

文章目录 1. 说明2. 创建项目3. 创建文件夹electron3.1 编写脚本electron.js3.2 编写脚本proload.js 4. 修改package.json4.1 删除type4.2 修改scripts4.3 完整的配置如下 5. 修改App.vue6. 修改vite.config.ts7. 启动8. 打包安装9. 项目公开地址 1. 说明 本次安装使用的环境版…

提取log文件中的数据,画图

要提取的log格式如下: 代码如下: import reimport matplotlib.pyplot as plt import numpy as npimport argparse from os import path from re import searchclass DataExtractor(object): DataExtrator class def __init__(self, infile, keyword, out…

电脑上播放4K视频需要具备哪些条件?

在电视上播放 4K( 4096 2160 像素)视频是很简单的,但在电脑设备上播放 4K 视频并不容易。相反,它们有自己必须满足的硬件要求。 如果不满足要求,在电脑上打开 4K 分辨率文件或大型视频文件会导致卡顿、音频滞后以及更…

ROS中的命名空间

ROS中的节点、参数、话题和服务统称为计算图源,其命名方式采用灵活的分层结构,便于在复杂的系统中集成和复用。以下是一些命名的示例: /foo /stanford/robot/name /wg/node1计算图源命名是ROS封装的一种重要机制。每个资源都定义在一个命名空…

微信小程序wxml使用过滤器

微信小程序wxml使用过滤器 1. 新建wxs2. 引用和使用 如何在微信小程序wxml使用过滤器? 犹如Angular使用pipe管道这样子方便,用的最多就是时间格式化。 下面是实现时间格式化的方法和步骤: 1. 新建wxs 插入代码: /*** 管道过滤工…

泡泡玛特,难成“迪士尼”

作者 | 艺馨 豆乳拿铁 排版 | Cathy 监制 | Yoda 出品 | 不二研究 新增长难寻,新故事难讲。泡泡玛特(06682.HK)业绩增长承压的困局,都写在最新的半年报里。 曾经潮玩领域的王者、“潮玩第一股”泡泡玛特,主题城市乐园于9月26日在北京朝阳…

centos下安装配置redis7

1、找个目录下载安装包 sudo wget https://download.redis.io/release/redis-7.0.0.tar.gz 2、将tar.gz包解压至指定目录下 sudo mkdir /home/redis sudo tar -zxvf redis-7.0.0.tar.gz -C /home/redis 3、安装gcc-c yum install gcc-c 4、切换到redis-7.0.0目录下 5、修改…