我在大三的时候,没有参加春招,也没有参加秋招,我大三 三月份的时候在实习僧上投了几个简历,发现面的都很水,原来我在大学的时候,成绩还算ok,编程能力在班里也是前几的,但是说实话,找工作经验真的不足吧,我编程的时候,没关注过JVM原理,也没关注过Java里面一些实现机制,一些【源码】也没看过,这个时候,我就知道还需要努力了。 我找了个几个人的小公司,先干着了,边干边复习吧,补一补基础,后来,跳槽到了58企服,一个a轮的创业公司,干的也很happy,然后就放弃秋招了,然后今年三月份,公司取消了移动端开发,我就又失业了。。。
我在三月初开始复习,找工作了,前后一共大概一个半月的时间吧,最后收到了字节跳动的offer,打算过去了。
毕业第一份工作,尽可能去大公司
理由: 大公司稳定性较高,不用担心失业,工资较高,生活水平不会差,大公司技术栈沉淀了很久了,比一般公司会好很多,大公司门槛相对较高,进来的人 基础不会太差,大家合作比较愉悦,大公司 一般来说 自带用户量,随便搞点什么,日活百万 千万,会对技术架构有一定要求,能学到的比较多。声明: 因为我在几个人的公司待过,也在100多人的公司待过,我深知创业公司的苦,但是我不是引战,我只是说出我的想法,我不会和别人讨论,毕业去大公司好,还是创业公司好,也希望评论区不要有人和我讨论这个问题,我只说出我的想法。
理由: 我觉得春招很长,机会很多,一步一步脚踏实地的走吧,举一个例子,没有offer不要着急去小公司实习,如果最后还没有offer可以考虑。如果收到一个还ok的offer,尽可能追求一下更好的offer,不要有一个offer就满足,多尝试,都付出这么多了,不多面面也可惜,不过面面,也不知道自己有多强,也不知道自己还有哪里不足。
理由: 我认为即使春招定了,说我能留在字节,能留在阿里,我觉得也要尽可能走一下校招,因为校招会提供更多的机会,会让我们 以后不后悔,没准能拿到更好的sp或者更好的部门呢,一般 你有其它公司的sp,本公司也愿意给你提sp的。我觉得秋招不要懒,多复习多尝试,其次就是如果工作很忙很忙,建议请个小假,认真尝试校招,没准能收获更好的机会。
我觉得,无论什么专业吧,都应该把剑指offer和leetcode一些题多刷一刷,记住无论以后想干什么,我觉得这是基础。然后就是认真复习本专业的知识了,我拿安卓举例,那就是jvm基础,java基础,安卓基础,安卓进阶,算法,操作系统,计算机网络等。我觉得这些都要看,都要认真看。我觉得 自己 制定计划吧,这些点 都要复习到,不要有幻想说,能不能我这里不行,他考不到什么的,多复习,一定要多复习。
还有很重要的一点,要说一下,我也很鼓励在校期间,什么都可以接触,什么都可以学习,广度很重要,但是在找第一份工作的时候,有用的基本只有深度,所以一定要有一个点是深入的,不能完全发散,什么都不深入,这样很致命。找一个深入的点,先深入下去,这个很重要,不要以为什么都会一些也可以。
我觉得求职过程中吧,肯定是心态最重要,半个月没笔试,半个月没面试,我觉得这可能是常态,我觉得心态不要蹦,不要看到别人有offer自己没offer就不行了。我觉得不能光看见别人的offer吧,也要看到别人的努力,再就是面试本身就具有很大的随机性,所以不要盲目妄自菲薄,也不要没有自信,慢慢来,一步一步来,跟自己比呗,看看有没有进步。坚持就好,慢慢来,肯定能成功,就脚踏实地的搞,重积累,每天都要有收获。
首先我们要有一份还ok的简历吧,这个就找学长或者朋友,老师帮忙看看吧,这个都ok,投简历的渠道吧,就是牛客网上的内推,学长的内推,朋友的内推,如果这些都试了还是没什么offer,还可以试试实习僧,脉脉,boss直聘上面,上面还是有一些大公司的散招的,这些也都可以多试试,多沟通,争取收获到面试的机会。找人内推的时候,尽可能简短的描述清晰,自己的优势的点,这样能增加面试的几率。
名校 大公司实习经验 大赛获奖经验 github 博客 说明一下,前面的点,博主都没有,不过github 和博客还ok
注意,由于文章篇幅问题,关键内容都只展示部分,具体内容看电子实物
【有需要的朋友直接点击此处的蓝色字体获取完整文档。】
什么是乐观锁?
乐观锁:假设每次去拿数据都认为别人不会修改,所以不会上锁。但是在更新的时候会判断一下此期间别人有没有去更新这个数据。一般用在读比较多,写比较少的情况。
悲观锁:假设每次都是最坏情况,每次去拿数据时别人都会修改,所以每次拿数据的时候都会上锁,这样别人想拿这个数据就会被阻塞直到它拿到锁,多写少读时使用。
volatile关键字
hashmap 原理,红黑树是什么?
红黑树
jvm内存分配
String,StringBuffer,StringBuilder 区别
String,StringBuffer,StringBuilder最终底层存储与操作的都是char数组。但是String里面的char数组是final的,而StringBuffer,StringBuilder不是,也就是说,String是不可变的,想要新的字符串只能重新生成String。而StringBuffer和StringBuilder只需要修改底层的char数组就行。相对来说,开销要小很多。
String的大多数方法都是重新new一个新String对象返回,频繁重新生成容易生成很多垃圾。StringBuffer是线程安全的,StringBuilder是线程不安全的,因为StringBuffer的方法是加了synchronized锁起来了的,而StringBuilder没有。增删比较多时用StringBuffer或StringBuilder(注意单线程与多线程)。实际情况按需而取吧,既然已经知道了里面的原理。
安卓各版本大变化(Android 6.0到10.0),兼容适配
Android 5.0
Android 6.0
Android 7.0
Android 8.0
Android 9.0
Android 10
热修复原理
原理
一句话总结。将修复好的类放在dexElements的最前面,这样在加载类的时候就会被优先加载到而达到修复的目的。
MVC,MVP,MVVM
首先需要知道的是为什么要进行技术框架的设计?肯定是为了低耦合,提高开发效率是吧。所以不要为了设计而设计。
MVC
在Android中View和Controller一般就是被Activity充当了,当逻辑非常多,操作非常复杂时,Activity代码量非常庞大,不易维护。
MVP
我个人角度,现在(2019年10月29日20:02:49)大多是使用这种方式,既不复杂也解耦合了。
MVVM
为了更加分离M,V层,所以有了MVVM。
组件化的好处
app启动流程
Activity启动流程
app体积优化
可以使用lint工具,检测出没有用的文件。同时可以开启资源压缩,自动删除无用的资源。尽量多使用可绘制对象,某些图像不需要静态图像资源,框架可以在运行时动态绘制图像。尽量自己写Drawable,能不用UI切图就不用,占用空间小。
重用资源,比如一个三角按钮,点击前三角朝上代表收起的意思,点击后三角朝下,代表展开,一般情况下,我们会用两张图来切换,我们其实完全可以用旋转的形式去改变。比如同一图像的着色不同,我们可以用android:tint和tintMode属性,低版本可以使用ColorFilter。
压缩PNG和JPEG文件,可以减少PNG文件的大小,而不会丢失图像质量。使用WebP文件格式,可以使用WebP文件格式,而不是使用PNG或JPEG文件。可以使用AS将现有的BMP、JPG、PNG或静态GIF图像转换成WebP格式。使用矢量图形.svg;代码混淆,使用proGuard代码混淆器工具,它包括压缩,优化,混淆等功能。这个大家太熟悉。插件化,将功能模块放服务器上,按需下载,可以减少安装包大小。
app启动优化
利用提前展示出来的Window,快速展示出来一个节目,给用户快速反馈的体验。障眼法,治标不治本。
避免在启动时做密集沉重的初始化(Heavy app initialization)。某些SDK初始化放在异步去加载(比如友盟,bugly这样的业务非必要可以异步加载),比如地图,推送等,非第一时间需要的可以在主线程做延时启动(比如闪屏页),当程序已经启动起来之后,再进行初始化。对于网络,图片请求框架就必须在主线程中初始化了。启动时,避免I/O操作,反序列化,网络操作,布局嵌套等耗时操作。
app布局优化
app内存优化
频繁使用字符串拼接用StringBuilder或者StringBuffer;ArrayMap、SparseArray替换HashMap;避免内存泄漏。
内存泄漏有哪些
app线程优化
线程池避免存在大量的Thread,重用线程池内部的线程,从而避免了线程的创建和销毁带来的性能开销,同时能有效控制线程池的最大并发数,避免大量线程因互相抢占系统资源而导致阻塞线现象发生。
分类
优点
注意点
Android换肤如何实现,原理
重新设置LayoutInflater的Factory2,从而拦截创建View的过程,然后搞成自己的控件,想怎么换肤就怎么换肤。
fresco原理,glide原理,两者区别,哪个更省内存
这块暂时不懂,加入todo。
Handler原理,Android 消息机制
之前写过一篇文章,死磕Android_Handler机制你需要知道的一切,里面介绍得很详细,顺便说了一下为什么loop不会阻塞主线程问题。
Handler机制的关键在于对于ThreadLocal原理的理解,线程私有数据。利用ThreadLocal机制将Looper存放到线程内部,perfect !
Android 系统架构
应用层,应用框架层,系统运行库层,硬件抽象层和Linux内核层。
常用布局有哪些
Android数据存储有几种方式
View,SurfaceView
jni调用流程
我之前也写过简单的demo,JNI Java与C的相互调用与基本操作。
组件之间相互引用,如何解决
Android 数字签名
校验用户身份,校验数据的完整性。
fragment用在哪里,与Activity的区别
View绘制原理
Retrofit和OkHttp原理,拦截器
点击事件传递机制,事件分为哪几种
事件传递大体过程:Activity–> Window–>DecorView –> View树从上往下,传递过程中谁想拦截就拦截自己处理。MotionEvent是Android中的点击事件。主要事件类型:
需要关注的几个方法。
上面3个方法可以用以下伪代码来表示其关系:
public boolean dispatchTouchEvent(MotionEvent ev) {
boolean consume = false;//事件是否被消费
if (onInterceptTouchEvent(ev)) {//调用onInterceptTouchEvent判断是否拦截事件
consume = onTouchEvent(ev);//如果拦截则调用自身的onTouchEvent方法
} else {
consume = child.dispatchTouchEvent(ev);//不拦截调用子View的dispatchTouchEvent方法
}
return consume;//返回值表示事件是否被消费,true事件终止,false调用父View的onTouchEvent方法
}
anr如何产生,Service触发anr是多长时间(20秒),如何解决anr?如何解决那种莫名其妙的anr?
我觉得anr就是在主线程做了耗时操作,比如io、读写文件、数据库操作等等。anr发生之后一般会有日志,在/data/anr/traces.txt里面。可以参考我的这篇文章拿anr日志,Android 未root查看ANR异常:
Dialog和Activity是同一个Window?
不是同一个。
Window,Activity,Dectorview之间的关系
ConstraintLayout和RelativeLayout在绘制方面有何差别?
todo。
onClick事件和onTouchListener在哪里回调?
如果一个View需要处理事件,它设置了OnTouchListener,那么OnTouchListener的onTouch方法会被回调。如果onTouch返回false,则onTouchEvent会被调用,反之不会。在onTouchEvent方法中,事件为Action.UP的时候会回调OnClickListener的onClick方法,可见OnClickListener的优先级很低。
LinearLayout是如何测量(measure)的?如果有weight又是如何测量的?
先做一次测量,做完之后有空间剩余,有weight的View再测量一下,分一下剩余的空间。
屏幕适配
先前有鸿洋的AndroidAutoLayout,根据宽高进行控件缩放,非常经典,很多项目可能都还在使用,但是已经停止更新了。然后就是有名的今日头条方案,出来还是有点时间了。原理其实就是更改density。
屏幕的宽度=设计稿宽度 * density。
然后有AndroidAutoSize库,将今日头条方案融合进去还完善了很多问题,易用,完美。
Java四种引用
项目中遇到的最困难的事情是什么?如何解决的?
每个人遇到的情况不同,这个提前思考一下自己做过的项目最有挑战的地方。
Kotlin优势
缺点就是有时候代码阅读性可能会降低。
Kotlin 协程是什么?
就是一个线程框架,提供了一套操作线程的api。
二叉树,广度优先遍历,深度优先遍历
推荐小灰的漫画算法。还有其他的一些,随便聊聊:
有些东西你不仅要懂,而且要能够很好地表达出来,能够让面试官认可你的理解,例如Handler机制,这个是面试必问之题。有些晦涩的点,或许它只活在面试当中,实际工作当中你压根不会用到它,但是你要知道它是什么东西。
对于程序员来说,要学习的知识内容、技术有太多太多,要想不被环境淘汰就只有不断提升自己,从来都是我们去适应环境,而不是环境来适应我们!