尾声
评论里面有些同学有疑问关于如何学习material design控件,我的建议是去GitHub搜,有很多同行给的例子,这些栗子足够入门。
有朋友说要是动真格的话,需要NDK以及JVM等的知识,首现**NDK并不是神秘的东西,**你跟着官方的步骤走一遍就知道什么回事了,无非就是一些代码格式以及原生/JAVA内存交互,进阶一点的有原生/JAVA线程交互,线程交互确实有点蛋疼,但平常避免用就好了,再说对于初学者来说关心NDK干嘛,据鄙人以前的经历,只在音视频通信和一个嵌入式信号处理(离线)的两个项目中用过,嵌入式信号处理是JAVA->NDK->.SO->MATLAB这样调用的我原来MATLAB的代码,其他的大多就用在游戏上了吧,一般的互联网公司会有人给你公司的SO包的。
至于JVM,该掌握的那部分,相信我,你会掌握的,不该你掌握的,有那些专门研究JVM的人来做,不如省省心有空看看计算机系统,编译原理。
一句话,平常多写多练,这是最基本的程序员的素质,尽量挤时间,读理论基础书籍,JVM不是未来30年唯一的虚拟机,JAVA也不一定再风靡未来30年工业界,其他的系统和语言也会雨后春笋冒出来,但你理论扎实会让你很快理解学会一个语言或者框架,你平常写的多会让你很快熟练的将新学的东西应用到实际中。
初学者,一句话,多练。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
- 算法:实现String的endWith()方法。
- 创建线程的方式?线程同步方法?
- 垃圾回收机制说一下?
- 多态说一下?重载和重写说一下?
- Android启动模式说一下?如果我要实现网页一样的效果,需要使用哪个模式?
- Android的适配了解吗?
- 用过哪些第三方库?说一下Okhttp的优点?
腾讯视频面经
一面(40分钟)
- mmap + native 日志优化?
- 广播和 EventBus 的区别?
- 常用设计模式你了解哪些?
- 跨进程通信有哪些?
- 简单讲讲 binder 驱动吧?
- 跨进程传递大内存数据如何做?
- 说说 ConcurrentHashMap 的实现原理说下,初始化大小是多少?
- 启动优化怎么优化?
- 你写的 rxpay 和 rxlogin 具体怎么实现的?
- kotlin + fullter 方面的
二面(50分钟)
- 单例设计模式都写写,静态内部类是怎么保证线程安全的?
- synchronized 底层实现原理,ReentrantLock 公平锁与非公平锁。
- 主线程等待所有线程执行完毕,再执行某个特定任务怎么实现?原理和源码看过没?
- 自定义 view 的一般流程,要注意些什么如何优化,点击事件和长按事件分别是怎么实现的?
- 四种启动模式,在源码分析中的原理是怎样的?
- 讲讲 bindService 的过程,你当初是怎么优化后台服务进程的?
- 开发中你都用到了哪些设计模式?说说当时具体的场景。为什么你要用方法工厂,另外两种呢?
- RxJava 在使用过程中碰到了某些不友好的错误一般怎么解决?发现了内存泄露一般怎么解决分析,有没有碰到过系统服务内存泄露的问题?
- 给你个数 1 吧,比如 1000011 里面有几个 1 ?
- 快排了解不?最坏的情况是怎样?如果有大量重复数据怎么优化?
今日头条面经
一面(40分钟)
- hashmap实现原理;
- 自定义view的步骤;
- 给出一个activity的布局:activity里包含viewgroup1,viewgroup1里包含viewgroup2,viewgroup2里包含button,问touch事件的传递和处理机制;
- Looper和handler的关系;
- activity从后台进程切换到前台经历的生命周期;
- 有两个数字非常大已经超出了long型的范围,现在以链表的方式存储其中链表头表示最高位,例如1->2->3->4表示1234,请设计一个算法求出两数之和;
二面(50分钟)
- 怎样检测内存泄露,生产上怎么定位内存泄r>2、怎样定位native层叠内存泄r>3、bindservice和startservice的区别
- 怎样不让别人绑定我的service服务
- 音乐播放器怎样实现退出页面还可以播放
- contentprovider插入一条数据要做那些操作
- 数据库事务和普通操作的区别,自己怎样实现事务
- 内存泄露有哪些,handler,单例,webview,具体场景,怎样解决
- touch的事件传递
- 怎样在子线程启动handler
- 浮窗是怎么实现的,window是由什么管理的
- 什么时候复写 measure layout draw
- measure方法是怎样将大小传递给系统的
- 自定义控件的时候,canvas的savecanvas和restorecanvas的作用
- home按键的事件是怎么处理的
- 音量键是怎样传递的
- aidl的oneway的作用
三面(1小时)
- 算法题 两个栈实现队列
- 算法题 输入一个数组,想一种方法让这个数组尽可能的乱序,保证功能能实现的情况下时间复杂度和空间复杂度尽可能的小,可使用随机数函数。(面试官最后说了 O(n)的时间复杂度能实现)
- 写一个单例(自己写一种就行)
- ActivityA -> Activity B -> Activity A,Activity A 启动模式为 singleTask,Activity B 启动模式为常规模式,问 A 启动 B,B 又启动 A 的生命周期调用顺序?
- 你刚才提到 onsaveinstancestate() ,说一下调用时机,它用来干什么的。
- onsaveinstancestate() 保存的那个参数叫什么?Bundle 里面都放一些什么东西?怎么实现序列化?Parcelable 和 Serializable 有什么区别?
- 数组和链表的区别
- HashMap 的结构以及原理
- 了解 View 的绘制机制吗,能说一下吗
- 我看你项目里用的 Fragment 能说一下 Fragment A 启动了 Fragment B,Fragment B 中按下返回键只退出 Fragment B 怎么实现。
- 你还有什么要问的吗?
面试心得
1. 算法题怎么答
面试官可能会问到你闻所未闻的算法,这时候你不应该自己瞎想,而是先和面试官把问题讨论清楚。要知道,通过沟通弄明白复杂的问题也是一种能力,在和面试官交流的过程中,不仅仅可以搞清楚题目真正的意思是什么,还可以展现自己良好的交流沟通能力。所以千万不要因为紧张或者害羞而浪费这次大好的机会。
有些题目似曾相识,但是暂时没有思路。这时候不妨告诉面试官,给我一些时间思考这个题。然后不要急,不要慌,就当他不存在,拿出纸和笔慢慢算(这充分说明了面试戴耳机的重要性)。你一定要坚定一个信念:“任何一道稍微有难度的算法题,除非做过,否则一定是需要时间想的”。所以,合理的安排思考时间吧。如果十几分钟都想不出来,可以直接放弃。
2. 遇到不会的问题怎么处理
这个问题有可能是面试官故意说得含糊不清,考察你的交流能力,也有可能是无意的,或者是你的理解方式出现了偏差。不管是以上哪种问题,你都应该先和面试官交流,直到你搞懂了面试官要问你什么,而不是按照自己的理解说了一堆无用的东西。
举个例子,面试官可能会问了一道算法题:“如何判断两个无限长度的链表是否有交点?”。对于“无限长度”可以有不同的理解,如果真的是有无穷多个节点,那显然这个问题是无法解决的。但如果链表仅仅是有环,那么还是可以解决的。如果面试官的本意是链表有环,但你错误的理解成了无穷多个节点,那么必然会导致无法回答这个问题。而且这并非能力不足,而是属于交流沟通方面的失误,这也正是我想分享的“技巧”。
3. 遇到真的不会的问题怎么处理
遇到不会的问题果断承认啊。如果是基本问题,比如问你哈希表怎么实现,你说不会,那么这次面试可能就悬了。如果是有一定难度的问题,那么你承认不会,也是一种明智之举,毕竟人无完人,一个问题不会并不能全盘否定一个人的能力。
4.心态
面试的时候一定要控制好心态,一个好的心态往往更容易拿到offer。就像我有次面试,因为心态没控制好,才面了30分钟不到就结束了,所以如果面试前你心态没控制好,宁可不去,也别抱着一个糟糕的心态去面试。
学习方法
1.多看一些实战项目视频
2.多刷一些算法题
因为一些大厂还是十分看重算法方面的,这里推荐大家刷**《剑指offer》**这本书。
3.刷书
感觉看书对提升非常明显,当然了还是要看书的内容干货多不多,这里分享下我看过的书:
- 《Android自定义控件入门和实战》
- 《大话设计模式》
- 《Andorid设计模式源码解析》
- 《深入理解JVM》
- 《Android进阶解密》
4.多看一些面经
看面经能让你了解这个公司面试的一些情况,了解面试官喜欢问的问题,特别是近期的面经。
最后
总结
作为一名从事Android的开发者,很多人最近都在和我吐槽Android是不是快要凉了?而在我看来这正是市场成熟的表现,所有的市场都是温水煮青蛙,永远会淘汰掉不愿意学习改变,安于现状的那批人,希望所有的人能在大浪淘沙中留下来,因为对于市场的逐渐成熟,平凡并不是我们唯一的答案!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!