29)Java中如何判断一个对象是否存活,有哪些GC Root根节点;
30)Java中异常体系;
31)什么时候出现内存溢出、用过什么内存泄漏的工具;
- 二面
1)熟悉那些设计模式呢?
2)动态代理底层是如何实现的?
3)讲讲Retrofit的动态代理吧
4)能简单说说JVM内存模型的目的以及在内存中区分为哪些区域吗?
5)内存回收机制大致讲讲呗?
6)类加载机制完整细致的描述一下把
7)类加载器的双亲委派原则说一下吧?(这里有一个疑问,我说父子类加载器不是继承关系,然后面试官说不太对,这里我有一点点疑问,还请大家告知一下)
8)能说一下Java .class文件的结构吗?
9)线程池的基本机制有了解吗?非核心线程如何保证延迟结束?
10)为什么内部类会默认持有外部类的引用?
11)Handler消息机制简单说一下吧(延时的消息是如何发送的?以及通过Looper.loop()是如何处理延时消息的?)
12)为什么Handler会出现内存泄漏?
13)View中的post和handler的post有什么区别?(我说view中的handler是经过重写的,会处理关于View的相关绘制事件,然后面试官说只回答对了一部分,我有些疑问,还有其他的区别吗?)
14)有用到什么内存泄漏检测的框架吗?知道原理吗?(就是上面所说的JVM内存回收机制)
15)知道关于性能优化相关的吗?能简单讲一下吗?(布局,异步,过渡绘制)
16)能讲一下Activity的启动流程吗?
17)听你讲到了进程间通讯,PackageManagerService和ActivityManagerService进行通信的方式是什么?
18)Binder驱动底层原理了解吗?(mmap的内存地址映射)
19)Serializable和Parcable有什么区别?如何使用?
20)听你说到了sp(SharedPreference),你知道sp能跨进程通讯吗?
三面
1)自我介绍
2)讲个项目,自己最熟悉哪一个
3 )项目做了什么
4)网络请求框架怎么封装
5)还遇到什么问题没有
6)事件分发机制,多个RecycleView 嵌套怎么处理
7)OkHttp源码
8)讲一下拦截器
9)Cache缓存是怎么做的
10)图片做过吗
11)你的图片项目怎么加载大图
12)如何防止OOM
13)做过View 的性能优化吗
14)讲一下View的优化
15)层级布局
16)如何减少绘制
17)针对measure和draw 有什么优化的地方吗
18)多个view 加载卡顿怎么办
- HR面:
1)自我介绍,抓住介绍的点让你详细说说?
2)期望工作地点
3)事业群介绍
4)为什么想要留在北京
5)为什么不读研究生
6)如何看待Android开发,为什么不接触IOS呢
7)刚开始工作压力会很大,你有没有想过怎么处理压力呢
反问
8)有没有健身房
9)有住房补贴或者房源推荐吗
10)招多少个Android应届生呀
11)应届生培养方案
12)为什么来美团?你对美团技术团队的了解有多少?
关于程序员的几个阶段
每个程序员、或者说每个工作者都应该有自己的职业规划,如果看到这里的朋友没有自己的职业规划,希望你可以思考一下自己的将来。
常常思考自己的未来,也从自己的思考中总结出了一些东西,作为第一部分来谈谈。认为一名程序员应该有几个阶段(以下时间都算上实习期):
-
第一阶段----三年
-
我认为三年对于程序员来说是第一个门槛,这个阶段将会淘汰掉一批不适合写代码的人。这一阶段,我们走出校园,迈入社会,成为一名程序员,正式从书本上的内容迈向真正的企业级开发。我们知道如何团队协作、如何使用项目管理工具、项目版本如何控制、我们写的代码如何测试如何在线上运行等等,积累了一定的开发经验,也对代码有了一定深入的认识,是一个比较纯粹的Coder的阶段
-
第二阶段----五年
-
五年又是区分程序员的第二个门槛。有些人在三年里,除了完成工作,在空余时间基本不会研究别的东西,这些人永远就是个Coder,年纪大一些势必被更年轻的人给顶替;有些人在三年里,除了写代码之外,还热衷于研究各种技术实现细节、看了N多好书、写一些博客、在Github上分享技术,这些人在五年后必然具备在技术上独当一面的能力并且清楚自己未来的发展方向,从一个Coder逐步走向系统分析师或是架构师,成为项目组中不可或缺的人物
-
第三阶段----十年
-
十年又是另一个门槛了,转行或是继续做一名程序员就在这个节点上。如果在前几年就抱定不转行的思路并且为之努力的话,那么在十年的这个节点上,有些人必然成长为一名对行业有着深入认识、对技术有着深入认识、能从零开始对一个产品进行分析的程序员,这样的人在公司基本担任的都是CTO、技术专家、首席架构师等最关键的职位,这对于自己绝对是一件荣耀的事,当然老板在经济上也绝不会亏待你
一些面试建议及小技巧
第一部分总结一下,我认为,随着你工作年限的增长、对生活对生命认识的深入,应当不断思考三个问题:
1、我到底适不适合当一名程序员?
2、我到底应不应该一辈子以程序员为职业?
3、我对编程到底持有的是一种什么样的态度,是够用就好呢还是不断研究?
最终,明确自己的职业规划,对自己的规划负责并为之努力
关于专业技能
写完项目接着写写一名7年工作经验的Android程序员应该具备的技能,这可能是Android程序员们比较关心的内容。我这里要说明一下,以下列举的内容不是都要会的东西----但是如果你掌握得越多,最终能得到的评价、拿到的薪水势必也越高。
关于知识积累
- 1. Android基础 & 常用
针对Android基础&常用知识,我认为对于初级开发者来说,按照优先级最主要的知识点主要包括:四大组件、布局使用、多线程 & 动画;
具体介绍如下:
- 2. Android进阶
针对Android进阶知识,按照优先级最主要的知识点主要包括:自定义View、性能优化,具体介绍如下:
- 3. 与时俱进、热门技术
除了基础日常使用的Android知识,我们还需时刻关注行业动态,与时俱进的学习新技术,如近些年来较为热门的Android新兴技术包括:Flutter、热修复、插件化等;
同时,了解 & 学习常用的开源库也十分重要,常用的开源库主要包括图片加载、网络请求、异步处理的开源库,具体类型如下:
- 4. 编程语言:Java与Java虚拟机
Android是基于Java的,所以学习Java和Java虚拟机(JVM)十分重要
对于学习Java,我们移动端开发学习Java不需要后端那么深入,我认为作为Android开发者,学习的内容包括:语言特性、基础使用、集合类&机制。具体介绍如下:
对于Java虚拟机(JVM),属于底层 & 原理性的内容,具体介绍 & 学习的内容包括:
- 5. 计算机基础
除了学习Android特定技术外,对于程序员来说,计算机基础素养也是十分重要,即所有从事技术行业的程序员都该具备的基础知识。
计算机基础主要包括:数据结构、算法和计算机网络,具体介绍如下:
- 6. 额外
当你学习完上述知识后,你应该已经能称得算是一个中级Android开发工程师了,可以尝试向高级Android开发工程师进阶。
此时,我认为有3个方向可以尝试:技术专家、架构师 & 管理层,具体介绍如下:
针对Android程序员,除了上面的知识体系,我这边给大家整理了一些资料,其中分享内容包括不限于高级UI、性能优化、移动架构师、NDK、混合式开发(ReactNative+Weex)微信小程序、Flutter等全方面的Android进阶实践技术;希望能帮助到大家,也节省大家在网上搜索资料的时间来学习,也可以分享动态给身边好友一起学习!
由于文章篇幅问题复制链接查看详细文章以及获取学习笔记链接:https://shimo.im/docs/QVGDhCjVKvQ6r6TJ
或者可以查看我的【Github】里可以查看
关于HR面试
如果你过五关斩六将,成功地通过了所有的技术面,那么恭喜你,你离升职加薪、出任CEO、迎娶白富美、走向人生巅峰又进了一步。但是还没有到谈薪资待遇的时候,最后还有一个考验:HR面试。基本所有的大公司都有这一轮的面试,不要小看HR面试,很多公司的HR对于面试者都有一票否决权的----即使前面的面试对你的评价再高。
所以,这轮的面试也必须重视起来,HR面试主要问的是几点:
1、简历中写的过去工作经历的离职原因
2、当前公司薪资待遇
3、期望能到怎样的一家公司
4、个人未来的发展方向
我专门提一下第2点。可能有人比较排斥也不想说这个,我个人倒是持开放状态,问了就说了,当然一些的夸大还是必要的,当前公司薪资待遇多报个一千块钱完全没问题(毕竟是一家互联网公司总多多少少有些补贴啊什么的嘛)。因为这和你在新公司能拿到的薪水关系不大,新公司能拿到的薪水的决定因素是整个公司的薪资情况以及根据你的面试情况在公司的定位,都是有固定的薪资范围的。HR问这个主要也就是心里有个数并且看你是否诚信----有些公司入职时会要求你提供最近一家单位的银行流水号。
HR面试就说到这里了,总结起来其实就是四个字:滴水不漏。整个面试过程态度积极向上,不要有任何悲观消极的态度(尤其在谈到以前公司情况的时候,即使有再多的不满),就不会有问题。
关于面试心态
这个嘛,其实在公司也面试过几个人,一半以上的面试者回答问题的时候都属于那种双腿发抖、声音颤抖的类型。在我看来这大可不必并且这还是扣分项,回答问题的时候最最基本的两个要求:
1、不紧不慢,平心静气
2、条理清晰
表达能力绝对是面试的时候重要的考察项目。咱们做的是程序员这一行,讲究的是团队协作,不是写作、画画,一支笔、一个人就行了,一个表达能力不行的程序员,要来又有什么用呢?
除此之外,就是保持良好的心态。古语说得好,只要功夫深,铁杵磨成针,面试的成功与否,在于平时的积累,临时抱抱佛脚,看两道面试题是没有用的,只要平时足够努力,成功是水到渠成的事情,平时不怎么研究技术的,那也就是个听天由命的事情,只要充分地展示平时自己的所学就可以了。
因此在我看来,不要把面试当作面试,当做一次技术交流,把面试的心态从我要找到一份工作转变为我要通过面试去发现不足、提升自己,这样就会平和多了,即使失败也不会有太多失望的感觉。
另外,如果平时自己热衷于研究技术的朋友,真的要有自信,不要觉得别人面试你别人就比你厉害。面试官未必比你优秀,他问的问题往往都是他平时研究得比较多的问题,你一样有很多自己的研究面试官未必知道。
结语
文章写到这里,感觉有点像鸡汤文了,那就以最后的鸡汤作为结尾吧。
我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。
其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。
真的要有自信,不要觉得别人面试你别人就比你厉害。面试官未必比你优秀,他问的问题往往都是他平时研究得比较多的问题,你一样有很多自己的研究面试官未必知道。
结语
文章写到这里,感觉有点像鸡汤文了,那就以最后的鸡汤作为结尾吧。
我相信乔布斯说的,只有那些疯狂到认为自己可以改变世界的人才能真正地改变世界。面对压力,我可以挑灯夜战、不眠不休;面对困难,我愿意迎难而上、永不退缩。
其实我想说的是,我只是一个程序员,这就是我现在纯粹人生的全部。