腾讯
腾讯一面
- 自我介绍
- 自我介绍时说过自己看过EventBus源码,然后让我谈谈事件总线的理解。
- EventBus会有什么问题吗?
- EventBus、接口回调、观察者模式的使用场景说一下。
- 项目什么地方用到数据的持久化,说一下。
- Activity的生命周期,弹出dialog和一个activity的dialog生命周期有什么区别?
- Activity的启动模式,应用场景,然后举了很多微信的场景,让我去选择用那种启动模式,说下理由。
- Activity进程的优先级。
- 如何防止微信不被系统杀死?
- service两种启动模式,区别
- 两种启动模式,如果我在退出Activity的时候没有退出service会怎么样。
- 设计一个图片浏览框架,(线程池,lru缓存,brabra的说了一堆)。
- 有一个很大很大的图片加载到内存上,不能降低清晰度和压缩图片你怎么解决?(提示我局部显示?我没懂)
- 如何适配不同厂商的手机,然后设计模式,brara又说了一大堆,最后还说到jetkins自动部署上面去了
- AsyncTask源码分析,每个方法在哪个线程执行的?
腾讯二面
- 上来大数相乘,我做的眼泪都快流出来了。
大数相乘-经典笔试题
基本思想
输入字符串,转成char数组,转成int数组。采用分治思想,每一位的相乘;
公式:AB*CD = AC (BC+AD) BD
然后从后到前满十进位,顺序如右(BD,(BC+AD),AC)。
package demo.test;
import java.util.Scanner;
/**
* 大数相乘
* @author Ant
*
*/
public class BigMultiply {
/**
* 大数相乘基本思想,输入字符串,转成char数组,转成int数组。采用分治思想,每一位的相乘;<br>
* 公式:AB*CD = AC (BC+AD) BD , 然后从后到前满十进位(BD,(BC+AD),AC)。
* @param num1
* @param num2
*/
public String multiply(String num1, String num2){
//把字符串转换成char数组
char chars1[] = num1.toCharArray();
char chars2[] = num2.toCharArray();
//声明存放结果和两个乘积的容器
int result[] = new int[chars1.length + chars2.length];
int n1[] = new int[chars1.length];
int n2[] = new int[chars2.length];
//把char转换成int数组,为什么要减去一个'0'呢?因为要减去0的ascii码得到的就是实际的数字
for(int i = 0; i < chars1.length;i++)
n1[i] = chars1[i]-'0';
for(int i = 0; i < chars2.length;i++)
n2[i] = chars2[i]-'0';
//逐个相乘,因为你会发现。AB*CD = AC(BC+AD)BD , 然后进位。
for(int i =0 ; i < chars1.length; i++){
for(int j =0; j < chars2.length; j++){
result[i+j]+=n1[i]*n2[j];
}
}
//满10进位,从后往前满十进位
for(int i =result.length-1; i > 0 ;i--){
result[i-1] += result[i] / 10;
result[i] = result[i] % 10;
}
//转成string并返回
String resultStr = "";
for(int i = 0; i < result.length-1; i++){
resultStr+=""+result[i];
}
return resultStr;
}
public static void main(String[] args) {
BigMultiply bm = new BigMultiply();
System.out.println("-----输入两个大数------");
Scanner scanner = new Scanner(System.in);
String num1 = scanner.next();
String num2 = scanner.next();
String result = bm.multiply(num1, num2);
System.out.println("相乘结果为:"+result);
scanner.close();
}
}
- put和post的区别,应用场景。
- 看了我的flutter项目,我改了一个框架,问我这个框架。
- 让你设计一个跨平台的框架,你怎么设计(这里我谈了flutter的架构)。
- https的流程。
- fragment的懒加载。
- 一个商场里有一个电影院,你会把厕所建设在哪里,说一下你的理由?
阿里
阿里一面
- 自我介绍
- 自己看过的源码,说一下?
- 接下来就EventBus的东西了,还是老问题,优缺点,有没有什么问题,列举了很多场景,我看源码看的比较细,根据自己看过的东西做回答和分析,然后还是,接口回调和观察者模式之间的选择。
- 问我你看过这么多源码,你觉得什么东西最重要?
答了源码中看到了大量的反射使用,多线程方面,Collections,数据结构这些。 - 问我多线程,引申出handler,我从handler的源码去解释
- handler引申出的内存泄漏,为什么静态内部类不会持有外部类对象
- 静态内部类是类相关的,在编译的时候会被初始化且只有一次,外部类对象是只有在实例化后才存在的。因此静态内部类不会持有外部类对象
- 接下来还是场景题,图片框架的实现,涉及到的Lru缓存,线程池,线程池该如何分配线程数量。
- APP从打开到显示之间发生的事情。
- 为什么java可以调用c/c++的函数,调用jni发生的事情说一下。
- 动画种类,使用动画的步骤,有没有看过动画框架的源码。
(面试官说我在应用层上基础知识很好,懂得去看源码学习,但是android深度不够,应该要往Framework和c/c++那边学习)
阿里二面
- 自我介绍
- 还是自己对EventBus的理解。
- 学习Android的过程
- 项目遇到的问题,怎么解决的
- 回答过程中提到csrf,问原理
- 对公司有什么要求
- IPC
- socket的连接过程
(说我这方面的技术和兴趣不错,但是缺少大型项目的经验,考虑不够全面,如果有一个机会给我就很好了。)
阿里三面
- 自我介绍
- 详细说我第一个项目
- http缓存
- 如何把ip地址存储在一个int 变量里面?
实现原理
ipv4的地址可分解为4段,每段范围0-255;int类型的变量同样也有4个字节,每个字节的上限也是255(11111111)且每个字节有8位,结合这两个特性,可以把IP的地址的每一段分别对应到int的每一个字节当中,因为要存储到一个int变量中,所以要在存储时要依次位移8位,这样的话一个IP便可保存在一个int型变量中。
public static void main(String[] args)
{
String ip = "172.185.255.233";
//step1: 分解IP字符串,并对应写对字节数组
byte[] ip1 = ipToBytes(ip);
//step2: 对字节数组里的每个字节进行左移位处理,分别对应到整型变量的4个字节
int ip2 = bytesToInt(ip1);
System.out.println("整型ip ----> " + ip2);
//对整型变量进行右位移处理,恢复IP字符串
String ip3 = intToIp(ip2);
System.out.println("字符串ip---->"+ip3);
}
/**
* 第一步,把IP地址分解为一个btye数组
*
* @param ipAddr
* @return int
*/
public static byte[] ipToBytes(String ipAddr)
{
//初始化字节数组,定义长度为4
byte[] ret = new byte[4];
try
{
//使用关键字"." 分割字符串数组
String[] ipArr = ipAddr.split("\\.");
//将字符串数组依次写入字节数组
ret[0] = (byte) (Integer.parseInt(ipArr[0]));
ret[1] = (byte) (Integer.parseInt(ipArr[1]));
ret[2] = (byte) (Integer.parseInt(ipArr[2]));
ret[3] = (byte) (Integer.parseInt(ipArr[3]));
return ret;
} catch (Exception e)
{
throw new IllegalArgumentException("invalid IP : "+ipAddr);
}
}
/**
* 根据位运算把 byte[] -> int
*
* 原理:将每个字节强制转化为8位二进制码,然后依次左移8位,对应到Int变量的4个字节中
*
* @param bytes
* @return int
*/
public static int bytesToInt(byte[] bytes)
{
int addr = 0; //初始化Int变量addr=0
addr |= (bytes[0] & 0xFF); //强制转化为8位二进制码,比如原码是101,强转后00000101
addr = addr << 8; //左移8位,得到00000101 00000000,给下个字节的拼接创造环境(预留8位0,方便用|进行拼接)
addr |=(bytes[1] & 0xFF); //强制转化为8位二进制码,比如原码是10101,强转后00010101,和00000101 00000000进行或运算后得到00000101 00010101
addr = addr << 8; //左移8位,得到00000101 00010101 00000000
addr |= (bytes[2] & 0xFF); //强制转化为8位二进制码,比如原码是111,强转后00000111,和00000101 00010101 00000000进行或运算后得到00000101 00010101 00000111
addr = addr << 8; //左移8位,得到00000101 00010101 00000111 00000000
addr |= ((bytes[3]) & 0xFF);//强制转化为8位二进制码,比如原码是1,强转后00000001,和00000101 00010101 00000111 00000000进行或运算后得到00000101 00010101 00000111 00000001
return addr; //拼接结束,返回int变量
// 优化之后的写法,原理相同,不过是先移位后直接强转的同时指定位数
// int addr = bytes[3] & 0xFF;
// addr |= ((bytes[2] << 8) & 0xFF00);
// addr |= ((bytes[1] << 16) & 0xFF0000);
// addr |= ((bytes[0] << 24) & 0xFF000000);
// return addr;
}
/**
* 把int->string地址
* @param ipInt
* @return String
*/
public static String intToIp(int ipInt) {
return new StringBuilder()
.append(((ipInt >> 24) & 0xFF)).append('.') //右移3个字节(24位),得到IP地址的第一段也就是int变量的第一个字节(从左边算起)
.append((ipInt >> 16) & 0xFF).append('.') //右移2字节(16位),得到int变量的第一和第二个字节(从左边算起),经过&0xFF处理得到后8位也就是byte[1]
.append((ipInt >> 8) & 0xFF).append('.') //同理如上
.append((ipInt & 0xFF)) //同理如上
.toString();
// 第二种,先强转二进制,再进行移位处理
// return new StringBuilder()
// .append(((ipInt & 0xFF000000) >> 24) & 0xFF).append('.') //右移3个字节(24位),得到IP地址的第一段也就是byte[0],为了防止符号位是1也就是负数,最后再一次& 0xFF
// .append((ipInt & 0xFF0000) >> 16).append('.')
// .append((ipInt & 0xFF00) >> 8).append('.')
// .append((ipInt & 0xFF))
// .toString();
}
- 详细介绍第二个项目
(30min,面试官说我自己对技术的热情很不错,让我保持下去,口头直接让我过,让我等hr)
阿里HR面
- 从小到大最有压力的事
- 数学怎么样
- 你考上这个学校是正常发挥吗? 我回答的是!/(ㄒoㄒ)/~~ 很凉
- 什么事情让你觉得自己喜欢移动端
- 哪里人,想去哪里
(hr面只有15分钟,感觉不太好)
(昨天收到offer意向书,整个流程横跨两个月)
小米
小米一面 (1小时20分钟)
- 讲一个你印象比较深刻的项目
- 讲一下Volley框架的实现机制
- BLE蓝牙的使用流程
- 设计模式你说下
- binder机制应用层面上说下
从应用层面剖析Android Binder机制
(1)AIDL
(1)定义一个服务IService接口,定义提供服务方法。 继承自IInterface 表示可以跨进程调用
(2)Service端实现IService,继承自Binder,通过重写onTransact()方法实现IService中的方法。则Service端可以处理Client端调用请求
(3)Client端持有BinderProxy,通过BinderProxy.transact()方法调用Service中方法,经过Binder驱动跨进程传递之后,最终找到Server端onTransact()执行
BinderProxy将客户端的请求参数通过Parcel包装后通过Binder传到远程服务端,远程服务端解析数据并执行对应的操作,同时客户端线程挂起,当服务端方法执行完毕后,再将返回结果写入到另外一个Parcel中并将其通过Binder传回到客户端Proxy,客户端Proxy会解析数据包中的内容并将原始结果返回给客户端真正调用者,至此,整个Binder的工作过程就完成了。
由此可见,Binder是一个典型的代理者模式,Parcel对象就在这个通道中跨进程传输。
(2)Android Framework层对Binder跨进程应用
新进程app process向servicemanager查询system_server进程中binder服务端AMS, 获取相对应的Client端,也就是AMP. 有了这一对binder c/s对, 那么app process便可以通过binder向跨进程system_server发送请求,即attachApplication()
system_server进程接收到相应binder操作后,经过多次调用,利用ATP向app process发送binder请求, 即bindApplication. system_server拥有ATP/AMS, 每一个新创建的进程都会有一个相应的AT/AMP,从而可以跨进程 进行相互通信. 这便是进程创建过程的完整生态链。
- View事件分发机制说下
- android性能优化说下(布局优化、内存泄露、bitmap压缩等等…)
- eventBus框架是干什么用的,实现机制?
- ANR和crash遇到过么?怎样解决
- 编写代码(给一个网址,编写代码)
- 输入一个n*n的正方形矩阵a,要求填充逻辑代码,将矩阵a顺时针旋转90度
小米二面(1小时20分钟)
- 自我介绍
- 你做的这几个项目挑出一个来讲一下
- 步态分析器这个项目的话,你感觉核心实现是什么?
- 讲一下蓝牙有几种方式,你用的BLE的蓝牙流程说下
- 假如说你的app现在使用了一个A的第三方库,那么为了以后可以容易换成B的第三方库,你会怎样去做减少后面的修改难度?
- android的多线程你知道多少?介绍下
- asyncTask的内存泄露你知道么?
- 给一个网页,手撕代码
题目:一个字符串,开始可能有0-N个空格,然后在这个串中每个单词之间有1-N个空格,最后的结束也有N个空格,现在要求最后的输出结果是开始不能有空格,每个单词之间只能有一个空格,最后全部是空格的格式
一、先实现,无要求
二、空间复杂度要求为O(1),再优化
武汉现场面三面 40分钟
- 自我介绍
- 讲一个你熟悉的项目
- 手写代码:一个数组中的数字,有大有小,如何用最少的+1或者-1的操作消除数组中的数字差异过大的情况,返回你的操作次数
- intentService了解么?说一下他的用处和原理
- intentService和service的区别
- intentService现在要求让他的任务可以并行执行,你会怎样去实现
- asyncTask说下主要的方法
- activity销毁之后,那么asyncTask如果还在执行,那么会造成什么问题
- activity的旋转屏幕的生命周期变化
- 手写代码:一个单链表,每三个节点反转一次
- 你有什么想问我的么?
头条
今日头条 1面 30分钟
- 自我介绍
- 两个有序数组,求这两个有序数组中最大的K个数(要求时间复杂度空间复杂度较低)
- 对于栈这个数据结构,实现以下几个方法:push,pop,max(要求空间复杂度较低)
今日头条 2面 1小时
- 自我介绍
- android事件分发机制说下
- touchSlop,touchDelegate的理解
- viewStub,merge、include的理解
- java引用级别
- 用过什么第三方库?(用过eventBus,Volley。知道RxAndroid,okHttp等。。写过demo)
- 用过什么编译器
- 内存泄露原因(从JVM开始和他说起)
- gcRoot有哪些?
- 如何检测内存泄露,有什么方式
- 算法:一个有序数组,寻找k值出现的第一个位置(针对算法要求最优)
- 算法:每个人都有工作时间区间,现在有N个人,他们每个人分别有K个工作区间。现在要找到一个大家都空闲的时间段进行开会,那么如何来找到这些空闲时间段?讲出思路和时间复杂度,空间复杂度
手机百度
手机百度电话一面 34分钟
- 二叉树的非递归实现(前序、中序、后序)
给一个NN的矩阵,找出22矩阵的和的最大值,时间复杂度?最优? - android蓝牙连接(传统蓝牙,BLE蓝牙),如何连接?
- JVM内存分区(每部分异常会报什么错误?)
- JVM垃圾回收算法(详细介绍)
- JVM垃圾回收器(详细介绍)
- https连接过程,握手过程
- 对称加密,非对称加密
- 三次握手过程
- android消息机制
- android事件分发机制
百度二面(一小时50分钟)
- 讲一下你做的这些项目里面哪个印象最深刻
- 你负责的这些部分讲几个你认为比较重要的点
- Volley框架机制说下,你能抽取出(学到)几个技术点?
- android性能优化说下
- binder实现机制
- AIDL文件的用处,aidl生成的类有什么用?讲下这个类做的事情和原理
- 进程之间是相互隔离的,那么从A进程到B进程使用binder进行通讯,那么猜想下到底是怎样做的呢?
- View的消息机制你说下,对于ViewGroup和View有什么不一样?
- 事件拦截的话,可不可以从子View来进行操作?具体思路说下
- 考虑一种场景:listView加上一个header实现下拉刷新的功能,你要怎样去实现?说说思路
- 如果这样的场景下:listView和header属于不同的view,相互为兄弟View,外部套一个大的viewGroup,如何进行事件分发?从初始态到用户拉下出现header的过程来依次分析
- 如果是这样的场景:listView和header属于同一个view层,那么下拉刷新又该如何实现?事件拦截又该如何去做?
- 发过来一个网址,手写代码
根据他提的需求,写代码(主要就是设计模式的使用原则和设计模式的使用):基本上涉及的知识点:策略模式,工厂方法模式。之后根据不同的新需求如何尽可能少的修改原来代码来实现新功能。 - 对上一步中的抽象类和接口说下优缺点?
- 为什么java是要求是只能单一继承?却可以实现多个接口?说下你的见解
- 抽象类属性中什么场景下是优点?什么场景下优点又变成了缺点?
- 使用接口什么场景下是优点?什么场景下优点又变成了缺点?
- 权利翻转:你有什么需要问的么?…
百度三面(50分钟)
- 自我介绍
- 能不能立即过来实习?
- 网络分层?7层,5层,4层,具体说下每层干啥
- ip是哪一层协议?
- post与get的区别,get有长度限制么?
- 为什么要使用ip协议?直接使用mac地址连接不可以么?
- 全球这么多厂商,生产的设备如果有重复的mac地址,你如何解决这个问题?网络数据包传输会有什么问题
- 你是网络管理员,从英国的一台电脑要打开中国的一个网页,现在就是连接不上(dns正常可以解析到正确IP),你能考虑到哪些问题?
- 你是衡水的手机号,现在你在湖北,那么北京的手机号打你的手机为什么你可以接到电话?接着问,你数据结构知道吧?
- 快排时间复杂度是多少?最差?平均?为什么时间复杂度是O(N*logN)?怎样推导出来的?
- 你对app推送有什么了解?如果是你来实现的话,你能怎么做?
- 中国有13亿人,对全国身份证号进行排序,你会怎样去做
- 你上级让你去安排一个日子来举办活动,要求这一天一定不能是周六或者周日,一定要在周一到周五之间,你如何判断一年里面有哪些日子是合适的?
华为优招
一面:
- 上来是做自我介绍,之后开始问项目,讲项目中的认为的难点,印象深刻的地方。即时通讯IM,BLE蓝牙连接
- android消息机制 view分发机制 android性能优化 binder机制 设计模式(包含设计原则)
- 广播的静态注册与动态注册 广播的有序与无序 service的如何保持不被杀死 内存泄露(handler 等…)
- == 与equals区别 stringBuffer与stringBuilder区别 hashmap的原理
- post与get区别 http与https区别 网络错误码
二面
- 聊人生。。。
拼多多
拼多多 一面(30分钟)
- 做自我介绍
- android布局说下
- android四大组件说下
- activity和activity传输数据怎么做
- 使用intent传输数据对数据有什么要求
- service和activity的区别说下
- ANR了解么?如何解决?
- 给你一个数组,里面都是long类型数据,有重复数字有空格,要求去重,空间复杂度O(1)。说下思路
- 跨进程通讯你说说看有哪些
- binder机制说说你知道的
- 常用的排序算法说下
- 自定义View实现,应该注意什么
- View的生命周期—如果activity被重建,那么view的生命周期怎样变化
- activity横竖屏切换,对应的view的生命周期
- activity横竖屏切换,activity的生命周期
- activity横竖屏切换,activity一定会调用onDestory方法么?
- 通过在清单文件中进行设置不让他进行横竖屏切换的话,activity是如何知道进行了横竖屏切换
- 有什么想问我的?
二面
- lambda编程知道么?
- afinal框架?呵呵哒
- volley中对cookie的处理?呵呵哒
- GC回收算法
- http报文 cookie
- GC roots有哪些
- GC roots 遍历递归
- 同步,异步函数函数修饰符修饰符?future
网易
网易一面:40分钟
- 项目挨个问了下(准备充分,无压力)
- volley框架说下
- 手写一个生产者消费者
- 手写fragment生命周期和activity生命周期,并把生命周期一一对应上。
- 热修复说下,几种方式?各自原理?
- 插件化了解么?说下,基本原理知道么?
- 混合开发了解么?
- A应用如何打开B应用的界面?
- 安卓性能优化有哪些?
- recycleView说下
- activity与fragment交互,如何互传数据
- binder说下
- activityManagerService知道么?说下
- android中的广播说下,粘性广播知道么
网易二面:基本没问项目,完全面试官自由发挥。40分钟
- popupwindow中是否可以再创建popupwindow?为什么?
- dialog中是否可以创建子window?为什么?
- dialog创建为什么传入activity的context而不是applicationContext ?
- fragement和activity交互方式
- fragment可不可以在构造函数传递参数?使用setArgument的原理?
- 两个应用程序A和B,A要用B的登录信息,怎么做?
- contentprovider是如何保证操作数据库原子性?
- 加载进来的class类是否可以动态修改?
- 热修复原理有哪些?说下
- binder是在jni层怎样实现的(一次拷贝)?
- client使用serviceManager可以找到对应的service,那么自己写的service的话,client是怎样找到的这个service?
- 安卓性能优化你知道有哪些?
- 一个后台任务栈,从上到下 A B C三个activity,内存不足回收。那么从后台到前台打开是哪个界面?为什么,原理?
- 子线程是否可以更新UI?那为什么安卓要求不能在子线程更新UI?
美团Android面经
- 上来自我介绍(这项没准备,就说了几句草草了事)
- Activity的生命周期,什么时候触发onRestart,onPause,页面生命周期怎么变,onHost的两个方法什么时间用,怎么用
- 页面的即时状态怎么保存,怎么恢复
- 页面启动的模式
- 页面之间的数据交互
- Service的生命周期、实现方式,在主线程中怎么实现Service,可能有什么问题
- BroadCast Reciever 怎么实现,怎么发收广播,怎么屏蔽一个广播
- 消息的分发机制
- Looper的作用,以及实现
- View的事件传递机制,用来实现什么的
- onTouch和onClick的优先级
- 怎么自定义View
- 出现了ANR怎么收集错误信息
- 说一些Android数据的持久化
- ListView的复用和RecyclerView的区别
- 给一个10M的大图怎么打开
- 怎么下载网络图片,注意的规范
- 看了那些第三方库,说说源码
Java:
- 多态是啥(第一反应是怎么能问这么水的一个题)
- String和StringBuffer区别,看过字节码有什么区别么,讲一讲
- 类的加载机制说一下
- 序列化的几种方式,说说源码,比较性能
- 强引用,软引用
- 判断是否为垃圾的算法
- 回收垃圾的算法,并进行比较
贝壳面经
一面:
- 自我介绍、然后问了项目
- H5和native交互的方式
- H5访问native的方法,native访问H5的方法具体怎么实现
- ReactNative和native的数据交互方式(因为我项目有用过RN)
- 讲一讲java注解,@Retention 为Source和class的区别
eventBus的@Override注解是Source还是class 在什么阶段加载 - eventBus的源码实现
- 一个Service被两个activity启动,一个是startService()的方式启动,一个是bind()的方式启动,bind()的activity消亡,那么service还有么
- android的数据持久化方式
- sharedpreferences是不是线程安全的,怎么实现线程安全
- arraylist和linkedlist 的区别
- arraylist删除所有偶数怎么做,有几种方式(考察的不是算法)
- 自定义view
- 怎么获取一个view的宽高
- 说一下dp和sp(最好推导一下过程)
- 场景题:设计一个圆形的显示一个头像的ImageView,只点击头像区域有效有监听
- Handler机制
- 算法题:二分查找
结束了之后休息了在等待区等结果,大概五分钟就出结果了
二面:
- RN和native的数据交互
- 为什么RN使用js可以在android上运行
- flutter看过么
- flutter和RN的区别,优点
- TCP三次握手 四次挥手
- HTTP和HTTPS的区别
- 设计一个注解器,解析注解(不会)
- 内存泄漏怎么检测
- 设计一个内存泄漏的检测工具
- 内存泄漏的可能情况
- 性能优化
- VeEx和RN的区别
- 事件分发机制
- 算法:有序数组的旋转,找出最小值
- 替换数组中char型数组中的ali为beike
让我问问题。。blablabla
面试复习笔记
下面这个些学习笔记是我从出学校到现在工作5年了,一直在持续在更新的学习心得文档,不仅包含了技术点理解记录还有Android开发中高级面试题一并整理在这了,然后全网寻找最优的解答方案。每一道面试题都是百分百的大厂面经真题+最优解答。包知识脉络 + 诸多细节。节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。大家可以直接去访问 GitHub:https://github.com/733gh/Android-T3查阅。
网友评论