概述

感觉毕业后时间过得真快啊,从 19 年 7 月本科毕业入职后,到现在快两年了,前段时间金三银四期间想着找一个新的工作,前前后后花了一个多月的时间复习以及面试,面试好几家大厂,最后选择了腾讯。也祝各位想找工作的同学都能去自己心仪的公司!

我不建议频繁的跳槽,除非被逼无奈,频发跳槽,不光会成为面试官害怕的一个方面,对自己的沉淀也是没有帮助的。

同时我不建议裸辞,这样会存在太多的不定性因素,如果面试时间拖得太久,这段事件你没有经济收入,但是你还在支出(房租,日常生活开销)。这样会代来无形的压力,同时如果面试受挫,很容易失去信心,甚至怀疑自己的能力。

但是离职也有他的好处,因为,有些公司可能项目非常急,需要迅速上岗,那么你离职的交接办理也会耽误一些时间,那么也会成为面试官考虑的一个因素。所以还是要结合自己的情况而定。

一面(1h)

  • 自我介绍
  • 问项目的一些细节,优化方案等
  • SurfaceView, TextureView及View的区别。SurfaceView怎么控制它处于的层级
  • Binder工作流程
  • 介绍一下MVC,MVP,MVVM,你们项目用的是哪个?
  • 对组件化的理解,你们是怎么实现组件化的?功能模块之间互相引用会有什么问题?
  • 内存优化工具,LeakCanary和MAT的原理
  • JVM内存模型
  • Java同步机制有哪些,volatile和syncronized区别
  • HashMap和HashTable区别,ConcurrentHashMap分段加锁的原理
  • 二叉树的前中后遍历
  • 算法:判断一棵树是否是平衡二叉树
  • 算法题:给定一个链表L1、L2,每个元素是为10以内的正整数,链表表示一个数字,表头为高位。 求两个链表之差,以链表形式返回
  • Java和Kotlin的一些区别,Kotlin的缺点?
  • SurfaceView和TextureView的区别?
  • 了解过哪些插件化的实现?
  • 说说ARouter的原理
  • 两个业务组件模块之间,怎么实现相互调用接口?
  • 让你设计一个下载功能,实现多个大文件同时下载,考虑哪些(断点续传)?
  • 有没有音视频开发经验?
  • 怎么处理内存泄漏?强引用弱引用?LeakCanary原理说一下。

二面(1h)

  • 问更熟悉Java还是Kotlin,答Java,所以问的都是Java相关的一些题
  • HashMap扩容机制
  • Java volatile原理和作用
  • 乐观锁,悲观锁区别
  • 线程池工作原理,各个参数的作用
  • Android 三缓存是什么?为什么需要它
  • 讲讲做的业务开发中比较有挑战的项目
  • 还有一些比较常规的Android方面的问题,具体想不起来了
  • 算法题:查找单链表中倒数第k个节点。做完后面试官问是不是刷过这道题,那我再出一道吧...
  • 题:给定一台8核的手机,设计一个快速检索出sdcard下所有文件名为a的程序,返回一个列表

三面(1.5h)

  • 主要深挖项目细节,有些不太清楚的最好别提,不然被挖到了很尴尬
  • 平时怎么学习技术
  • 在之前的公司,你对自己的成长满意吗
  • 在面哪些公司,情况怎么样

面试总结

毕业时选择的是一家非一线大厂的公司,在这边工作的近两年时间里,业余学习了许多 Android 相关的专业知识(因为不忙),但是由于业务原因,且公司发展一直在走下坡路,我在项目上的经验比较欠缺,因此考虑进一家大厂继续磨练磨练自己。

我面试的不是很多,但是也让我知道,自己的不足,知道自己在数据结构与算法这方面很弱,同时开发中的问题总结,java基础与高级知识不足,源码阅读不够深入,掌握的知识很虚,没有理解到重点,框架用的多但是只停留在会使用的阶段。网络相关知识薄弱。后台开发流程与知识薄弱(所有的逻辑与难点其实都在后台,同时了解后台也有助于Android开发与接口调试协作)。这些都是我以后的学习方向。

高频知识点总结

知识点有腾讯遇到的,也有其他公司面试遇到的,我都做了一个整理。需要特别注意的是这并不是全部的知识体系,仅仅是笔者遇到的面试题,读者可以按照大体的方向去学习,但切不可认为这样就足够了,这里提到的知识点是远远不够的。

面试的过程中更多的时候不会单纯地考察知识点,而是会结合一些需求或者业务场景来多方面考察对知识点的理解。因此笔者建议,对于知识点要以理解为首要任务,而不是背诵答案。

面试的过程中更多的时候不会单纯地考察知识点,而是会结合一些需求或者业务场景来多方面考察对知识点的理解。因此笔者建议,对于知识点要以理解为首要任务,而不是背诵答案。

Android

1.Activity

1.Activity启动流程。其中考察最多的类似问题是:【从桌面点击一个图标之后,到界面显示,这个过程发生了什么?】。很多时候面试官会结合activity生命周期来考问:在启动流程的哪些阶段哪些生命周期被回调,此时Activity状态如何。

2.启动模式。也就是常见的四种启动模式,但面试官更喜欢问何时使用他们,也就是使用场景。

3.生命周期。这个很少单独问,一般和启动流程或者具体的业务场景结合考问。

4.context。主要是内存泄露的考察以及application和activity两种context如何选择。

2.Handler

1.内部原理。Handler必会的啊,android的消息机制,可以称为android程序的引擎来的。

2.同步屏障。涉及到绘制优化、屏幕刷新机制等。

3.阻塞唤醒原理。这里一般是会问为何loop()方法是死循环却不会占用cpu时间片 or 为何next()方法阻塞却不会卡死。更深一点会问到Linux的IO多路复用epoll原理。

4.卡顿与内存优化。整个主线程的所有任务都必须经过Looper,是排查卡顿和ANR的关键点,以及消息太多会造成的后果等。

5.消息复用。

3.图片

1.计算一张图片大小。分辨率x像素点大小,考察得很多次。

2.加载优化。如LaunchActivity同时加载的图片太多如何优化、view的大小比图片小如何优化等。

3.缓存优化。内存缓存、硬盘缓存。

4.Glide框架。重点就是Glide对上面的优化的实现原理,因此需要着重看Glide的缓存原理。

5.drawable。对比使用图片和drawable的好处,以及drawable的原理。

4.SharePreference

  • 内部原理
  • commit和apply的区别
  • 这部分考察得不多,但建议读者可以深入理解sp的缺点,如导致ANR原理,以及新框架MMKV、Data Store的优点。

5.window

考察得非常少,主要window的类型、以及window的真正定义理解即可。

6.view

  • 事件分发流程。考察得最多,基本把整个分发流程讲清楚就好了;其次还会考察如何解决具体的冲突场景。
  • 应用界面的view层级。
  • 绘制流程与时机。activity启动时到onResume方法被调用,view依旧还未被绘制。

7.IPC

  • 常见IPC类型以及优缺点。
  • Binder机制。优点、缺点、特点、和传统IPC比较。Binder涉及到的很多是偏底层,更多的时候考察的是上层的应用,如和socket比较等。
  • socket。这个会重点问,涉及优缺点、使用场景、和binder相比等。

8.序列化

serializable和parcelable的原理,以及各自的优缺点、应用场景。

9.jetpack

  • 使用jetpack的好处与坏处。
  • 框架原理。这部分如果写在简历也很少问,看面试官;但如果问的话,一般会问原理。

10.okHttp

  • 拦截器以及责任链思想。这个是问的最多的。
  • 内部调度器对线程、任务数的并发控制。
  • 优点缺点,和URLConnection相比的好处,诞生的背景等。

11.优化

  • 性能优化。问得很多,主要看自己平时有没有做过优化。
  • 卡顿优化。一般询问如何定位和解决卡顿问题。
  • 内存优化。一般是内存泄露、或者减少内存占用等。
  • ANR。一般会考察原理以及如何解决。
  • 工具:leakcanary、profiler。优化涉及的内容太多,这个属于比较深的内容,还是得看自己平时的项目积累。

Java

Java的考察是一个非常考验功底的地方,很多的知识点都是基础中的基础,同时又都可以延伸到底层的逻辑。这些知识点在实际的运用中,也有很多的情况需要考虑,考察我们对于知识点的运用。例如线程池,可以从参数作用、到线程池原理、到阻塞唤醒机制、到实际项目的参数配置,有非常多的知识点可以考察。因而这一块就看各位的造诣了。

当然,一些基础或者常考的知识点还是得会的。

1.集合框架

  • HashMap。几乎每家公司都问,主要是内部原理如hash算法、冲突解决方案、扩容方案、红黑树的优缺点等。必会的内容,不会就直接当场去世了。
  • HashSet。内部使用HashMap来实现,value设置为object。记住这个就好了。
  • ConcurrentHashMap。必问。他的并发原理以及好处,同时有些面试官也会问缺点等问题。
  • Hashtable、SychronizeMap。一般和ConcurrentHashMap一起问,进行对比。
  • CopyOnWriteArrayList。一般会作为线程安全方法来进行比较优缺点。
  • 集合框架重点还是在Map,但是其他的框架List和queue的原理也是要了解的。

2.访问限制符

public protect default private 四个要懂,基础知识了。(笔者就是忽略了这些当时回答错了)特别注意protect是可以跨包访问的。

3.类

  • 4种内部类,特别注意每个class编译后都会产生一个class文件,不管静态或非静态。面试踩坑了

    lambda的本质。就是匿名内部类。
  • 抽象类和接口的区别。这个很看理解,如果有开发过具体项目的会回答得更加深刻,这是背八股文体现不出来的。

4.异常

异常体系、分类、机制。

与error的区别。

5.IO

主要还是问NIO的原理以及优缺点。建议把缓冲流的原理也得学一学并进行比较。

6.线程池

  • 内部原理。必会的啊。
  • 关键参数作用及如何配置。重点在如何配置,需要结合具体的机器情况、任务情况等等考量。
  • 线程池的作用。不仅仅只是线程复用,更重要的是管理线程、控制线程数量。这个也比较考察具体的项目运用理解。
  • 常见的四种线程池。

7.并发

  • sychronize。必问,java的锁机制。特别是jdk6之后的锁优化以及运用场景。为什么是重量级的、JVM层如何实现如果了解可以加分。
  • Lock。必问,AQS的原理最好懂。一般会拿来和synchronize比较。
  • volatile。必问,会拿来和锁比较,他的两个重要作用。更深点会问到cpu缓存一致性协议、以及指令重排的类型与原理。
  • CAS。必问,问原理以及ABA问题。
  • 死锁。一般询问如何解决或者产生的条件。
  • Object的wait和notify。阻塞唤醒,一般会用一个代码或者具体的场景来询问如何保证多线程同步。
  • ThreadLocal。原理、内存泄露等

    这一块问的还是比较多,而且大都可以深入去问,看自己的学习程度了。

8.JVM

  • GC机制。必问。
  • 类加载机制。必问,同时还会问双亲委托机制。
  • 方法调用过程。这个也问的挺多,也看对JVM的学习程度了。
  • 线程与进程的内存关系。如一个线程占多少内存、一个进程可以开多少线程、一个进程占用多少内存等。
  • 内存分布。JMM、运行时数据区、native内存分布。很看对JVM的理解程度。

Kotlin

kotlin其实问的很少,现在大部分的项目还是使用Java开发的。一些有kotlin业务的公司会问,但是问的内容也不多。这一块如果还没学习其实不急的,把Java学好才是王道,kotlin和java在原理上,都是互通的。

1.协程

问的是最多的,主要是理解线程和协程的关系、协程的优缺点。这个也看个人的学习程度了。

2.run、let、also、with、apply

注意返回值以及作用域

3.特性的具体实现

如默认参数的具体实现。有了解过最好了,没有的话就联想Java是如何实现的,如默认参数可以联想方法重载。

计算机网络

计网这一部分主要还是HTTP和TCP的内容了,经典中的经典。需要注意的是链路层、网络层的一些协议要了解,也是计算机基础了,被问到不会的话会比较尴尬。其次是一些新的协议如QUIC、http3.0等可以了解一下,面试会很加分,同时也可以进一步去理解TCP的优缺点。

1.HTTP

  • http在android上的体现并不多,因为大部分的工作都给框架解决了,问的问题其实很少。
  • 历代http的优化以及原因
  • 请求方法、响应码

2.HTTPS

必问。一定要会了

  • 原理以及和http的区别。加密算法、hash摘要、ca证书验证都要了解
  • 建立连接过程
  • 破解:中间人攻击等

3.数据链路层、IP层

  • ARP和RARP协议
  • NAT协议
  • DNS

    这部分主要问一些常见的协议,考察计网功底,这里列出来的是笔者考察过的,读者需要比价系统地去学习这一块。

4.TCP

  • 握手挥手
  • 拥塞控制
  • 可靠传输原理
  • 缺点以及如何改进。这个是比较重要的,对应http3.0的优化就是针对TCP的缺点来入手的。
  • TCP的连接数目上限
  • TCP非常重要,必问的内容,不会的读者一定要去好好学习一下。

5.UDP

  • 优缺点
  • 和TCP比较
  • 应用场景
  • 一般和TCP一起出现,询问他们的区别,以及如何通过UDP来优化TCP的缺点。

6.数据格式

json的优缺点,为什么要使用json而不是XML。熟记就可以了。

设计模式

设计模式这一块问的不是很多,原因是设计模式需要实际的编码才能去真正理解他的好处。所以大部分情况下面试官都是询问在项目中用了哪些设计模式、或者哪些开源框架用了什么设计模式。其次问的最多的就是三大架构模式了,必会的。

1.常见的设计模式

一般面试官会让我们讲自己认识的设计模式,按照自己的理解讲出来就好了。

2.在项目和源码中的体现

问的最多的就是:你看过的框架源码都使用了哪些设计模式。不仅考察了设计模式、还考察了源码。另外也会问在项目中运用了哪些设计模式。

3.MVC\MVP\MVVM

基本必问了。结合具体的项目实现以及自己的思考,分析他们的优缺点、适用场景等。

计算机基础

计算机基础这里包括了c语言、操作系统、数据库库、以及前面的计网等等。这部分直接问的内容不多,但却是非常重要的,也是考验我们基础扎不扎实的地方。其次,面试官也会用一些业务场景来考验我们的理解程度,如聊到java并发时,问具体为何线程切换代价高;又如聊到JVM内存分布时,问在native层是怎样的内存分布以及逻辑内存物理内存等;再如聊到volatile,会问到cpu缓存一致性的问题等等。这些都是非常考验功底的内容。因而,这些基础内容要学好,不仅是为了面试,更是为了让我们自己可以更好地学习理解知识。

1.C语言

问的很少,偶尔会问到。笔者只被问到:同构结构体的内存占用、指针相关问题。

C语言作为语言鼻祖,一些基础还是要会的。

2.操作系统

  • 中断原理、作用。
  • 死锁原理以及如何解决。
  • 操作系统这一块确实问的不多,同样也是考察基础功底了。可以不问,但是问到一定要会。

以上就是大厂面试高频知识点,并不是说以上所有知识点都要掌握,世上没有万能人,大家都有知识盲区,遇到困难太正常了。遇到困难还能现场解决,才能体现出自身价值。即便无法解决问题,也可尝试说出自己的思路,而一个人的思路,往往能反映出这个人的心智模式和未来潜力。

总之,技术准备,功在平时。还是应该修炼基本功,有了这份基本功,就不怕变化,毕竟万变不离其宗。至于该怎么提升基本功,建议多学习、多思考、多实践、多总结。

下面是我在面试期间刷过的真题。需要的朋友只需要 点赞支持一下 后,然后【点击这里免费获取

总结

文章篇幅较长,总结的心得与方面有很多,通过这阶段面试,主要认识到自己java基础,源码阅读能力,数据结构与算法,网络编程知识与实际开发出现问题的总结能力还有待加强,这是一个面试重点,也是自己今后需要努力的方向,同时自学能力也是面试一个重要因素,所以我们不要成为码农,而要成为一个优秀的程序员这才是我们努力的方向,做好规划,努力学习,记录总结。养成这样的习惯。

好了,暂时只能想到这些,后面如有想到其它东西再补充哈,祝想找工作的同学都能去自己心仪的公司,前程似锦!

两年Android开发三面上岸腾讯,这些核心知识点建议收藏的更多相关文章

  1. Android开发三种第三方图片加载的框架

    最近在项目中用到了大量图片加载,第三方优秀框架还不错,下面介绍三款榜首的框架用法和问题,做一个记录. 现在项目使用的是Android Studio开发的,现在也没有多少人使用Eclipse了吧. 一. ...

  2. [Android开发系列]IT博客应用

    1.关于坑 好吧,在此之前先来说一下,之前开的坑,恩,确实是坑,前面开的两个android开发教程的坑,对不起,实在是没什么动力了,不过源码都有的,大家可以参照github这个应用 https://g ...

  3. Android开发文摘集合1

    作者:张明云 原标题:Android 开发中,有哪些坑需要注意? 作者github主页:zmywly8866.github.io/ 在Android library中不能使用switch-case语句 ...

  4. Android开发之获取xml文件的输入流对象

    介绍两种Android开发中获取xml文件的输入流对象 第一种:通过assets目录获取 1.首先是在Project下app/src/main目录下创建一个assets文件夹,将需要获取的xml文件放 ...

  5. android开发哪些坑需要注意

    同一个应用的JNI代码,不要轻易换NDK编译的版本,否则会有很多问题(主要是一些方法实现不一样,并且高版本对代码的检测更严格),比如r8没有问题,但到r9就有问题了,这是个大坑: Android的JN ...

  6. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

  7. Android 开发中三种多线程

    在开发工程中线程可以帮助我们提高运行速度,Android开发中我知道的线程有四个一个是老生长谈的Thread,第二个是asyncTask,第三个:TimetTask,第四个是Looper,四个多线程各 ...

  8. Android开发——View滑动的三种实现方式

    0. 前言   Android开发中,我们常常需要View滑动实现一些绚丽的效果来优化用户体验.一般View的滑动可以用三种方式实现. 转载请注明出处:http://blog.csdn.net/seu ...

  9. uni-app&H5&Android混合开发三 || uni-app调用Android原生方法的三种方式

    前言: 关于H5的调用Android原生方法的方式有很多,在该片文章中我主要简单介绍三种与Android原生方法交互的方式. 一.H5+方法调用android原生方法 H5+ Android开发规范官 ...

随机推荐

  1. 重新整理 .net core 实践篇————网关中的身份签名认证[三十七]

    前言 简单整理一下网关中的jwt,jwt用于授权认证的,其实关于认证授权这块https://www.cnblogs.com/aoximin/p/12268520.html 这个链接的时候就已经写了,当 ...

  2. 11 shell中内置关键字[[]]:检查条件是否成立

    0.[[]] [] (())的对比 1.[[]]支持正则表达式 0.[[]] [] (())的对比 [[ ]] 对数字的比较不友好,所以使用 if 判断条件时,建议用(())来处理整型数字,用[[]] ...

  3. php自动识别背景并且把它改为白色

    此源码有个阈值可以自己调节,精确度等自测 <?php /*$Colorimg = new Colorimg(); $image=$Colorimg->IMGaction("G:/ ...

  4. 入门Kubernetes-Service

    一.前言 前一篇文章通过 Deployment 实现了Pod中服务实现滚动更新/回滚等操作:在真实应用场景中,需要将一组Pod提供给外部访问.而且Pod生命周期是短暂的,在 Pod 的生命周期过程中, ...

  5. 题解 guP3956 棋盘

    好吧本来这题可以用最短路跑完的,结果我硬是打了1.5小时的dfs... 其实这题并没有那么难,构造一个无向图再跑最短路即可. 我用的dj跑最短路 问题来了 如果(n,n)是无色的,那么图上就没有这个点 ...

  6. Django基础005-Django开发的整体过程

    1.写views views.py代码块 1.在前端以/article/{{ article.id }}这种方式请求后台, 参数配置在urls.py中path('category/<int:id ...

  7. Java基础00-第一个程序2

    1. 常用DOS命令 1.1 打开命令提示窗口 按下win+R 输入cmd 按下回车键 得到命令提示窗口 1.2 常用命令 2. Path环境变量的配置 2.1 为什么要配置Path环境变量 2.2 ...

  8. 10分钟系列:NetCore3.1+EFCore三步快速完成数据库交互

    前言 做程序开发,不管是什么语言什么数据库,其中的ORM(对象关系映射)是必不可少的,但是不管选择哪一种ORM,都需要了解其中的运行机制,配置帮助类等等. 所以很多ORM都开始进行升级封装,我们只需要 ...

  9. linux U盘安装系统工具usb-creator-gtk

    linux平台下U盘安装linux系统的工具.它是ubuntu自带的工具,将建时将覆盖U盘中的所有内容.

  10. debug:am、cmd命令源码分析

    debug:am.cmd命令源码分析 目录 debug:am.cmd命令源码分析 am命令的实现 手机里的am am.jar cmd命令的实现 手机里的cmd cmd activity cmd.cpp ...