扯犊子之前,先放一张面试图吧:
求职?求生?Start...
说来也怪,从入职的第一天就觉得很不舒服,然后慢慢产生离开的念头,随后转变思想,回去打算按照步骤继续学习,避免下次求职尴尬。奈何。
过去的事儿,不想再说太多了,挺坑的,也挺现实的。
孰是孰非,深究无意,备好行囊,继续出发~
感兴趣的可以点击查看:
其实上家公司带来的影响蛮大的,可能也算是成长的代价吧,还好。
本来想着,找个工作,然后好好喷喷,将那副丑恶的嘴脸曝光。直到现在确定入职公司了,电脑面前,却不知道说啥了。
人在做天在看吧,好自为之。。。
本次真实记录面试历程,希望对求职的你有一些帮助。。。
干货面试好文
不错的面试大纲:
另外还有一些营销号发布的一些技能点,也可以作为面试复习参考。
下面有自己目前整理的面试文档,后续会找个合适的方式好好整理一波。
2021 - 09 - 29
又重新开始面试,刚开始有点蒙,不过慢慢就会好起来的~
有些无奈,项目着急缺人,草草结束面试环节。
到楼下抽了两根烟,依然处于懵逼环节。
- 轻量级线程,创建协程不需要分配新的线程。默认使用已经定义好的线程池,智能调度。并且协程提供挂起(suspend)和恢复(resume)操作。
- **挂起(suspend):** 挂起当前执行的协同程序,并且保存此刻的所有本地变量。协程内部是使用状态机来管理协程的各个挂起点;
- **恢复(resume):** 从它被挂起的位置继续执行,并且挂起时保存的数据也被还原。
- [Kotlin协程实现原理:挂起与恢复](https://www.rousetime.com/2020/11/23/Kotlin%E5%8D%8F%E7%A8%8B%E5%AE%9E%E7%8E%B0%E5%8E%9F%E7%90%86-%E6%8C%82%E8%B5%B7%E4%B8%8E%E6%81%A2%E5%A4%8D/)
- 首先通过 Android Studio 提供的 Apk 分析器去获取当前 Apk 包中各个占比情况,然后根据占比进行对应处理。主要分为以下几个方面:
- So 方面:对标微信,查看对应兼容 So 情况,这里排除 So 动态加载方式,最后选择只保留 arm64-v8a。
- 资源方面:这块内容较多,可分情况举例说明。
- 开启 lint 严苛模式,物理移除用不到的资源文件,记得单独 git commit;
- 有损压缩 png 图片[TinyPng](https://tinypng.com/)。项目较大的情况可通插件的方式进行处理压缩,主要是在 processDebugResources Task 后进行对应资源处理;
- 部分 icon 类型图片替换 svg,注意使用时需要通过 compat 方式使用,src 低版本会有兼容问题;
- 部分 gif、png 升级 WebP 格式图片;
- 采用微信资源压缩,主要是通过将资源路径变短的方式以达到缩小 Apk 大小的方式。 [AndResGuard](https://codechina.csdn.net/mirrors/shwenzhang/AndResGuard)
- build 开启语言限制,代码、zip 压缩等常规基础配置;
- 限制当前 app 支持国家语言。
- 代码方面:
- 代码优化,减少冗余代码;
- 配合以上 build 常规基础配置。
其实最好还是线上沟通,后续看情况选择是否进行二次线下,这样至少对于双方而言,成本更低,面试者也不需要来来回回很多时间花费在路上,结果草草了事。
进门需要写面试题,分为单选、多选、简答。前两项都是网上多年之前的老题目,我这估计没能全对。
- 双指针、冒泡、递归
- 常见的内存泄漏方式:
- 非静态内部类、匿名内部类
- 静态的 View
- Handler
- 监听器(各种需要注册的 Listener、Watcher 等)
- 操作资源对象没关闭
- 属性动画
- 低版本的 WebView 会发生内存泄漏,主要是持有 Context 导致,高版本已修复。 [Android-WebView还会存在内存泄漏吗?](https://juejin.cn/post/6901487965562732551)
- 解决办法:
- 内部类加 static,内部使用外部类对象时,同时需要设置为弱引用;
- 及时进行对应操作的回收操作,例如:IO 流、取消注册监听、关闭动画等;
- 如果需要兼容这部分低版本机型,可以通过首先移除 WebView 后续通过 WebView 的 destroy 进行对应销毁处理。
- [Android中常见的内存泄露及解决办法汇总](https://blog.csdn.net/unicorn97/article/details/81009204)
据说是面试官是九秀直播的负责人,前期车载业务方面多聊了一会儿,剩下技术蛮深入的。
- A 页面。
- HashMap 1.7 版本之前底层数据结构为:数组 + 链表,1.8 后变为 数组 + 链表 + 红黑树。由于 HashSet 底层也是 HashMap 实现,所以两者底层数据结构一致。
- 首先拓展如何计算 Bitmap 所占用内存大小:Bitmap 宽度(px)* Bitmap 高度(px)* 像素点占用字节数
- 优化思路:
- 通过采样率压缩改变 Bitmap 宽高;
- 通过 matrix 压缩(createBitmap)Bitmap;
- 改变 Bitmap Config 为占用字节更少的 ARGB_4444 或者 RGB_565
- [性能优化:Bitmap内存大小优化的几种常见方式](https://blog.csdn.net/qq_26287435/article/details/106603029)
- 最大的。ARGB_8888 占用 4 个字节,ARGB_4444 和 RGB_565 占用 2 个字节。
- 借助 Lru 算法以及弱引用
- 当前图片颜色值,存放类型取决于使用的是什么类型的 Config。
- **onTouchEvent():** 处理屏幕上的操作,例如点击、长按、滑动等;
- **setOnTouchListener():** 获取某一个控件的点击监控。
- 两者之间区别:
- 外层 setOnTouchListener() 优先级要高于内部 onTouchEvent();
- setOnTouchListener() onTouch 返回 true(事件被消费),则 onTouchEvent() 不会执行。反之,onTouchEvent() 才会执行。
- [Android onTouchEvent和setOnTouchListener中onTouch的区别](https://blog.csdn.net/shineflowers/article/details/41080435)
晚上回家的时候 HR 小姐姐打来电话,大概沟通了半个小时左右吧。聊了很多方面,具体印象不太深了。
小姐姐声音蛮好听的,轻声细语的,很温柔,嗷嗷嗷~
后续貌似是入职时间较晚,还是业务什么原因,暂时未能牵手成功。
问了下朋友,之前面试也是被同样的理由回绝的,ummm。
害。
上家面试有点超时,后续找个哈啰,刹车还不好使,最后还跑偏了。
公司正在装修,面试过程中被装修工人打扰了几次。
面试官温文尔雅的,聊的整体还凑合吧,会的都说了,不会的也坦然说明了。
- Activity 有四种启动模式,分别为:standard、singleTop、singleTask、singleInstance。
- **standard:** 默认启动模式,每次都会新建一个 Activity 实例放入栈中;
- **singleTop:** 栈顶复用模式,当前 Activity 位于栈顶,不会创建新的 Activity 实例,而是会回调 onNewIntent()。反之,当前 Activity 位于栈内非栈顶,效果同 standard;**适用于推送详情页**
- **singleTask:** 跳转该模式的 Activity 时,首先会在任务栈中查看是否存在该实例,如果存在则会将位于这个 Activity 实例上的 Activity 全部结束,并将当前 Activity 位于栈顶;**适用于主页**
- **singleInstance:** 新创建一个任务栈,单独存放该 Activity。
1. Java 虚拟机栈(局部变量表)中引用的对象;
2. 方法区中静态引用指向的对象;
3. 仍处于存活状态中的线程对象;
4. Native 方法中 JNI 引用的对象。
初创公司,莫名的感受到不愉快,后续的面试也没用心了。mmp,请的假,白花花的现大洋出去了。
这块主要分为技术 + HR 聊,技术主要是根据他的点回去问一些东西,时不时的打断这点有点烦人,打断的频率高了之后明显个人有点不耐烦了。而 HR 会说一些公司以及项目情况,顺便也会问一些杂七杂八的东西。
工资构成主要为:基本工资 + 加班费。大小周,大周会有加班费(这点还是蛮不错的,比起那些情怀、大饼公司而言,这点确实实实在在)。
两者主要区别在于:
- Hashtable 内部实现添加了 synchronized 来确保线程同步,所以它是线程安全的,而 HashMap 则是线程非安全的。
其它区别如下:
- HashMap key 可以为 null,Hashtable key 不允许为 null;
- HashMap 实现了 Map 接口,而 Hashtable 则实现了 Map 接口以及 Dictionary 抽象类;
- HashMap 初始容量为 16,Hashtable 初始容量为 11,两者默认填充因子都是 0.75;
- HashMap 2 倍扩容,而 Hashtable 则是 2 倍扩容 + 1;
- HashMap 获取 hash,先对 key 的 hashcode 进行二次 hash,已获得更好的散列值,然后对 table 数组长度取模。而 Hashtable 则直接使用 key 的 hashcode 对数组长度进行取模以获取 hash。
HashMap 是非线程安全的。
查询更为高效,其本质通过寻址定位法去进行数据查找,效率较高。而针对插入/删除,则需要移动后续的数组下标,效率较低。
对称加密和非对称加密在加解密过程、速度、传输的安全性都有不同:
- 对称加密加解密的过程都是使用同一个密钥,且加解密的速度较快,适合数据量大时候使用,但是加密过程中无法确保密钥被安全传递,一旦泄漏,整个通信就会被破解;
- 非对称加密采用公私钥的方式,公钥加密私钥进行解密,加解密时间较长,适合数据量小的时候使用。而关于安全性而言,私钥是基于不同的算法生成不同的随机数,也就是说私钥通过一定的加密算法可以推导出公钥,但是私钥到公钥的推导过程是单向的,也就是说公钥无法反推导私钥,所以安全性较高。
- 对称加密算法:DES、AES 等,非对称加密:RSA 等。
- [非对称加密和对称加密的区别](https://www.jianshu.com/p/de50d1489359)
2021 - 09 - 30
晚上就要回家啦~ 开森~
打算白天干完农活,晚上抽空看看题~
希望能坚持下来哇~
地铁没挤上,加上路上耽搁,晚了半个小时多,进去 HR 小姐姐直接安排开始面试了,给了一瓶水,整体来说面试官蛮不错的。个人感觉比较注重基础一些东西吧。
有条件的还是要去大公司看看,至少经历的和实战的,的确不是一回事儿。长时间的日积月累,确实底蕴在那。
- **Handler:** 主要是在 Android 中负责消息处理,通过它可以实现线程之间的消息通讯;
- **Thread:** Java 进程中执行运算的最小单位,也就是执行处理机调度的基本单位;
- **HandlerThread:** 一个继承自 Thread 的 HandlerThread,Android 中没有对 Java 中的 Thread 进行任何封装,而是提供了一个继承自 Thread 的 HandlerThread 类。由于它本身继承自 Thread,所以本质就是个 Thread。与普通的 Thread 的区别在于,其内部直接实现了 Looper 的实现,有了 Looper 就可以让我们在线程中进行消息处理,如果不使用 HandlerThread 的话,需要手动调用 Looper.prepare() 和 Looper.loop()。
- [Handler、Thread和HandlerThread的差别](https://juejin.cn/post/6844904079160770568#heading-107)
- **文件共享**
- **AIDL**
- **Bundle**
- **ContentProvider**
- **Socket**
- **Messenger**
- [Android进程间通信](http://liuwangshu.cn/tags/Android%E8%BF%9B%E7%A8%8B%E9%97%B4%E9%80%9A%E4%BF%A1/)、[记一次阿里面试题:都有哪些进程间通信方式?麻烦你不要再背了](https://blog.csdn.net/hollis_chuang/article/details/107776832)
面试结束的时候,门口保安大爷询问情况,还安慰半天,哈哈哈,好贴心。
可爱的大爷~
整场面试下来,感觉很轻松。
面试官一直像个大哥一样再问自己想问的,顺便深入解惑。很不错的一场面试体验。
- 从**逻辑结构**来说,这两种数据结构都属于线性表;
- 从**物理内存**中来说,数组占用的是一块连续的内存区,而链表则是分散的,所以链表比数组多了一个指向下一个节点的指针(单向链表);
- 数组通过寻址快速定位,链表则需要依次遍历指针节点,所以数组的查询效率更高一些,其对应的时间复杂度为 O(1) 和 O(n);
- 在插入、删除时,由于数组是连续空间,会导致后续节点依次后移,而链表则只需要修改对应的指针即可,所以插入、删除的情况下链表的性能更优;
- 从**操作系统的内存管理**来说,内存管理会将连续空间提前读入缓存,已进一步提高访问效率。而链表由于在内存中是分散的,则不会都读入内存中。
- [数组与链表的区别](https://zhuanlan.zhihu.com/p/52440208)
数组本身是个对象,由 JVM 创建,而这个直接创建的对象父类就是 Object。
数组本身是不可变的,初始化的时候便会设置容量大小。但是后期可以通过扩容的方式改变大小,比如 copyOf 数组拷贝,或者 ArrayList 动态扩容。
- [JAVA中的数组是对象吗?](https://www.zhihu.com/question/26297216)
单向链表:只有一个指向下一个节点的指针。 适用于节点增加、删除。
- 优点:增加删除节点简单,遍历不会死循环。
- 缺点:只能从头到尾遍历。
双向链表:有两个指针,一个指向前一个节点,一个指向后一个节点。 适用于双向查找节点的情况。
- 优点:可以找到前驱和后驱,可进可退。
- 缺点:增加删除节点复杂度,需要额外多分配一个指针存储空间。
临走的时候,小姐姐还会让站在公司前台拍个照,???
2021 - 10 - 11
今天的两场面试整体让人觉得很无语,无语到极点。不知道该说啥了。
这假请的,无奈到极点了。。。
想喷人。。。
从住的地方骑车过去不到二十分钟吧。
约面试的小姐姐地址没发清楚,找了许久,问了保安大叔几次。
一开始只告诉 7 层,询问后告知是 3 号楼,过会儿再询问,告知 C 座。
找公司面试貌似探宝一样,折腾半天,还是先赶去下一场复试去了。
也不知道复试女面试官是 HR 老大还是老板,整个交谈想让人骂人。
吐槽几个点吧:
哎,无语到极点。一面的技术总监蛮不错的,复试的那个女的不咋地。姿态太高,高攀不起。
只能说,做个人吧。。。
真要是成立了 29 年了,不温不火、吃不饱饿不死的,哪儿来的傲娇呢?龙头老大吧,也倒是能理解。
各位避坑吧。。。浪费时间,公交折腾一个多小时,结果 mmp!
坐公交回去搞得晕车恶心难受了大半天。。。
XXOOXXOOXXOO!!!
2021 - 10 - 14
在线面试,很 nice~
不用来回折腾,也避免遇到不靠谱得白白浪费时间。
今天线上面试的四家相比前几天跑了四家,的确也没那么熬人了。
很正常的一次面试,面试官很尊重人,很耐心的听着,并且相互沟通着,整体来说蛮不错的。
Android 事件分发的本质就是,由系统 framework 层创建 InputManagerService 监听响应,并且将事件逐层下发的一个过程,整个过程属于责任链模式。
事件分发顺序:Activity ---> ViewGroup ---> View。
具体实现则由三个方法进行实现:
- ViewGroup 通过 **dispatchTouchEvent()** 开始分发事件并且内部通过 **onInterceptTouchEvent()** 判断是否拦截该事件。
- 如果拦截,则当前事件流转到该 ViewGroup 的 **onTouchEvent()** 中进行具体处理。
- 如果 ViewGroup 未拦截该事件,则调用 View 的 dispatchTouchEvent() 继续向下分发。
- 如果 View 消费则会到 View onTouchEvent() 进行处理,反之依次返回 ViewGroup、Activity 的 onTouchEvent()。
需要注意的是,Activity、View 具有分发、消费,ViewGroup 在此基础上多一个拦截。
- == 比较值是否相等,=== 比较引用地址是否相等。
在如下地址先写题:
题目如下:
/**
* 完成一个数字转中文大写的函数(30分钟)
* 例子:
* 123 --> 一百二十三
* 46035 --> 四万六千零三十五
* 尽可能覆盖函数输入范围
* 可选任意主流语言编码
* 可在IDE中完成,可搜索基本函数&数据结构用法
**/
思路如下:
面试官应该是在会议室开着外放,一边问问题,一边写评价吧,个人猜测。听的不是很清楚,面试官比较随和,也比较尊重,有些东西没实战经历过,但是也让尝试说说想法,这个蛮不错的。
View 绘制的本质就是从 DecorView 自上而下遍历整个 View 树,进行测量、摆放以及最终绘制操作,这里需要注意,所有的 View 执行完一个步骤后,才会执行下一步。
1. onMeasure():测量视图大小。从顶层父级 View 到子 View 递归调用 measure(),measure() 调用 onMeasure() 完成测量工作;
2. onLayout():摆放 View 的位置。从顶层父级 View 到子 View 递归调用 layout(),父级 View 将上一步 measure() 得到的子 View 布局参数,将子 View 放在合适的位置上;
3. onDraw():绘制视图。ViewRoot 创建一个 Canvas 对象,然后调用 onDraw() 进行最终绘制。
不得不说,线上面试真的狠 nice~
点根烟,慢慢思索,nice~
HR 很贴心,考虑到来回比较折腾,主动提出初试线上电话先沟通。
时间安排上也很尊重面试者,赞一波~!!!
面试官是个小哥哥,估计在工位上吧,声音不是很大,整体沟通起来还是比较顺畅。
重新绘制方式有三种,分别是:
- invalidate:UI 线程中调用,重绘 UI;
- postInvalidate:非 UI 线程中调用,通过 Handler 通知 UI 线程重绘;
- requestLayout:先调用 onLayout() 重新排版,后调用 onDraw() 进行重绘。
公司开始是有一个兼职 Android 在开发,想着换个全职 Android。面试老哥很嗨,思路跳转蛮快的,有些问题给我整懵了。微信语音面试,有些听得不是很清楚,面试老哥应该在家里还是在吃饭,环境有点嘈杂。
整体下来还是蛮不错的吧,收获颇多。
可惜,被「中广创思」坑了之后,找工作更为慎重。也没有心动的感觉,Sorry~
2021 - 10 -16
好无奈啊,大周末的想去睡个懒觉,结果还是要大早上去复试。
其实电话沟通就得了。
小姐姐说,不用再次换地铁线,走过去 15 分钟,结果好嘛,大早上,冻成二傻子了,回去的时候果断找最近地铁了。
公司外层环境不错,有种适合养老的感受。小院子,整体风格还是蛮不错的。
缺德地图,各种导航,坑的无奈了。
面完就嗷嗷的往回家跑,回家吃串串去~
2021 - 10 - 18
万事开头难,上来遇到坑公司。
进去之前还和朋友还说呢,望京 SOHO 等电梯太墨迹了,动不动就是好几十层。
突然感觉什么叫做人性化的公司?我认为至少有以下几个特点:
填表登记,和 HR 扯犊子。稍等了几分钟,面试官过来了,感觉极度不友好。
全程有一半的时候在抠鼻屎,抠就抠吧,抠干净点也行,结果抠出来在鼻子上,盯的一度反胃,场面似乎有点尴尬。有气无力的,没啥意思,真还不如电话面试了,什么鬼。问问题问一半,我还得猜,各位避坑。
旁边那边几个人吹牛逼,大谈理想等。
挺好。嗯。
各位避坑~
到的早了,在外面冻了半天,让?老大喷了半天,啊啊啊。等我起飞的,非过去在眼跟前得瑟得瑟去~
最后实在是受不了了,两点上楼,进去发现大家都在睡觉,给 HR 小姐姐发的信息,还以为会去给打印一份简历来着,结果证明是我想多了。还是老样子,填表登记,嗖嗖嗖。
面试小哥哥很 nice,公司做 TV 相关,整体聊下来蛮不错,至少我这边有几个问题解惑了,哈哈哈~
数据平台负责人面试的,一个多小时,大概就是了解项目、学历等基本情况。
有一道不错的面试题,给我整懵逼了,记录下来:
2021 - 10 - 19
今天一整天的面试都挺无奈的,很无语。
哎。
次奥~
离得倒是不远,地铁 40 分钟左右。公司环境有些嘈杂,不过还好。HR 小姐姐蛮不错的,很热情。面试官很差劲,之前有朋友去面试过,还特意嘱咐这就是个坑。我寻思着正好去涨涨经验,看看有哪儿些是我不了解的。
面试官太差劲了。很敷衍。草草了事。懒得回答了
这个面试官太无语了,整个过程都是敷衍、糊弄的感觉,没啥意思,耗子尾汁吧~
公司离住的地方不远,自行车半个小时左右,园区蛮不错的,公司环境不赖。进门需要扫码登记,随后会在线填写相应的信息。HR 小姐姐蛮香的,声音蛮低的。和面试官整体沟通还算顺利吧。
HR 小姐姐蛮皮的,公司看着不大,正巧和另一个面试 Android 的同样走错了,正好遇到个热心的大叔,带着我们过去了。
面试官还不错,整体就是聊聊项目之类的。
2021 - 10 - 20
本以为微信语音面试,结果上来视频,哎妈呀,早知道也整点大宝蜜一下了。整体的面试还不错吧,比较考察基础性的东西。技术老大人也很 nice,很和善,效率蛮高的。
JVM 内存结构主要有三大块:
- 堆内存:JVM 中最大的一块,由年轻代和老年代组成,而年轻代内存又被分为三部分:
- Eden 空间
- From Survivor 空间
- To Survivor 空间
默认情况下年轻代按照 8:1:1 的比例来分配。
- 方法区:主要存储信息、常量、静态变量等数据,是线程共享区域。
- 栈:又分为 Java 虚拟机栈和本地方法栈,主要用于方法的执行。
- [jvm系列(二):JVM内存结构](https://www.cnblogs.com/ityouknow/p/5610232.html)
最后和总监聊了下,整体感觉还不错吧,可惜只是 12 薪。
2021 - 10 - 21
今天开门红,至少自我感觉还不错,难免有一些磕磕绊绊。
但是今儿复试让我气炸了!!!
门口保安大叔很暴躁,本来打算跟着人流混进去的。结果尴尬了。人脸识别的。给我好一顿说,直接给我晾一边去了。得亏遇到个公司同事,帮忙解围,还顺带带我进公司去了。感谢不知名的老哥~
面试的是一个老哥,一个小姐姐,小姐姐蛮爱笑的,整体氛围很 nice。
setValue() 只能在主线程中调用,同步更新数据。而 postValue() 可以在任何线程中调用,postValue() 内部实现了同步锁,并且最终会切换主线程,也就是最终通过 setValue() 方式更新。
- 如果同时调用 postValue() 和 setValue(),则 setValue() 会覆盖 postValue();
- 如果多次调用 postValue(),则只有最后一个值能够被分发。
老哥驾着机关枪,给我一顿突突。小姐姐还好,没事儿扔个雷。
整体还是蛮不错的。
复试据说是要和人事部老大去谈。结果一到地方,傻眼了,公司环境一般吧。登记表还需要写个小作文,顿时好感消失一大半,的亏 HR 小姐姐很温柔,很 nice,耐着性子继续写了一些基本资料。
人事部领导是个更年期大妈,进门就叼着脸色,也不懂是为啥。我过来是复试了,又不是看你脸色来了,真的是。得亏鸡老大说过,没必要和这些人斤斤计较,不然我真心想怼你一顿,什么东西真的是!
说什么在我们公司,技术不是第一位的,核心是编辑团队,你们技术就是服务我们核心部门的。
对啊,没错啊,技术服务业务啊,咋了?我理解没错吧?咱又不是专业的研究所?
简单的描述自己的想法。被直接打断,说什么你不要试图反驳我?好嘛,逼得我耐着性子去说:复试是一场相互沟通、了解的一个过程,双方都可以描述自己的观点,大家在一起就是聊聊天,然后看看双方是否适合自己,没必要去抬杠,或者反驳。如果我连阐述自己的观点的权利也没,那这个沟通还有什么意义?
中广创思待了四个月,说什么这不怪你么?怪你没有提前看清公司?怪你选择不对,巴拉巴拉。。。
我 tmd !!!
双减下来之前,谁知道会出现这个?马后炮谁不会?F**K!!!
真的是,气炸我了。什么鬼真的是!!!全程想让人骂人???
真的是,您老人家更年期晚期,无可救药,自己找个阴凉地方撞墙去。
对人尊重,也是对自己尊重!
格局真的是。。。
不想说太多了,各位避坑吧。
一面的面试官还不错,技术负责人也挺和善的,就是遇到个这么个更年期货。
XXOO!!!
=o=!!!
小米的效率真的高的可以哦。一面之后没几分钟通知二面,6 啊。
面试官都很 nice~
一面面试官:
封装:将公共属性、内容进行统一封装,对外暴露入口,隐藏内部实现。
继承:对现有类进行拓展,一般为子类继承父类,重写父类方法进行拓展。
多态:类的多种表现形式。
二面面试官:
贼老贴心。
然后鸡老大说,你面试的是基础岗位吧。
=_=!! 过分
还是过不去外派外包的这个坎儿。。。
初试之后,给了个题目:
2021 - 10 - 22
园区离地铁口挺近的,进门还是老样子,填表登记,乌拉乌拉。
一面面试官据说是 Android 老大,人挺和善的。聊的还是不错的,基本掌握的都说出来了。
一面 Android 老大:
Android 中实现序列化的方式如下:
- **Serializable:** Java 本身支持的接口;
- **Parcelable:** Android 特有的接口,可用于传递 Intent 以及进程间通信(IPC)。
两者之间区别:
- Serializable 只需要实现 Serializable 即可,相当于给对象打了一个标记,系统会自动对其序列话。而 Parcelable 不仅需要实现 Parcelable,还需要添加静态变量;
- Serializable 使用 I/O 读写存储在硬盘上,而 Parcelable 是直接在内存中读写;
- Serializable 会使用反射,序列化和反序列化过程需要大量 I/O 操作,而 Parcelable 自己实现封送和解封(marshalled & unmarshalled)操作不需要用反射,数据也存放在 Native 内存中,效率要快很多。
- [??Android 序列化(Serializable和Parcelable) ??](https://juejin.cn/post/7023569402519879693)
面试效率还是挺快的,随后就安排技术部老大了,但是老大那边还在复试,和 HR 小姐姐简单的沟通了几句,随后越好下午一点半二面。
出去逛呀逛~
二面是个技术部老大,看着有点严肃。上来针对学历有点尴尬,老大开始想着怕聊半天学历不行,打算去问问 HR,再做打算,后续还是撸起袖子先了解了解。
二面研发部老大:
感觉一方面学历这块不好说,另一方面觉得我的团队配合经验少。其实这个团队配合而言,感觉就是两个关键字:沟通、妥协。目标:完成任务。
后续谈薪资比较尴尬。问了下薪资是否可谈,如果降薪或者平薪还是否愿意?介绍了下公司平台业务,以及后续公司对于技术的安排方向。
面试官是个前端,笑眯眯的。
2021 - 10 - 24
晚上将近八点,来电面试,刚开始有点蒙圈。找耳机找半天。
感觉面试小姐姐有点生涩,不过辛苦小姐姐了。
大概内容就是一些 View 绘制、事件分发、设计模式等,举个场景,给方案。
可能是平时太过于依赖后台,很多东西没有去思考实现细节,只知道客户端将搜索关键字发往服务器端,获取到结果展示就行。以后工作还是要多去考虑考虑。
后续约三面公司线下,婉拒了。
2021 - 10 - 27
其实今天早上去的时候,就有点茫茫然的感觉,躺了几天,懒得动弹,相关内容也没整理,正好去看看。
之前电话沟通过,简单聊了下项目,离职原因、基本技能之类的。后续线下进行的二面。
大概针对当前项目情况,聊了一些,包括重构相关、uni-app 等。
薪资偏低,国企旗下的子公司,五险一金全额缴纳。
之前线上沟通过一次,后续约的今天二面。
大概就是聊了下项目,掌握技能,优缺点之类的。
主要是相机相关内容,后期涉及到 openGL 相关操作。
公司是个小复式,人并不是很多。
相机这块抓住受众群体了,Pro 版本,这点不赖。
2021 - 10 -28
原来这是爱奇艺体育啊,进去整个人就懵逼了,卧槽,卧槽,卧槽,谁给我的勇气?我为啥没查到?Why?Tell me why?
不得不说 Android 技术老大真 nice,6 的一批,这才是大厂面试官应有的素质啊。
全程吊打的同时耐心引导,nice 的很。
一场面试,更是一场学习解惑,明白了自己之前的开发模式多么 lowB。(PS:每当想起这个词,就能想到鸡老大气急败坏的怼我,能别问这么 lowB 的问题嘛?那么多有意义有价值的问题你不问,为啥给人一种你之前到底是在什么贫民窟干活的感觉。。。啊,本身小公司,小作坊,ummm tui~ 老大看不见)
这个完全想骂人!!!
面试也不少了,还以为经历够多了,结果,我x!!!真的上来就能干急眼。
HR 和爷爷一样,发个位置发个鬼鬼,问一下吧,直接转发图片让打电话,随后上三楼随便找个地方开始面试,有点无奈。
面试官是个技术负责人,我x,上来抠鼻屎,抠完就抹简历上了,顿时好感全无。
全程和杠精一样,杠到我懵逼,杠到我妥协,对对对,你说的对。
结果直接被怼,Activity 都 finish 了,还怎么会发生泄漏,泄漏就泄漏呗。再换句话说,C++ 需要手动处理回收,Java 中有 GC,根本不需要你去处理内存回收的事儿。
ummm,对,你说的对。
次奥!!!
xxoo!!!!!!
大小周,早十晚九。
正巧上家线上面试,电话过来了,得亏是电脑端接听,后续回拨。
和总监聊了半个小时左右,大概就是离职原因、项目经历、安全防护等常规内容。
薪资偏低,社保全额缴纳。
总监还是蛮不错的,性格挺好。
新浪微博的体验真的友好到极致。
从招聘者电话主动沟通学历,以及后期主动提供 HR 审核,到最后通知面试,很细致。
一面面试官很不错,目前只有这么一个岗位,竞争压力还是蛮大的。
聊了一个小时左右,有点哆嗦是真的,毕竟也是大厂面试呢~
第一次从大厂面试官得到面评,而且好评满满,真的激动坏了。同时也被告知这个岗位竞争压力很大,让我平常心。
贴心,感谢老哥~
突然因为面试老哥,特别特别想去微博。
但是也能明白,短板劣势满满的现在,毫无和他人竞争的资本。
日!气,前几年浪。
2021 - 10 - 29
创业公司,去了和负责人聊了将近两个多小时,其实也包括修改一个 RecyclerView 缓存引起的 bug。
整体来说就是聊项目,聊发展(公司项目/个人未来)。
公司属于创业初期吧,人不是很多。
每次去都给一瓶水,nice。
和 CEO 简单的聊了会儿,比如个人发展、离职原因等等。CEO 挺平和的。
其实从内心而言,是比较反感这种面试的,大量的时间消耗在路上,实际沟通短暂,已经是三面了,有点疲惫了。
大厂也不过如此吧。
算了。
刚点的外卖刚刚打开,电话就来了,一片懵逼下开启了面试。。。
抽象:只有声明没有具体实现,必须使用 abstract 修饰。
- 抽象方法必须为 public/protected,如果为 private 则子类无法继承;
- 抽象类不能用来创建对象;
- 如果一个类继承于一个抽象类,则子类必须实现父类的抽象方法。如果子类没有实现父类的抽象方法,则必须将子类也定义为 abstract 类。
接口:对行为的抽象。
- 接口中可以包含变量和方法。需要注意变量会隐式指定为 public static final,使用 private 会报编辑错误;
- 接口中的方法不能有具体实现。
区别:
- 抽象类可以提供成员方法实现细节,接口只能存在 public abstract 方法;
- 抽象中成员变量可以是各种类型的,而接口中的成员变量只能是 public static final 类型的;
- 抽象类中可以有静态代码块和静态方法,而接口中不能含有这些;
- 一个类只能继承一个抽象类(Java 单根性),但是可以实现多个接口。
- [深入理解Java的接口和抽象类](https://www.cnblogs.com/dolphin0520/p/3811437.html)
泛型的主要通过编译期检查类型安全检查来提高程序的类型安全。
2021 - 11 - 01
老哥有种没睡醒的感觉,面试过程一度很尴尬,很尬。
2021 - 11 - 02
本来想着约三家,上午两家正好一个 1 号楼,一个 3 号楼,早点去,尽可能上午搞完两家,再去立水桥南搞定最后一家,之后就可以回家吃饭去了。
结果,好家伙,第一家直接给我气炸了。本来想着面试多年,无论遇到什么样的脑残,都能做到“荣辱不惊”,没想到,这个脑残直接逼的我从手里拿走简历,直接走人了。
第三家也被突然告知因为公司员工核酸检测问题,目前统一线上,需要线上笔试,随后继续后续面试。
唯一不错的是第二家,二面、三面、四面聊的还可以吧。至少我这么理解的。? (后续老大说:你是自我感觉良好
-_-!! 就很过分,晓得不
纯脑残,不知道谁给的勇气和自信。区区一个小公司,同样使用三方 SDK,哪儿来的自信,说和厂商深度合作,共同修复问题???说半天我 tmd 以为你自研音视频 SDK 呢!
面试开始是由一个小哥哥聊着,整体还算不错,正常的问答。
没说几句话,突然来个更年期的妇女,直接闯进来,抱个电脑霹雳吧啦,给我整懵逼了。面试小哥说什么这是花姐???随后小哥继续面试。
性能优化从 Apk 瘦身说到网络方面,这里网络举了几个例子:
本来继续打算往下说明,更年期突然打断:
随后这玩意开始疯狂装逼的路程,全程不让人说话,一说话就是我知道我知道,我没有歧视你。
WTF???我来面试的,我是来和你干架的?方法论?真不知道按照您老人家怎么回答这些问题,不算是方法论。我 tmd 的说 Glide 生命周期感知以及为什么具有生命周期感知、RGB_565、缓存以及个人理解也是 tmd 方法论?
吹牛逼说什么分分钟每天拉新三四千人???
嗯???什么时候移动端拉新三四千人都值得这么吹牛逼了???WTF???
说什么日活没用?几天就掉下去了。用户量也没用,对开发也没用???更年期大妈,您老人家确定???不说亿级别的设备,百万级的都会遇到奇奇怪怪的问题,和研发无关???我 tmd
后续的沟通完全是无效的,一直在逼叨叨什么方法论。想表达下自己的想法,虽然极度不爽,但是还是想坚持完成面试,但是过分的是,只要是表达自己想法,刚说不超过三个字,直接我知道我知道,怎么怎么怎么?后续逼的我直接说,那如果这样的话,我觉得这次面试没必要继续下去了,谢谢。 各位,我再说这话的时候,这个更年期的妇女依然叨逼叨???直接拿过简历,拜拜了您呐。
下楼连抽两根烟,肺都气炸了!我是来面试的,又不是和你干架的。你什么都知道,那你招人干嘛?面试不就是相互沟通的吗?你抛出你感兴趣的问题,我用我平时的经验回答,这个有什么问题吗?如果说源码层面不够深入,我承认。但最起码得让人把话说完吧?我一二三四都列举了,直接掐死???
那还面试沟通个屁!!!
所谓的更年期花姐,你做个人吧你。
已向 BOSS 投诉,各位避坑!!!
公司环境蛮不错的,大楼电梯特别难等,客梯需要刷卡,好容易等到上电梯,还寻思有个小伙伴能刷同一层楼,再不济我往下走几层,结果直接干到 14 层,步梯门需要刷卡。。。随后又下到一楼,等待货梯,等了半个多小时,门一开,保洁大叔和满满的垃圾展现眼前。默默的等待大叔把垃圾都丢出来,上了楼。
面试官有点忙,稍微等了会儿。进去填表,小姐姐给双手消毒。过了一会儿研发中心负责人过来了,带着去了会议室,蛮和善的。
二面研发中心负责人:
自我感觉还不错吧,氛围挺不赖,老哥性格贼 nice。
二面老哥出去帮我找三面负责人,刚出去没一会儿就跑回来,和我说:马上哈,稍等下~
顿时心里暖暖的~
三面部门负责人:
三面部门负责人是个女生,性格蛮不错的。
四面人事:貌似是人事总监,我也忘记了。人事给人的感觉很干练。
整体来说蛮不错的,除了电梯等的太过于漫长。环境蛮不错的,看着大家热热闹闹的。
面试完之后在楼下坐了会儿,抽了会儿烟。
有点挺无奈的吧。两家的区别太大了。中间外面等了半天,下着雨。最后躲到地下停车楼梯间,蜷缩到了面试时间。?
生活总是不易,也充满了太多的不确定性。
2021 - 11 - 03
初试线上面试,一个半小时的题目,不到半小时写完了,最后几个算法题实在是没有思路,放弃了。
在线面试工具:
大概就是市面上常见的题吧,然后会有几个补充,比如:
2021 - 11 - 05
上午的面试有点无奈,下午的面试人事记错了,线下改为线上,不用出去折腾了。
面试官网络较差,磕磕绊绊的折腾十多分钟,主要就是问了数据结构的底层,ummm
网络比较差,听的比较麻烦。面试官说的让人理解有问题,插入不说插入,说 cha,我蒙圈半天,插入?还是查?
还是要感谢人事,记错了,线下改为线上了,不然好家伙,坑了就。
早十晚十,真心扛不住啊。
面试老哥还是蛮不错的,一边锤,一边去讲,到最后了,说咱整个算法玩玩吧,一脸苦涩,老哥各种提示,可惜呀。
算法这块还是狠薄弱,基础这块也掌握不是太好。
- 桌面应用图标,Launcher 进程将启动 Activity 的请求以 Binder 的方式发送到 AMS。
- AMS 接收到启动请求后,交付给 ActivityStarter 处理 Intent 和 Flag 等信息,之后交给 ActivityStackSupervisior/ActivityStack 处理 Activity 进栈相关流程,同时以 Socket 方式请求 Zygote 进程 fork 新进程。
- 在新进程中创建 ActivityThread 对象,并且在主线程中开启 Looper 消息循环,开始处理创建 Activity。
- ActivityThread 利用 ClassLoader 去加载 Activity,创建 Activity 实例,并回调 Activity 的 onCreate() 方法,这样便完成了 Activity 的启动。
- [当点击一个应用图标以后,都发生了什么,描述一下这个过程?](https://www.kancloud.cn/aslai/interview-guide/1113685)
- 绘制视图背景;
- 绘制画布的图层;
- 绘制 View 内容;
- 绘制子视图,如果有的话;
- 还原图层;
- 绘制滚动条。
首先 HashMap 衡量扩容时机的标准为:
- 当插入数据长度大于 HashMap 长度 x 负载因子时,便会进行扩容操作。默认情况下 HashMap 长度为 16,默认负载因子为 0.75,也就是当插入第 13 个元素的时候便会发生扩容。
而扩容的过程为:
- 首先 HashMap 会创建一个原有数组两倍大小的新数组,接着会遍历原数组,将所有的 entry 挪到新数组中。
- [【漫画编程】面试必问 hashmap 扩容机制怎么答拿满分?](https://www.zhihu.com/zvideo/1425151128485339136?playTime=98.5)
负载因子为 0.75 时,正好处于一个空间和时间的权衡点,相对空间利用率较高,而且避免了相当多的 hash 冲突,使得底层的链表或者红黑树的高度比较低,间接提升了空间效率。
- [hashmap为什么要有负载因子?](https://www.zhihu.com/question/276736347/answer/1268886570)
扩容因子太大会造成空间资源浪费,扩容因子太小会造成频繁扩容,而扩容是一件成本相对较高的场景。
2021 - 11 - 08
快手面试完还是蛮失落的,东西很基础,可惜之前使用却未好好关注。
难受了半天。
快手的面试官还是不错的,但是考量基础细节比较多。
面试开始的时候会介绍此次面试的流程,还会特意说明,假如有疑惑的地方会随时打断提问哦。
很平和的面试官,一直在引导,感谢老哥。
两者都是用于处理分支合并操作。
**merge:** 分支线多,会产生一条新的 merge commit,记录真实 commit 情况,方便项目追溯。冲突时只需要修改后重新 commit 即可。
**rebase:** 单一分支线,会合并之前提交的 commit 历史。冲突时需要修改后再次 add 以及 rebase --continue。
- [Merge vs Rebase](https://zhuanlan.zhihu.com/p/57872388)
一般而言,从主分支上拉取代码采用 rebase,这样保证拉取下代码分支简洁明了,不会掺杂别人的具体 commit 详情。而将本地代码推送远程分支上采用 merge。
另外,如果涉及一个功能多次 commit,还需要通过 rebase 合并 commit。
- git rebase -i HEAD~[准备合并几条 commit]
```
public class A {
int num = 1;
}
public class B extends A {
int num = 2;
public static void main(String[] args) {
A b = new B();
System.out.print("--->" + b.num);
}
}
```
public A(){
System.out.println("构造 A");
}
static {
System.out.println("static A");
}
void printThings(){
System.out.println("Test A");
}
}
public class B extends A{
public B(){
System.out.println("构造 Test1");
}
static {
System.out.println("static Test1");
}
void printThings(){
System.out.println("Test1 print");
}
public static void main(String[] args) {
A t = new B();
t.printThings();
}
}
```
```
java.lang.String ---> JDK 中 String
java.lang.String ---> 自己项目中定义的 String
new String() ---> 这时候会调用哪儿个 String?
new java.lang.String() ---> 这个时候呢?
```
inflate (resource, root, true)
---> 最后一个参数 true/false 代表什么意思?
---> return 的 View 是你添加进去的 layout 还是?
---> root 如果为 null,而且最后为 false,这个代表什么意思?
---> 假设我现在声明一个 View B,内部是 FrameLayout,然后 B add View 后传入 root,会有什么问题吗?
```
- View.post(Runnable)
- 为 ViewTreeObserver 注册 OnGlobalLayoutListener 接口
- IdleHandler:Looper.myQueue().addIdleHandler
- [如何在 onCreate 中拿到 View 的宽度和高度?](https://blog.csdn.net/shanshui911587154/article/details/105194108)
通过 View.post() 添加的任务,是在 View 绘制流程的开始阶段,将所有任务重新发送到消息队列的尾部,此时相关任务的执行已经在 View 绘制任务之后,即 View 绘制流程已经结束,此时就可以正确获取到 View 的宽高。
双指针解法。
面试官进房间比较早,早早的就开始面试了。
感觉整体问的比较抽象,比较懵。
从若干副扑克牌中随机抽 5 张牌,判断是不是一个顺子,即这5张牌是不是连续的。2~10为数字本身,A为1,J为11,Q为12,K为13,而大、小王为 0 ,可以看成任意数字。A 不能视为 14。
示例 1:
输入: [1,2,3,4,5]
输出: True
示例 2:
输入: [0,0,1,2,5]
输出: True
限制:
- 数组长度为 5
- 数组的数取值为 [0, 13]
网络情况不太好,纯语音聊的。
公司是刚刚组件 Android 团队,面试官应该不是 Android,个人感觉吧。
2021 - 11 - 12
昨天整夜失眠,凌晨迷迷糊糊半天,随后接到了面试电话。
可以修改,需要根据要存储数据的容量进行一次性的指定。
HashMap 提供了构造,需要传入初始化容量大小以及对应的负载因子即可。
2021 - 11 - 15
公司养只小猫咪,nice 的很。
一面二面很速度,速度到下楼抽了两根都很懵逼的状态。
大概就是问了内存泄漏和 Flutter 理解吧。
有点无奈。。。
前期约面试的时候,问我能否线上,沟通一番,选择线上吧,毕竟之前被坑了太多了。。。
准时四点进入面试间,等了差不多小二十分钟,来个 HR 开始讲解公司项目情况,之后因为网络波动掉线。直接说,你考虑下,合适就约二面。
ummm???
得亏没去线下啊
End
生活不易,且行且珍惜。。。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。