现在的市场环境确实不大好,失业人群一大把,招人的公司就开始提高要求,各种为难应聘者,对于可有可无的岗位,甚至会压工资。我这几天面试了几家公司,目的有以下几点:
1、跟现在老东家签约的合同快到期了,想出来看看新机会,有好机会就考虑挪挪窝了;
2、现在外面的市场是个什么样子,求职的人和招聘的人比例;
3、市场对于一个高级/资深开发工程师的要求是什么样子(毕竟纸上得来终觉浅,觉知此事须躬行);
4、年龄到底是不是个坎。
下面说说自己面试了几家公司遇到的一些面试题目吧,感觉无论自己怎么准备,好像永远达不到面试官满意的程度,或者说自己总有很多不会的,稍微一问深了,就不会了,这也怪自己技术栈深度不够、广度不够,没面过,没经验。
而且各个面试官真是看心情,路数完全不一样,有的只问java特别特别基础的知识,比如面向对象的设计原则、比如char占几个字节,能不能存中文。。。有的问android性能优化,有的只考算法,有的可能来个脑筋急转弯。不过这也激励自己要努力,不能再每天无所事事的,做完公司那点活了,不去主动更新自己,也知道自己到底有几斤几两了,当别人问自己的职业规划时,自己也思索着,以后到底想发展成什么样。
面试题目
一个创业公司
(发现问下来几乎全是java基础知识,几乎没有android知识)
先是笔试:
-
生产者消费者模型用线程方式实现、按元素大小拼接两个链表
-
同步和异步的区别
-
阻塞和非阻塞的区别
-
泛型擦除
-
集合中线程安全的类和非线程安全的类(SparseArray和ListArray的区别,SparseArray怎么存数据、取数据)
-
Gradle插件怎么做
-
https怎么实现防抓包
-
封装第三方库等等;
一个五六百人的民企
-
线程池
-
消息推送(自己做一个消息推送怎么实现)
-
Exoplayer相对于系统的MediaPlayer有什么优点
-
h5面面加载缓存,和原生怎么传递数据
-
MQTT和XMPP有什么区别,为什么会有那么多协议
-
https的原理,中间人攻击
-
怎么中断一个线程
字节跳动
1.自我介绍
2.jvm虚拟机
3.接口和抽象类区别,如果一个类不需要被继承应该怎么做,final,那在什么情况下我们会使用final修饰类呢...
4.invokeVirtual,invokeInteface,为什么你会觉得抽象类的效率高(我说了查找字节码指令上)如果是单继承和实现一个接口的情况呢,你应该要有自己的理解......
5.HashMap的equals和hashCode()作用,如果不覆写hashcode会怎样
6.Exception和Error的区别是什么,Exception一定要我们自己解决吗
7.泛型了解吗? 那泛型擦除是在编译阶段还是在加载阶段?怎么理解类型擦除的概念
8.泛型里面的extends和super的区别
9.线程,网络请求为什么要新开一个线程
10.ANR有几种情况
11.线程里面可以操作UI吗
12.HandlerThread
13.Handler原理
14.异步发送的都会到同一个消息队列里面吗
15.线程和handler,Looper,MessageQueue的对应关系
16.怎么处理这个延迟消息,我答了messageQueue里面有一个链表的结构,通过时间排序,到了时间就取出,没到时间就阻塞
17.说说动态代理
18.注解
19.你是怎么理解子网掩码的概念的?
某上市公司
-
AsyncTask原理,在子线程中定义AsyncTask实例可不可以,为什么不可以呢
-
OkHttp原理(说了那些拦截器)怎么实现多路复用的(这个主要从https实现多路复用的原理上谈,用了二进制分帧,那okHttp其实就是按分帧来读取,具体可以自己看看相关博客)
-
Handler的机制,android内部是怎么实现发送延时消息,(一开始以为是用个类似于Timer之类的定时任务,后来才知道是用系统开机时间+延时时间得到一个时间T1,当手机当前时间到了T1的话,就会把消息发送出去。但有可能UI线程被阻塞了,所以到了T1时间,也不能确保100%这个Message被发出去的)
-
性能优化减少apk体积,怎么减小so包的体积呢
-
怎么给一个应用加固
-
**ANR的原理,**怎么从trace.log中找到ANR的原因及出现的地方(找到main thread),如果只是在主线程中Thread.sleep(10S),会不会出现ANR
-
JNI层的Crash怎么定位(通过ndk中相应的工具addr2line ndk-stack等可以定位到行)
-
广播为什么能作为四大组件,有什么特殊之处(经面试官提醒,能实现一对多通信),本地广播的实现原理
-
Android中设计Fragment的好处,那有了Activity为什么还要设计出Fragment来呢(解耦)
-
ViewStub为什么能实现延迟加载(它没有进行测量和绘制,只在调flate或是setVisibility时才会加载进布局)
-
Binder怎么实现进程间通信的,怎么注册服务的。。。。
。。。。还有很多题,就不一一举例了,只能说给自己一个教训,很多东西看深点就不会多问一点就不知道了。
创业公司想招团队负责人
做过哪些性能优化,Leakcanery的原理,怎么检测内存泄漏的
android的新技术你用了哪些
你认为你应用中做得比较nb的地方有哪些,你认为你项目中解决了哪些技术难点等等。。。
我认为反常规的面试
1)直接拿着我做的公司某个应用开始一通批判,觉得我自己对自己做的应用都不负责任,还有什么理由来应聘你,问你认为你最善长做的是什么,比如UI、功能、性能优化等,你要说UI吧,你这UI做得怎么怎么的,你要说性能吧,应用性能也确实一般般,让我觉得我没有啥善长的。回来我朋友说我们公司害了我,因为我现在的公司做的应用要求太低了,能用就行。但是别人对我要求松,我得对自己严要求、高标准〜〜〜〜
2)上来弄个类似于脑筋急转弯的题
Set<Short> stack = new HashSet<>();
for(Short i = 0; i < 100; i++) {
stack.add(i);
stack.remove(i-1);
}
System.out.println(stack.size());());
我以为会抛异常,面试官问要是不抛,又会输出什么,我想着输出1呢。后来自己下来试验了一把,发现输出100,让我百思不得其解。后来百度搜索,经别人提点才知道因为i-1这里用到了隐式类型转换i-1会转成int型的减法,所以在remove时,根本没有那个对象,所以无论怎么调stack.remove(i-1)都不会有元素移出,我不得不感叹面试官设计的陷阱。
面试感言
通过这轮面试,让我知道了自己的差距,自己的研究的东西太浅薄了,而且没有自己的优势或者说专长。
现在的面试理论知识、底层原理问得很多,你不仅得知道怎么做,还得知道为什么这么做,自己没有任何准备就去面试了,可能这也是一个原因吧,被虐的很惨。
总的来说,自己劣势挺明显的,没有在某方面有很深研究,没有什么优势,知识面的广度和深度都不够,这方面要加强,同时作为一个有娃的女程序员,已经被别人否掉了50%了,所以必须从技术方面加强吧。
这几天在网上找面试资料的时候,发现一份Android进阶指南还总结的不错,秉着好东西就要分享的原则,下面分享给大家:
1.高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
2.NDK模块开发
时至今日,短视频App可谓是如日中天,一片兴兴向荣。随着短视频的兴起,音视频开发也越来越受到重视,而且薪资水涨船高,以一线城市为例,音视频工程开发的薪资比Android应用层开发高出40%。
内容主要涉及以下几个方面:
- NDK 模块开发
- JNI 模块
- Native 开发工具
- Linux 编程
- 底层图片处理
- 音视频开发
- 机器学习
3.数据结构与算法
为什么要研究数据结构?
这是因为所有的程序本质上是对数据进行处理,如何高效的处理数据,这依赖于数据本身的结构(如类型(整型、浮点型等)、维数、是否为复杂类型(结构体类型、类类型)等)以及数据之间的逻辑关系(线性、非线性等)。
数据结构离不开算法,设计好的数据结构就是为了让算法顺利方便的实施。
4.Java进阶与内核原理
Android APP开发主流语言就是Java语言,Java语言最大的特性就是提高了软件的交互可能性,可以说安卓手机几乎所有应用程序都是利用Java语言来进行编写的。
百分之百,大大小小所有公司,面试必问Java相关。
内容主要涉及以下几个方面:
- HashMap
- ArrayList
- LinkedList
- Hashset源码分析
- 内存模型
- 垃圾回收算法( JVM )
- 垃圾回收机制和调用 System.gc()的区别
- 类加载过程
- 反射
- 多线程和线程池
- 设计模式
- Java的泛型 等等.......
5.Flutter技术进阶
2019 年无疑是 Flutter 技术如火如荼发展的一年。
每一个移动开发者都在为 Flutter 带来的“快速开发、富有表现力和灵活的 UI、原生性能”的特色和理念而痴狂,从超级 App 到独立应用,从纯 Flutter 到混合栈,开发者们在不同的场景下乐此不疲的探索和应用着 Flutter 技术,也在面临着各种各样不同的挑战。
本篇知识要点:
1、Flutter跨平台开发概述 2、Windows中Flutter开发环境搭建 3、编写你的第一个Flutter APP 4、Flutter Dart语言系统入门
6.360度全方面性能调优
随着产品内容迭代,功能越来越复杂,UI页面也越来越丰富,也成为流畅运行的一种阻碍。综上所述,对APP进行性能优化已成为开发者该有的一种综合素质,也是开发者能够完成高质量应用程序作品的保证。
1、设计思想与代码质量优化
2、程序性能优化
- 启动速度与执行效率优化
- 布局检测与优化
- 内存优化
- 耗电优化
- 网络传输与数据储存优化
- APK大小优化
3、开发效率优化
- 分布式版本控制系统Git
- 自动化构建系统Gradle
4、项目实战
- 启动速度
- 流畅度
- 抖音在APK包大小资源优化的实践
- 优酷响应式布局技术全解析
- 网络优化
- 手机淘宝双十一性能优化项目揭秘
- 高德APP全链路源码依赖分析
- 彻底干掉OOM的实战经验分享
- 微信Android终端内存优化实践
7.Framework精编内核解析
众所周知,Android是一个基于Linux实现的操作系统。但对于Linux内核来说,Android也仅仅只是一个运行在内核之上的应用程序,与其他运行在内核之上的应用程序没有任何区别。
所以Android也需要运行环境,需要Linux内核在启动完成后加载Android Framework运行所需要的资源。当Framework完成初始化后才能继续启动相应的APK应用程序。
主要内容包含:
- 深入解析Binder
- 深入解析Handler
- Dalvik VM 进程系统
- 深入解析 WMS
- PackagerManagerService
由于篇幅原因,以上完整版资料PDF如有需要,可以 点赞+评论 支持下我,然后【点击这里】免费阅读下载。
工作我还会继续找,人都是追求上进的,有好机会还是会考虑挪窝的。我不想在我30岁就干一份可以养老的工作,技术我也会努力去提升,愿我和大家都会有一个更好的未来。