1、小红书Android面
Java篇
- 静态变量和实例变量的区别
- “==” & equals()
- 浅拷贝 & 深拷贝
- HashMap , 扩容机制
- 多个线程如果共享多个资源,需要怎么保证安全
- volatile,CAS/ABA
Android篇
- 事件的分发机制
- Handler原理
- TCP UDP
- Kotlin和Java的区别
- 启动优化
- 内存优化
- 多进程通信
2、快手 Android
- Android/ 布局优化
- Activity启动模式
- RecyclerView和ListView区别
- Handler机制,loop方法为何不会造成ANR
- View绘制流程
- SingleTop和standard启动模式下,生命周期回调有何不同
- onStart和onResume区别
- Java/ 面向对象三大特性
- Array和Linked区别
- HashMap底层
- 进程间通信方式
- equals和==区别
- 线程间加锁的方式
- 知道啥设计模式
- synchronized的不同使用
- 异常
- 线程池
- 创建线程的方式
- OS/ 死锁
- 网络/ tcp和udp的区别
3、爱奇艺Android工程师
- 介绍项目
- Android布局嵌套深有什么问题
- kotlin协程
- HashMap原理
- 算法:手写快排
- Activity启动模式
- Activity A → B的生命周期在这四种启动模式下的状态
- 广播类型
- 有序广播如何实现的按顺序收到广播
- 持久化存储方式
- SharedPreferences的格式
- xml解析方式
- json与xml的区别,json为什么比xml更好
- Android view绘制流程
- surfaceView
- sp, dp, px的区别
- 机型大小适配
- 适配语言
- ANR 什么时候出现,如何排查
- Android动画
- startService与bindService的区别
- Service保活方式
- java泛型,<? extends T>能否add元素
- 重写equals方法需要重写hashCode方法吗
- ThreadLocal
- wait,sleep,yield,join的区别
- 算法1:字符串全排列
- 算法2:删除链表中倒数第n个节点
4、 微信视频号安卓工程师
Android
- 讲一下Android发生Crash的整体流程
- Native层Crash是如何捕获到的?
- Java层Crash是如何捕获到的?
- 如何做到发生异常时不会杀死APP?在
UncaughtExceptionHandler.unCatchException方法调用Looper进行死循环可以 - 讲一下Handler机制
- Looper的定时器是用如何实现的?
- APK包里有什么?
- APP在运行时是通过什么来获取到layout文件的?
- 讲一下surfaceview跟textview
- Activity A 启动 Activity B 时,他们在同一个栈的情况下生命周期以及执行顺序是怎么样的?
- Destroy()方法是什么时候调用的?
Java
- 有什么线程同步的机制?
- volatile关键字讲一下。
- volatile如何实现可见性?
- synchronize如何实现可见性?
- volatile防止指令重排代码级别如何实现?
操作系统
- 讲一讲操作系统内核态跟系统态的了解。
- 操作系统内核是什么?
- 操作系统内核本质上就是操作系统代码的常驻机构。
- 操作系统内核就是管理所有代码和数据结构的集合。
- 操作系统内核是软件和硬件之间的媒介。
- 为什么操作系统要有内核态、系统态的存在?
- Linux有什么信号?
- sigill信号在什么情况下会触发?
5、抖音社交Android工程师
一面
- 项目
- volitale与synchronized的区别
- 手写单例
- 匿名内部类如何持有外部类对象
- 内存泄漏的概念
- 内存泄漏的场景
- 内存泄漏检测的工具
- handler原理,sendMessage与sendMessageDelay如何保证Message放入MessageQueue中的顺序
- 两个Message相隔5秒,这5秒内线程会一直阻塞吗
- 自定义 View如何特殊处理wrap_content,padding的实现
- MVVM和MVP 的区别(引出了一系列问题,不是很了解就直接说不了解比较好)
- LiveData与RxJava的区别
- LiveData生命周期感知如何实现
- 介绍RxJava
- https与http的区别,中间人如何修改密钥
- 算法:二叉树z字形打印
二面
- 项目
- final、finally与finalize的区别
- java开启一个线程的方式
- Thread.start()与直接调用run()的区别
- Java默认提供了几种线程池
- thread{ i++ }执行10次结果,如何让i最后等于10
- synchronized与reentrantlock区别
- 死锁
- 悲观锁乐观锁
- gc垃圾回收
- 垃圾标记阶段,Python如何实现的断开循环引用
- Retrofit返回的是什么数据类型
- 服务器返回的数据有哪些类型,为什么不能用xml类型返回
- 请求数据这个过程发生了什么
- get与post请求的区别,get与post携带数据的区别
- java注解
- kotlin扩展函数原理
- 算法:两个链表相加
三面
- main方法执行之前发生了什么
- System.out.println(“a”)将字符输出到屏幕发生了什么
- 双击QQ发生了什么
- 浏览器输入url发生了什么
- 根据前序遍历和中序遍历输出后序遍历
- 如果排期只有一周的任务,但是以我的能力需要两周才能完成,这个时候你会怎么办。
- k个一组反转链表
6、抖音电商Android工程师
一面
- 实习学到的架构
- MVVM
- Dagger原理
- livedata原理
- 进程和线程
- 操作系统IO模型
- 进程通信方式
- 管道通信原理
- TCP协议如何实现可靠传输
- UDP如何实现可靠传输
- java创建线程
- 线程池原理
- 线程池拒绝策略
- synchronized与reentrantlock实现方式的区别
- AQS原理
- handler原理
- Retrofit原理
- 算法: 二叉树右视图 — 非递归实现
二面
- Navigation的优缺点
- 如何实现的自定义navigate方法切换fragment,如何让被覆盖的fragment感知到生命周期
- gc如何判断垃圾对象
- 成员变量与局部变量的区别,局部变量的值一定是存放在堆中吗()
- jvm类加载的时机
- jvm类加载过程
- 双亲委托机制是什么
- 双亲委托机制什么时候会被破坏
- 内存泄漏是什么
- volatile的作用
- 写一个死锁
- 算法:判断A是否是B的子树
三面
- 自己是如何学习Android的
- 实习过程中的难点说一个
- 实习过程中和哪些人接触的比较多
- 如何和别人沟通的
- 挑一个项目说一下
- 里氏替换原则
- http状态码
- http多路复用
- 数据库
- 算法 汉字表示的数字转成阿拉伯表示。
7、小米android开发
- http与https的区别。
- Java构造器工作工程。
- Java中的引用类型有哪些。
- http,http1.1,http2.0有啥区别。
- TCP/IP最大容量的意义是什么?
- 还有Integer与int类型区别?各自怎么比较大小?
- 还有垃圾回收机制还有final的用法
- 为什么HashMap在1.8中采用了红黑树?你能说下啥是红黑树吗?啥是平衡二叉树?啥是二叉搜索树?啥是满二叉树?
- Java1.7采用数组加链表与1.8采用红黑树有啥区别?
- HashMap 线程不安全原因是啥?分版本作答
- 如果线程安全的话 要用哪个?我说Hashtable。他说HashTable效率太低,怎么安全又效率高?
- 对称加密与非对称加密?
- SSL是干嘛的?
8、美团移动端一面
- jvm内存模型
- new 对象的过程
- 类加载过程
- ClassLoader源码
- final关键字
- 匿名内部类
- 讲下垃圾回收算法
- LinkedList && ArrayList
- hashMap
- 常用注解,spring中的注解
- 锁,synchronized底层原理
- https && http
- 浏览器输入地址后的过程
- 状态码 303 304
- 你知道的设计模式
- 单例模式 说了双重校验锁,静态内部类 ,不同场景下如何选择
- 双重校验锁为什么要两次判空
- volatile,指令重排