前言

今天分享的是一位5年工作经验的Android工程师在帝都的面试经验总结,看看这些互联网公司都爱问些什么题,希望对大家的面试有指导意义。

从事Android开发也有5年经验了,6月初自己的开启面试经历之旅,前后应该20天左右,主面互联网公司,一二线大公司或者是融资中的创业公司都面试过,也拿了几个offer,其中包括奇虎360、字节跳动等。

阿里巴巴面试整理

  • 重载函数的签名(区别是否是重载函数)
  • finalize的工作原理
  • 一个对象的创建过程
  • 对象的销毁是按照创建的逆序来进行的
  • final的方法和类都不允许覆盖和继承。private默认实现了final。
  • 简述jvm中默认的classLoader与功能
  • 简述内部类的特点
  • 如何终止一个线程
  • null可以被强制类型转换成任意类型的对象,于是通过它来执行静态方法
  • 解释一下java内存模型
  • 解释一下volatile字段
  • 广播的两种注册方法,有什么区别
  • Intent可以传递哪些数据类型

腾讯面试整理

  • HashMap 和 HashTable 以及 CurrentHashMap 的区 别。
  • Java 的四大引用
  • Jvm 内存区域是如何划分的?
  • Jvm 内存模型是怎么样的?
  • TCP 与 UDP 的区别。
  • 三次握手、四次挥手。为啥是三次不是两次?
  • 什么是 ANR 如何避免它?
  • Activity 和 Fragment 生命周期有哪些?
  • Android 怎么加速启动 Activity?
  • 程序 A 能否接收到程序 B 的广播?
  • 数据加载更多涉及到分页,你是怎么实现的?
  • 通过 google 提供的 Gson 解析 json 时,定义 JavaBean 的规则是什么?
  • 安卓的安全优化

字节跳动面试整理

  • HTTP1.0 和 HTTP1.1 的一些区别
  • 断点续传实现?
  • 你们做了哪些稳定性方面的优化?
  • 版本迭代导致的启动变慢有好的解决方式吗?
  • 布局为什么会导致卡顿,你又是如何优化的?
  • 安卓的混淆原理是什么?
  • Kotlin 为什么能和 Java 混编
  • JS 的交互理解吗?平时工作用的多吗,项目中是怎么与 Web 交互的?
  • Gradle 了解多少?groovy 语法会吗?
  • flutter 了解吗?内部是如何实现跨平台的?如何实现多 Native 页面接入?如何实现对现有工程的 flutter 迁移?
  • 快应用了解吗?跟其她方式相比有什么优缺点?
  • 说说你用过的混合开发技术有哪些?各有什么优缺点?
  • 对文件描述符怎么理解?
  • 如何实现进程安全写文件?

架构方面整理

  • EventBus、AOP面向切面编程原理、饿了么Hermes跨进程架构原理、Message、QQ换肤、阿里ARouter、RxJava

    NDK方面整理

  • 指针、MakeFile编译so库、阿里andfix热修复原理、编译FFmpeg集成到AS中

    算法方面整理

  • Hash值、HashMap、最小生成树算法、KMP算法、查找算法、排序算法

    UI方面整理

  • BAT屏幕适配、刘海屏开发和适配、UI绘制流程和原理、事件传递机制
    由于篇幅有限,上面只展示了一部分面试题,其答案还有其他就不一一展示了,实在有需要的同学可以

总结

Android学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的技术,还要深入底层,弄明白下面的原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。

如果大家有觉得自己学习效率低,缺乏正确的指导的,可以参考下下面分享我收集整理的学习路线,给大家做个参考:

1、确定好方向,梳理成长路线图

不用多说,相信大家都有一个共识:无论什么行业,最牛逼的人肯定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让自己站的更高,成为技术大牛并不是一朝一夕的事情,需要时间的沉淀和技术的积累。

关于这一点,在我当时确立好Android方向时,就已经开始梳理自己的成长路线了,包括技术要怎么系统地去学习,都列得非常详细。

知识梳理完之后,就需要进行查漏补缺,所以针对这些知识点,我手头上也准备了不少的电子书和笔记,这些笔记将各个知识点进行了完美的总结。

我自己的话有做一个思维导图,看起来可能更直观,实在想要的同学可以+我w:X1524478394 来拿,还有我对于面试题的一些参考答案也可以分享给大家。

2、看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

3、通过源码来系统性地学习

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

4、简历准备充分

可以去知乎上面搜搜别人写的有关简历的帖子,怎么准备,吸引hr, 突出自己的优点和能力,或者让朋友帮你看看简历有没有问题,比如过于简单或者浮夸,没有重点等。

尽量把你的亮点总结成一句简练的话,再加上数字来说明它的影响和意义。

其次在简历里中加入了可交互、可展示的内容,更能显出你的能力与众不同。

5、刷题备战,直通大厂

面试的前一周时间内,就可以开始刷题冲刺了,请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

6、面试题及答案解析

第一章 Java基础

  • 静态内部类和非静态内部类的比较
  • 多态的理解与应用
  • java方法的多态性理解
  • java中接口和继承的区别
  • 线程池的好处,详解,单例(绝对好记)
  • 线程池的优点及其原理
  • 线程池的优点(重点)
  • 为什么不推荐通过Executors直接创建线程池
  • 不怕难之BlockingQueue及其实现
  • 深入理解ReentrantLock与Condition
  • Java多线程:线程间通信之Lock
  • Synchronized 关键字原理
  • ReentrantLock原理
  • HashMap中的Hash冲突解决和扩容机制
  • JVM常见面试题
  • JVM内存结构

第二章 Android基础

  • Activity知识点(必问)
  • Fragment知识点
  • Service知识点
  • Intent知识点

第三章 UI控件篇

  • 屏幕适配
  • 主要控件优化
  • 事件分发与嵌套滚动

第四章 网络通信篇

  • 网络协议

第五章 架构设计篇

  • MVP架构设计
  • 组件化架构

第六章 性能优化篇

  • 启动优化
  • 内存优化
  • 绘制优化
  • 安装包优化

第七章 源码流程篇

  • 开源库源码分析
  • Glide源码分析
  • Android面试题:Glide
  • day 20 面试题:Glide面试题
  • 聊一聊关于Glide在面试中的那些事
  • 面试官:简历上如果写Glide,请注意以下几点…
  • Glide OOM问题解决方法汇总
  • OkHttp源码分析
  • Okhttp连接池复用机制
  • Okhttp 流程和优化的实现
  • 一篇让你受用的okhttp分析
  • OkHttp面试之–OkHttp的整个异步请求流
  • OkHttp面试之–HttpEngine中的sendRequest方法详解
  • OkHttp解析大总结
  • Okhttp任务队列工作原理
  • Android高频面试专题 - 架构篇(二)okhttp面试必知必会
  • Android 网络优化,使用 HTTPDNS优化 DNS,从原理到 OkHttp 集成
  • Retrofit源码分析
  • RxJava源码分析
  • RxJava原理与源码分析

第八章 新技术篇

  • 实战问题篇

第九章 面试篇

  • 开源文档
  • 面试题合集

03-05 23:28