前言
在开始之前说说我的根本状况:c9本科双非研究生20届毕业,6月22号入职深圳今日头条,在2020年12月搭上校招补录的末班车上岸,岗位是android客户端开发工程师。此文记录一下我之前的面试教训,顺便分享一波温习资源,文末有资源链接自取。
我的秋招因为被导师的我的项目耽搁了,所以10月份才开始投递简历,投递字节跳动客户端更是在挂了好几家公司之后的11月底,算是捡了个校招补录的便宜。因为客户端的确始终处于缺人状态,所以绝对其余岗位不容易饱和,竞争也没那么强烈,有想法的能够试一试。
言归正传,我的研究生业余是科学计算可视化,方向偏冷门。我的代码能力尚可(c/c++),但数据库/网络根本没有工程教训(仅限于大三课程程度,忘记过半),不会机器学习,不会java,没有大厂实习经验。
面试状况:
字节头条一面(40min)
面试官只精通JAVA,而我只会C++,开始了欢快的交换,问题先后顺序可能有误(要不然上来两个问题都不会面试官会狐疑审简历的眼瞎了)
- 自我介绍
- HTTP和HTTPS,get和post办法(答曰SSL加密,不理解更多,网络相干的利用没接触,遂完结计网相干问题)
- 数据库(示意不理解数据库,上完课就没用过记不清了,持续问学生选课场景要怎么建表,憋了一会儿答曰不会,遂完结数据库相干问题)
- 过程&线程。创立子线程,若父线程终止,则子线程如何?(持续运行直到线程本人完结)
- 过程间通信IPC(诘问应用共享内存时如何进行同步)
- JAVA有GC机制,C++里怎么进行内存治理(手动new/delete,智能指针)
- 手写Java双重测验的单列模式
- Java的四种援用形式
- Java synchronized的类锁和对象锁,它们区别,哪些是对象锁,哪些是类锁
- 代码题:归并两个有序链表(Leetcode原题)
字节头条二面(40min):
简历我的项目逐条撕
- 简历我的项目OpenGL渲染流程(按好几年前的课程记忆大略背了几点)
- 简历中的机器人我的项目,如何实现避障和门路布局
- TCP、UDP区别
- 操作系统线程和过程的同步机制和通信机制
- 什么是缓存溢出
- osi和tcp/ip网络模型,路由器和交换机位于哪一层
- Android中你罕用哪些控件
- 说下Glide的应用
- RxJava的通信机制
- Android四大组件
- new和malloc
- 代码:一开始出了个实现生产者消费者模型,示意不相熟(模型只记得个大略,写代码是不可能实现工作)。
换了个冒泡排序,我又示意太简略。最初换成偶数长度的链表每两个替换地位(1234 -> 2143)(有原题是链表每k个一组逆序,这题相当于k=2的状况)
轻易聊聊你没有安卓开发教训(潜台词:你研究生方向好偏啊JAVA都不会(╯‵□′)╯︵┻━┻)为什么抉择客户端岗位?(答曰:自己不才,初中开始接触编程加入NOIP,没事儿就喜爱写代码。在计算机这个行业广泛很难做到业余和岗位对口,集体能力素质杰出的话对很多岗位都是互通的blahblah……)
你通过哪些路径学习新技术(答:次要由我的项目驱动,学习新技术次要通过浏览官网文档(这点很重要,不论你读没读过,读没读懂)和他人分享的技术博客,再加上本人的实际)
字节头条字节头条三面(1h)
问的很细,幸好把方向引向了本人相熟的畛域:操作系统、数据结构&算法
(小插曲:第一天刚面10+分钟面试官有紧急事件终止了,据说是产品在美帝原告了要走法律流程orz,说改天持续,过后我有点慌,幸好预先HR告诉第二天接着面)
你在后面几轮面试自我感觉如何(答了本人之前体现的优缺点,数据库和网络因为科研学习没有利用就不太熟悉,强调本人数据结构算法和操作系统把握较好,预先回忆这句才是要害,避轻就重率领面试方向)
- 图像识别是怎么做的
- 理解bitmap的解析吗
- 设计一个自定义View,View中蕴含图片和文字,并且只能继承View
- 用过束缚布局吗,它的特点和原理,比起绝对布局的劣势
- Glide相干
- https的加密过程,为什么要这么做?
- 游览器输出一个url后产生了哪些,dns协定原理
- get和post区别
- 封装一个单链表,要求实现删除,增加,反转办法
- C有哪些库函数
- static关键字(c中变量值保留,c++类成员能够不生成对象实例间接拜访(诘问实现机制,答不上))
- 援用传递和值传递
- 说一说多态(动态多态,动静多态,虚函数,虚函数表)
- C++类默认函数有几个(结构、析构、拷贝、操作符=,C++11还有2个)
- TCP握手挥手
- 排序算法晓得哪些(非比拟排序(基数、桶)、比拟排序(抉择冒泡插入、快排归并堆排))
- 快排复杂度(冀望O(NlogN))?最坏状况(O(N^2))?什么输出最坏?(答曰有序最坏,别离诘问程序和逆序,一开始脑瘫说程序O(N)逆序O(N^2)面试官狞笑:你再想想)
- 链表怎么排序?说一下链表快排(口头撕了蛮久的)
- 过程&线程?有哪些货色是线程共有的,独立的
- 对锁的意识(C++只有独立锁和共享锁),谈谈乐观锁和乐观锁
- 死锁?如何防止?
代码题:
定义一个线程类
class Thread { int waiting;//期待资源的id int count;//已占有资源数量 int* holdings;//已占有资源数组(数组内存有count个整数,代表占有资源的id) } bool isThreadLocked(int n, Thread* thread) { //TODO } 输出一个长度为N的Thread[]数组,判断是否存在死锁,返回true/false(哈希表+资源依赖链找环)
面试后果
11月25号投的简历,11月29号一二面,12月3日三面,12月9日offer-call,12月12日录用函,这效率不堪称不快。
最初
面经就给大家分享到这儿了,接下来给大家分享点干货吧,我温习刷题和面试筹备的整顿,内容可能点多,感觉可能对本人有帮忙的小伙伴能够珍藏下。
把握基础知识
官网文档就是教科书,源码肯定要抽时间多看,网上的剖析和解说太多太乱,不要一味地跟着写,这里简略列了几个面试时喜爱重复讲的知识点。
- HashMap反对null Key和null Value;Hashtable不容许。因为HashMap对null进行了非凡解决,将null的hashCode值定为了0,所以将其寄存在哈希表的第0个bucket。
- HashMap是非线程平安,HashMap实现线程平安办法为Map map = Collections.synchronziedMap(new HashMap());Hashtable是线程平安
- HashMap默认长度是16,扩容是原先的2倍;Hashtable默认长度是11,扩容是原先的2n+1
- HashMap继承AbstractMap;Hashtable继承了Dictionary
- hashmap版本之间的区别,数据结构是怎么的?
- Java垃圾回收机制
须要了解JVM,内存划分——办法区、内存堆、虚拟机栈(线程公有)、本地办法栈(线程公有)、程序计数器(线程公有), 了解回收算法——标记革除算法、可达性剖析算法、标记-整顿算法、复制算法、分代算法,优缺点都了解下。
须要理解下Activity栈和taskAffinity
- Standard:零碎默认,启动一个就多一个Activity实例
- SingleTop:栈顶复用,如果处于栈顶,则生命周期不走onCreate()和onStart(),会调用onNewIntent(),适宜推送音讯详情页,比方新闻推送详情Activity;
- SingleTask:栈内复用,如果存在栈内,则在其上所有Activity全副出栈,使得其位于栈顶,生命周期和SingleTop一样,app首页根本是用这个
- SingleInstance:这个是SingleTask增强本,零碎会为要启动的Activity独自开一个栈,这个栈里只有它,实用新开Activity和app能独立开的,如零碎闹钟,微信的视频聊天界面不晓得是不是,晓得的同学通知我下,在此谢过!
View的绘制流程
ViewRoot
performTraversal()
performMeasure()
performLayout()
perfromDraw()
View/ViewGroup measure()
View/ViewGroup onMeasure()
View/ViewGroup layout()
View/ViewGroup onLayout()
View/ViewGroup draw()
View/ViewGroup onDraw()
看下invalidate办法,有带4个参数的,和不带参数有什么区别;requestLayout触发measure和layout,如何实现部分从新测量,防止全局从新测量问题。
事件散发机制
dispatchTouchEvent()
onInterceptTouchEvent()
onTouchEvent()
requestDisallowInterceptTouchEvent(boolean)
还有onTouchEvent()、onTouchListener、onClickListener的先后顺序
音讯散发机制
这个考得十分常见。肯定要看源码,代码不多。带着几个问题去看:
- 为什么一个线程只有一个Looper、只有一个MessageQueue?
- 如何获取以后线程的Looper?是怎么实现的?(了解ThreadLocal)
- 是不是任何线程都能够实例化Handler?有没有什么约束条件?
- Looper.loop是一个死循环,拿不到须要解决的Message就会阻塞,那在UI线程中为什么不会导致ANR?
- Handler.sendMessageDelayed()怎么实现提早的?联合Looper.loop()循环中,Message=messageQueue.next()和MessageQueue.enqueueMessage()剖析。
其余性能优化
- 常量应用static final润饰
- 应用SparseArray代替HashMap
- 应用线程池治理线程
- ArrayList遍历应用惯例for循环,LinkedList应用foreach
- 不要适度应用枚举,枚举占用内存空间比整型大
- 字符串的拼接优先思考StringBuilder和StringBuffer
- 数据库存储是采纳批量插入和事务
Android学习是一条漫长的路线,咱们要学习的货色不仅仅只有外表的技术,还要深刻底层,弄明确上面的原理,只有这样,咱们才可能进步本人的竞争力,在当今这个竞争强烈的世界里立足。
不必多说,置信大家都有一个共识:无论什么行业,最牛逼的人必定是站在金字塔端的人。所以,想做一个牛逼的程序员,那么就要让本人站的更高,成为技术大牛并不是久而久之的事件,须要工夫的积淀和技术的积攒。
对于这一点,在我过后确立好Android方向时,就曾经开始梳理本人的成长路线了,包含技术要怎么系统地去学习,都列得十分具体。
常识梳理完之后,就须要进行查漏补缺,所以针对这些知识点,我手头上也筹备了不少的电子书和笔记,这些笔记将各个知识点进行了完满的总结,还有我对于面试题的一些参考答案也能够分享给大家。《Android开发中高级面试合集》
一、Android根底+进阶
1.Activity启动模式
2.Activity的启动过程
3.过程通信
4.Android Binder之应用层总结与剖析
5.过程保活办法
6.从源码理解handler looper ,messageQueue思路
7.handler如何实现延时发消息postdelay()
8.Android中为什么主线程不会因为Looper.loop()里的死循环卡死?
9.RxJava原理及如何封装应用
10.okhttp源码剖析
11.retrofit源码剖析
…
12.LeakCanary外围原理源码浅析
13.LruCache 应用及原理
14.ARouter原理
15.注解框架实现原理
16.Android 如何编写基于编译时注解的我的项目
17.RxJava2+Retrofit2+OkHttp3的根底、封装和我的项目中的应用
18.Rxjava2.0+Retrofit+Okhttp(封装应用)+MVP框架搭建
19.Android 插件化和热修复常识梳理
20.Android开发中比拟常见的内存透露问题及解决办法
21.如何检测和定位Android内存透露
22.图片占据的内存算法
23.为什么图片须要用软援用,MVP模式中的view接口用弱援用
24.基于DataBinding与LiveData的MVVM实际
25.App稳定性优化
26.App启动速度优化
27.App内存优化
28.App绘制优化
29.App瘦身
30.网络优化
31.App电量优化
32.安卓的平安优化
33.为什么WebView加载会慢呢?
34.如何优化自定义View
二、Java根底+进阶
1.HashMap
2.ArrayList
3.LinkedList
4.Hashset源码剖析
5.内存模型
6.垃圾回收算法(JVM)
7.垃圾回收机制和调用 System.gc()的区别?
8.类加载过程
9.反射
10.多线程和线程池
11.创立多线程形式、线程池工作原理
12.设计模式(六大根本准则、我的项目中罕用的设计模式、手写单例等)
13.断点续传
14.Java 四大援用
15.Java 的泛型
16.接口、抽象类的区别
17.从 java 容器类的设计探讨抽象类和接口的利用
三、数据结构与算法面试题
1.罕用的数据结构有哪些?
2.数组
3.链表
4.队列&堆栈
5.二叉树
6.HashMap
7.图
8.排序算法有哪些?
9.查找算法
10.串
四、计算机网络局部
1.HTTP协定
2.TCP/IP协定
3.TCP的三次握手与四次挥手了解及面试题
4.网页中输出url,到渲染整个界面的整个过程,以及两头用了什么协定?
5.TCP和UDP的区别?
6.HTTP的几种申请办法具体介绍
7.HTTP申请和响应报文的格局,以及罕用状态码
8.一个 TCP 连贯下面能发多少个 HTTP 申请
因为本套笔记干货内容过多,没有方法一 一展现,须要的敌人能够点击这里收费获取!