技术面
考察Android相关基础知识,主要问题如下:
- 面向对象的三大特性,说明你在项目中的应用
- 简述内存泄漏,说明你在项目中遇到的内存泄漏
- 简述OOM
- 进程间通信实现方式
- 简述你读过的开源源码或底层源码
大学面
- 自我评价你的大学生活
- 简述你大学最喜欢的课程,并说明你对该课程的应用
- 描述大学遇到最大的问题
总结
- 面试经验缺乏
- 对于应用开发的理解不够透彻
- 源码阅读量约等于0
一面
- Java的堆和栈区别
- Java的GC垃圾回收机制
- 什么是多态
- 进程和线程的区别
- 你在项目中做过哪些性能优化
- 如何优化页面卡顿
- Handler消息机制
- Android自定义View
- 你最常用的开源框架及其原理
- MVC模式与MVP模式
- HTTP和HTTPS的区别
- TCP的三次握手是什么
- 你用到过的加密算法
RSA,MD5
二面
- HTTP常见的请求方式及主要操作
Get,Post
- Java函数传入值和引用的区别
- Java中
String += “123”
的实现过程 - String、StringBuffer、StringBuilder的区别
- Java多线程编程
- LinearLayout与RelativeLayout对比
- 使用Fragment和View的对比
- 你所读过的开源框架及其原理
- 使用Service的业务场景介绍
- Service和IntentService的区别
- 编程实现二叉树深度优先遍历、广度优先遍历
总结
字节跳动的春招挂在了三面,具体过程不表(十分心痛)。
总得来说面试暴露出个人对于Java的基本概念掌握不够透彻,对于一些Android开发中的可选项没有做深层次的理解(例如:Fragment和View分别应用在什么场景)。
一面
腾讯一面的面试官十分友好,提前一天电话邀约,约了第二天晚上七点面试。并没有过多问技术相关问题,主要考察了业务场景的分析。主要流程如下:
-
什么是BLE,以及BLE的应用场景是什么?
答:BLE是Bluetooth Low Energy,低功耗蓝牙。BLE主要应用在短距离设备通信,距离限制在0-50m左右。 -
在局域网环境下,BLE通信与WIFI通信如何选择?
答:没有仔细探究过。 -
聊聊你做过的那个大数据项目。(面试官其实是想让我聊聊数据挖掘)
答:讲述了一下爬虫抓取、关键词提取、权值分析、建模分析等相关流程,合理避开了数据挖掘等问题,毕竟个人不擅长。 -
利用i++聊聊线程安全问题,如何解决线程安全?
答:线程间共享内存,导致多线程下i的数值被多个线程控制,造成线程不安全,可以使用synchronized关键字避免。 -
聊聊Android系统里的消息机制。
答:简述了一下Handler、Message、MessageQueue、Looper的实现原理。 -
编程实现一个抓取指定URL以及其子URL的接口。
写了一个抓取子URL的递归函数。
一面
-
写一个单例模式
过程中面试官不断引导:
(1)是否应该封闭构造方法;
(2)是否应该注意线程安全;
(3)注意访问控制符、作用域等;
(4)采用synchronized时,如果并发访问如何优化性能(这里其实是想让我用饿汉式单例模式,但当时没反应过来)。
-
简述进程和线程
-
Activity的SingleTask启动模式
Android四大组件(见Activity部分) -
Activity的生命周期
(1)onStop方法什么情况下不触发
(2)Back时,Activity的生命周期如何回调
Activity生命周期详细解读(含部分源码) -
Handler消息机制
(1)runOnUIThread方法的原理
(2)Handler的实例如何创建
Android消息机制 -
举几个Android内存泄漏的例子
Android内存泄漏 -
简述Android进程间通信(IPC)
答案可见本人Blog,
面试官又提了多进程加载同一个Class如何保证唯一性的问题,问了一个ClassLoader的概念,没答上来。。
Android进程间通信(IPC) -
Java的GC垃圾回收机制
(1)如何判断对象是否需要被回收
(2)两个互相引用的对象如何回收 -
HashMap的相关概念
(1)查找时间复杂度
(2)应用场景 -
equals和hashCode方法
-
计算机网络相关概念
这是个人知识盲区,待出一篇Blog扫下盲。
总结
一面
首先是自我介绍,简单讲了下项目经验、个人收获(常规套路)。后续就是边聊天边提问,面试过程比较放松。下面简单罗列一下一面涉及到的问题:
-
HTTP的工作原理?HTTP和HTTPS的区别?
本来这个问题面试官就是想问HTTP的原理,但由于我并不了解,所以就引导面试官去问HTTPS,避开了个人盲区。 -
常规后台API开发的主流框架?
简单讲了一下Spring、Spring Boot、MyBatis、JPA这类主流框架。 -
讲一下你在项目开发过程中会做哪些测试
聊了下系统测试、单元测试,讲了一些边界测试等常用测试方法。
说实话问这个问题的时候有点懵,有点没反应过来。 -
操作系统内进程和线程的区别?
-
单核CPU是否会出现线程安全问题?
会
-
Activity和Fragment的区别?
-
讲一下你常用的几种布局
-
什么是ANR?开发中如何避免?
ANR就是Application Not Responding,主要出现在主线程阻塞等情况下。
规避方法回答了多线程编程。(后续看了下还有防死锁等) -
Android进程间通信机制
Android进程间通信(IPC) -
讲一下Bundle的实现原理
-
通过Launcher启动APP时,系统如何运行?
-
讲讲TCP/IP五层模型?
-
TCP、UDP的区别?
-
手写二叉树层级扫描算法
二面
二面的面试官应该是一个项目经理,和他复盘了我简历上写的每一个项目。这一面的问题大多是偏向工程类、设计类的,提问也同样是边聊天边提问。下面罗列一下主要问题(面试时其实还会问一些小的细节,我就不列了):
-
APP研发需要经过哪些过程?
这个问题我倒没有直接回答常规项目开发流程(需求分析、概要设计、详细设计、编码、测试),而是直接从UE、UI之类的聊起来了,然后给面试官演示了一下个人设计并研发的APP。 -
绘制一下***的数据库设计视图(这里指定了一个个人开发项目)
简单画了一下项目的数据库视图,讲了一下表间关联关系。 -
讲一下实际项目中进程间通信的应用场景
-
讲一下客户端和服务端如何实现数据同步
回答了一下增量同步、全量同步两种同步方法。简述了一下如何设计一个增量同步方案。 -
HTTP和HTTPS的区别?
-
BLE蓝牙和传统蓝牙的区别?
-
如何实现BLE蓝牙的设备连接和通信建立?
-
手写和最大子序列算法
HR面
HR面就是比较常规的聊聊天,主要会了解一下这几个方面:
- 期望工作地点
- 个人发展方向
- 公司待遇
- 薪资
总结
因为本次是现场面试,所以过程中比较放松,主要的问题都回答上来了,不怎么了解的问题也尽可能的去从别的角度回到了,总得来说还算可以。但是操作系统、Android偏低层的原理这两个方面还比较弱。
但愿这次能从众多硕士大佬们中间虎口夺食,拿到秋招第一份Offer。
2020小米客户端开发岗面经
之前一直没有收到小米的笔试安排,倒是直接安排了视频免,面试官人比较nice,是米家APP的研发(BASE北京)。面试感觉还不错,可能因为个人在面试过程中表露了不想去北京的意思,导致一面完就没了。简单罗列一下面试涉及到的问题,以及个人的答案。
技术类问题
-
final可以用来修饰什么?有什么作用?
-
重写和重载的区别
-
如何比较两个对象是否相等?
equals
-
简述HashMap的存储数据结构
-
Thread和Runnable有什么区别?
-
抽象类和接口有什么区别?
-
内部类和静态内部类有什么区别?
-
Android常见的内存泄漏有哪些?
Android内存泄漏 -
String、StringBuilder、StringBuffer有什么区别?
String、StringBuilder、StringBuffer的区别 -
简述Activity生命周期
Activity生命周期详细解读(含部分源码) -
onStart和onResume的区别是什么?
同上文 -
Activity的四种启动模式
Android四大组件 -
聊聊你常用的单例模式
直接回答了饿汉式
-
Handler消息机制
Android消息机制 -
简述你在项目中进行了哪些多线程开发?
-
线程池如何进行任务分派?
核心线程数,最大线程数,任务队列
-
RecycleView和ListView有什么区别?
-
简述GC垃圾回收机制
-
BLE开发时,如何处理消息队列?
考虑的是可以对消息队列进行一定的延时处理,避免设备无法响应。
-
TCP和UDP有什么区别?
-
简述TCP/IP五层模型
-
实际项目中遇到最大的问题是什么?
综合类问题
-
个人有什么缺点和优点?
-
生活中遇到与你无法相处的人时,你如何处理?
短期相处的话适当谦让,长期相处的话通过团建、沟通等方式缓解矛盾。(面试官对这个回答倒还挺满意)
-
有什么兴趣爱好?
-
大学生活中遇到了哪些挫折?
-
爱看什么书?
-
是否有个人博客?
-
今后有什么职业目标?
8月20日一面
- 讲一下Class字节码结构
- 如何进行Class反编译
- 项目中如何定位内存泄漏?
- 介绍Calendar APP的主要功能
- 讲一下在项目中遇到的Crash
- 如何定位Crash
- Throwable、Error和Exception的区别
1.throwable是父类,exception是子类。
2.throwable是根基,exception是从throwable派生出来的。
3.throwable中包括exception(异常)和error(错误)。
4.throwable用来定义所有可以作为异常被抛出来的类,exception专指程序本身可以处理的异常,一般性的异常。
- 讲一下finalize()的作用
- Activity的生命周期
- Activity在finalize()中重新引用后,能否进行Activity保活
- 手撸链表去重算法
8月29日一面
- Class编译过程
- 自定义View时需要经过哪些过程?
- 如何绘制圆形、曲线等?
- 自定义View是如何绘制在屏幕上的?
- 简述Activity生命周期
- 应用切换到后台,前台Activity生命周期经过哪些变化?
- onNewIntent方法什么时候触发?
- singleTask和singleTop有什么区别?
- 两个Activity如何进行跨进程通信?
- 一个进程进行文件读取时,如何设置权限(不让其他进程访问)?
- Android如何实现多线程?
- 简述Handler消息机制
- JVM是什么?为什么需要JVM?
- 简述客户端网络请求架构
- 如何保证客户端网络请求安全性?
加密
- HTTP长连接、短连接是什么?
- 简述TCP三次握手
- HTTPS是如何加密的?
- DNS是什么?
- 如何从一亿个QQ号中筛选出五个指定QQ号?
- 简述快排算法实现过程,时间复杂度是多少?有什么弊端?
- 简述归并排序算法,时间复杂度是多少?
2020VIVO安卓开发岗面经
正式批投递了VIVO校招Java开发(Android方向)的岗位,笔试的话是三道编程,AC两道、一道90%。近期给安排了南京地区的现场面试,面试是通过了的,无奈薪资给的太低。简单罗列一下面试涉及的问题:
一面
一面是技术面,在面试前就已经了解到VIVO的面试官好多都是冷着脸,一到现场果然。。。
上来先是素质三连:
- 一分钟自我介绍
- 为什么选择VIVO公司?
- 为什么选择Android方向?
后面就都是些常规的技术类问题了,不过面试官比较倾向于MySQL:
- Java三大特性及实际应用
- abstract class和interface的区别
- final关键字的作用(变量、函数、类)?
- static关键字的作用
- 线程间如何实现延时启动?假设有三个线程(ABC),C需要在AB线程结束时才执行,如何设计?
倒计时
- 简述Map的几种遍历方式
- 双向链表和单链表有什么区别?
- 关系型数据库和非关系型数据库有什么区别?
- MySQL如何进行数据库升级?
- MySQL如何排序?
- 简述工厂模式
- 简述单例模式
- 懒汉式单例如何保证线程安全?
双重校验锁
- 简述快排
- 简述Android生命周期
- 当前活跃页面被覆盖时,生命周期如何变化?
- 简述自定义View的设计过程
- 简述Handler消息机制
- Handler的消息执行是在哪个线程上?
- 简述ContentProvider
- 哪些场景应该使用Service?
- Service是运行在什么线程上的?
- SharedPreference的apply和commit方法有什么区别?
二面
二面是HR面,问的都比较轻松,大多是聊聊天。
- 考研和工作之间如何选择?
- 用两个词形容下自己
- 个人有什么优点?
- 聊聊目前找工作的情况
- 是否了解过VIVO的薪资水平、薪资结构?
- 预期薪资多少?如果给不了你预期的薪资怎么办?
- 在学校都做过什么学生事务工作?
一面
一面问的问题大多是开放性问题,主要是看个人思路吧。
- 手撕依赖关系树扫描算法(期间提了不重复扫描、优化时间复杂度等要求)
- 简述如何实现未知长度的数组翻转?
- 简述内存泄漏,你处理过哪些内存泄漏?
- 以100ms/张的间隔时间播放100张图片,且每张图片需要400ms进行加载,如何设计?
- 如何在无序数组中快速找到最小值(手撕二分查找算法)
- 简述Android中的ANR,以及为什么会出现ANR?
- 简述Handler消息机制(深挖内部实现原理)
二面
- 手撕一个有序数组的二分查找算法
- 列举一个你在实际项目中所进行的性能优化(深挖具体细节)。
- 简述单例模式的实现方式,且单例模式有什么优缺点?
- 简述Java的异常处理机制
- 多线程间如何进行信息通信?
- 多线程如何保证线程安全?
- 简述线程池
- 简述HashMap实现机制,如何解决HashMap的线程安全问题?
- TCP和UDP的区别,分别有哪些应用场景?
- 简述七层网络模型
- 简述Android点击事件的分发机制
- 画一个BLE APP的功能架构图
三面
三面相当于是综面和HR面和在一起了,主要问题也是分两个模块。
业务类问题:
- 手绘Class间依赖关系图
- 聊聊如何处理并发编程
- 手撕消费者模型代码,主要线程安全、队列等情况。
- 简述Android系统的类加载机制
- Activity的生命周期通过什么机制来通知?