乐趣区

关于android:Android客户端校招面经本科双非研究生搭上校招最后末班车终于成功上岸字节跳动

前言

在开始之前说说我的根本状况: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 申请

因为本套笔记干货内容过多,没有方法一 一展现,须要的敌人能够点击这里收费获取!

退出移动版