阿里(内推一面挂)
一面(大概13分钟左右)
- 问我最近在做什么项目,回答没做项目,学习算法,复习基础等(这里给自己挖了坑。算法没复习好)
- 讲一讲动态规划,什么问题适合用动态规划,大问题和子问题之间的关系,线性规划呢(子问题之间不是独立的,自底向上,最优子结构,重叠子问题)
- 知道的排序算法有哪些,最优的排序算法是哪个?(这个需要分清况,数据量大或者小,结合Arrays.sort()源码情况分析了一下)
- http状态码(403重定向都答出来了,不挂我挂谁。)
- http和tcp关系,https
- 触摸屏幕上的按钮会发生什么事件,事件分发
- 数据从手机上的客户端发到服务端经历了什么,过程是什么(当时觉得这个问题很抽象,不知道怎么答,只答了字节流字符流TCP三次握手等)
总结:放轻松,往自己的方向引导,比如项目等。最后问面试官我存在的问题:基础应该再深入、加强了解。
上海汉得(面试都通过了,但是部门不缺Android,最后没拿到offer)
一面(全程只聊项目,演示项目)
二面(14分钟)
- 各类框架:网络、图片
- 启动模式和应用场景
- 启动Activity方式
- 事件分发机制(这个每次都能说很久,拖时间0.0)
- HashMap(建议看完大部分源码,必须很熟)
- 项目
- Android 6.0新特性
- 内存泄露场景分析
总结:
SingleTop:收到消息时的页面,如QQ,十条消息总不能是十个页面
singleTop适合接收通知启动的内容显示页面。例如,某个新闻客户端的新闻内容页面,如果收到10个新闻推送,每次都打开一个新闻内容页面是很烦人的。
singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。
singleInstance适合需要与程序分离开的页面。例如闹铃提醒,将闹铃提醒与闹铃设置分离。singleInstance不要用于中间页面,如果用于中间页面,跳转会有问题,比如:A -> B (singleInstance) -> C,完全退出后,在此启动,首先打开的是B。
携程(内推一面挂)
一面(37分钟)
- Java基础部分
- char能否存储汉字
- 接口能否继承多接口
- 多线程实现方式(只答了两种,实际有四种,参考链接:Java实现多线程的四种方式)
- JVM相关,GC(JVM答的太少,了解的很片面)
- 面向对象特性
- 多态实现原理:静态分派和动态分派参考链接:多态性实现机制)
- 抽象类和接口(区别没有答得很好)
- 堆栈、方法区
- 静态方法能否调用非静态方法(表达有问题,能还是不能,表述不清晰)
- Android部分
- 启动模式
- 消息机制
- 事件机制
- 数据持久化(ContentProvider没答上来)
- 一共几个Context?ApplicationContext,getApplication(),getApplicationContext()区别?Context理解(没答完整)( getApplication()是用来获取Application实例的,但是该方法只在Activity和Service中才能调用;在一些其他的地方,比如说当我们在BroadcastReceiver中也想获取Application实例,这时就需要用getApplicationContext()方法)
- fragment生命周期
- 自定义View流程
- 相对布局和线性布局效率,其他布局呢
- 谈谈自己的项目
总结:未通过原因,Java基础答的太差
腾讯(offer get)
内推一面(33分钟)
- Java基础
- JVM垃圾回收(注:内存模型和堆的分区是两个不同的问题)
- Minor GC触发时间(当JVM无法为一个新的对象分配空间时会触发Minor GC,比如当Eden区满了。这时会把Eden区存活的对象复制到Survivor区)
- 方法区中的类信息会改变吗
- 多线程的理解、作用,线程池的作用:(a.减少在创建和销毁线程上所花的时间以及系统资源的开销b.重用线程,降低延迟 c.过适当地调整线程池中的线程数目,也就是当请求的数目超过某个阈值时,就强制其它任何新到的请求一直等待,直到获得一个线程来处理为止,从而可以防止资源不足。)
- 线程同步的方法,同步的作用(控制对共享资源的读写访问)
- Android基础
- Home键之后的生命周期、启动另外一个Activity的生命周期
- 内存泄露,弱引用使用时需要注意什么,是用Minor GC回收吗?
- 自定义圆的View属性需要注意什么?(padding,无margin,还有什么。wrap_content)
- C++:智能指针
- 算法
- 归并排序,快速排序终止条件,left,right能否相等,如果所有的数都相等的情况快排分析
- B树。(操作系统文件索引就是B树)
内推二面(33分钟)
- 随机向数组中插入100个不重复的数字,手写代码
- MVC,MVP,MVVM
- 内存优化,性能优化
- 怎么学习的
- 启动线程,strat,run区别,start中是怎么调用run的
- 线程同步,线程安全 (线程安全就是多线程访问时,采用了加锁机制,当一个线程访问该类的某个数据时,进行保护,其他线程不能进行访问直到该线程读取完,其他线程才可使用。不会出现数据不一致或者数据污染。线程同步,同步就是协同步调,按预定的先后次序进行运行。在多线程编程里面,一些敏感数据不允许被多个线程同时访问,此时就使用同步访问技术,保证数据在任何时刻,最多有一个线程访问,以保证数据的完整性。线程同步也就满足了线程安全)
- 项目
- 有没有阅读开源代码(建议至少完整熟悉一个框架的源码,图片加载,网络请求等)
内推三面(48分钟)
- 基本类型和引用类型区别,使用场景
- 抽象类和接口区别
- 重载重写原理
- 框架,有没有了解过大型项目架构(平常可以看一些架构文章,推荐InfoQ)
- 内存泄漏
- 项目
- Handler机制
- 进程间通信机制(Binder)
- 算法:如何对一篇文章中的单词排序,单词的每个字母都要排序(似乎可以用Trie树,当时并没有答上来)
- finalize,finally,final区别
内推四面(卒,全程只问了两个问题,都答的不是很好,面试直接结束)
- 字符串去空格,不允许新开内存,只在原来的字符串操作。用c写
- A,B两个人,有一筐苹果98个,每人每次可以拿1个或者2个,A先拿,然后B拿,一直循环,问A一定会拿到最后一次苹果的策略。
校招一面
- TCP,UDP区别
- TCP断开连接过程
- 排序算法(复杂度,稳定性)
- 设计模式(这部分自己由于有相关课程,比较擅长,讲的时候会结合类图、分析优缺点等)
- 类加载机制
- 多线程实现方式
- synchronized和lock对比
- 线程通信方式(wait,notifyJava并发包)
- Activity生命周期图(必须完整画出来)
- 性能优化
- 缓存实现方式
- NDK
- Binder
- 看过源码吗
- 热修复
- 注入
校招二面(1小时40分钟)
- 安卓系统架构(画图)
- Binder机制
- 安卓系统启动过程
- Activity启动过程(画图)
- TCP,UDP
- HashMap
- Zygote
- 四种引用区别
- 性能优化,内存优化,Handler内存泄漏
- ListView加载图片如何避免OOM
- 收到一个短信的过程
- 有哪些Systemserver,它和ActivityManagerService之间的关系
- 设计模式,Android中有哪些设计模式
- C++虚函数,多态实现原理
- Static关键字在C,C++,Java之间的区别
- 进程通信,各种通信方式之间优缺点
- 四大组件,ContentProvider使用方式
- Linux查看文件命令
- Linux文件权限
- SELinux
- 快排,堆排序,希尔排序(给一个例子,需要写出每一次排序过程,这里需要对排序算法非常熟悉,因为给的数据例子有坑0.0)
校招三面(电话加面15分钟)
- 项目难点
- 性能优化,内存优化,内存泄露
- GC算法
- 有没有看过开源UI库,你的github上有哪些项目
- 看过哪些安卓源码
面试官给的建议:多看源码、多看开源项目
CVTE(offer get)
1、2面
- HashMap,hashCode
- 多线程
- 算法:找出出现次数第二多的数字,如果有多个,则输出多个
- 设计模式
- 项目架构图,技巧:问我项目的时候可以扯到MVC,MVP,MVVC架构
- 算法:字符串数字输出整数,”-12133313”输出整数,包括数字,char[i]-‘0’;(48)
- 进程间通信机制,AIDL生成的源码
HR面
- 性格优缺点
- 印象最深刻的事情
- 如果拒绝CVTE会因为什么原因
- 职业规划
总结:最好对公司的产品能有较深刻的认识
招行信用卡中心(只有一面,卒)
- 手写SQL分页查询、删除脏数据,只保留第一个数据
- Java异常体系
- 根据银行卡前三位或四位或五位确定银行卡的种类(使用trie树,当时没答上来)
华为(一面卒)
- 只问了项目、成绩、获奖
总结:面试全程都没问我技术,都是我在说,后面一直在问我成绩,获了什么奖,在什么时间获得的,挂的原因可能是项目不合他胃口吧(同学都过了一面,就我一个人回学校了…)
滴滴(offer get)
内推一面
- os(select/epoll)区别
- 工厂模式、单例模式
- protected,final
- 数据库引擎,mysql的引擎innodb和其他引擎区别
- 数据库索引原理,数据库联合索引ABC,只查询AC可以吗
- int,long在32,64位操作系统大小
- 冒泡排序,快排最好时间复杂度
- 其他问题,工作和生活冲突了怎么办等
- http,tcp分别属于哪一层,数据从客户端传到服务端的过程
- http状态码403,404,304,500,502
内推二面
- 删除文件(可能为文件夹),写伪代码
- 写一个队列的生产者消费者模式
- 进程线程区别,了解协程吗(差点当成携程了.)
- 数据库左链接、右链接
- 软件开发过程理解
- 面向对象和面向过程理解
- drop,delete,还有一个啥没听清truncate,这三者的区别
- 冒泡排序,快排最好时间复杂度
- 一致性哈希算法
搜狐一面(后面没消息了):
- 广播有几种
- service启动方式
- Activity A跳转到B的生命周期调用
- HashMap,HashTable,CocurentHashMap,ArrayMap
- GC机制
- 数据持久化方式
- 内存泄露
- 四种引用区别
- 事件分发机制
- Android多线程实现方式
- 数据库几种连接区别
- 图片加载框架:Fresco,Picasco
- volly优缺点
头条一面 50分钟 卒
- 线程同步方法(关键字,并发包)
- wait/notify,notify方法和notifyAll方法区别,notifyAll方法唤醒的线程,怎么决定哪一个线程得到运行
- HashMap(要很熟悉),put过程,get过程
- 现在key为double类型,需要将key的整数类型当成同一个key应该怎么做(提示:重写方法)
- 内存泄露分析
- 进程间通信方式(别忘了BroadcastReceiver)
- A跳转到B的生命周期调用,如果A的onStop方法方法发生在B的onResume方法之前会发生什么现象,如果B是singleTask又是什么情况?会调用B的哪些方法
- service运行在什么线程
- Handler内存泄露原理(message.target = handler,所以真正原因是由于message造成的),解决方法,一个线程可以有多个Handler吗。
- handler的sendMessage方法和postRunable方法区别
- HandlerThread
- 设计一个图片加载框架,LRUCache原理
- 看过第三方库的源码吗
- 排序算法,时间复杂度,快排为什么是NlogN
- 完全二叉树高度
- 弱引用和软引用