前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Android客户端校招面经,本科双非研究生搭上最后末班车成功上岸字节跳动

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

原创
作者头像
Android技术干货分享
修改2021-08-13 10:29:55
1.2K0
修改2021-08-13 10:29:55
举报
文章被收录于专栏: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(N2))?什么输入最坏?(答曰有序最坏,分别追问顺序和逆序,一开始脑瘫说顺序O(N)逆序O(N2)面试官奸笑:你再想想)
  • 链表怎么排序?说一下链表快排(口头撕了蛮久的)
  • 进程&线程?有哪些东西是线程共有的,独立的
  • 对锁的认识(C++只有独立锁和共享锁),谈谈乐观锁和悲观锁
  • 死锁?如何避免?
  • 代码题:

定义一个线程类

代码语言:javascript
复制
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日录用函,这效率不可谓不快。

面试总结

面试官考察的基础内容是有共同点的,无非是数据结构、计网、数据库、操作系统、算法这几门核心课的基础知识(其实我一直觉得计网和数据库不算核心课,毕竟很多方向和它俩不沾边)。有不会的大方承认,千万不要打肿脸充胖子。但是有一点很重要,字节跳动确实很看重coding,面试中的手撕代码环节,红黑树虽不至于但至少快排二叉树链表要熟练,然后再准备看一些leetcode中等题。

面试前准备

自我介绍

1、结合招聘岗位,只讲重点

简历内容这么多,实际的你,更有很多很多可以描述的东西。但时间有限,没有面试官会听你说个没完。

根据你求职的岗位,说重点即可。

其实简历制作的原则,也是一样。只是自我介绍时间更短,内容更精华。

2、有理有据,少说空话

如果你说“自己学习能力强”,这就是一句假大空的话。谁都可以说自己学习能力强。

你如果真的在这方面有突出,就要举一个例子,比如是1个月从0到1考了什么证书等。

3、有开头有结尾,有逻辑

开头问候,结尾总结。中间1、2、3条理清楚。

4、特别提醒

自我介绍中的内容,很可能是面试官后续发问的内容。所以,一是要引起重视,讲最重要的,你最想让面试官知道的内容。 而是做好准备,扬长避短,不要给自己挖坑。

比如前面你说自己学习能力强,但是没有举例子。

面试官很可能,顺着你的话问你,怎么证明你学习能力强呢? 结果你答不上来,或者是非常普通的成绩,根本不能算是“学习能力强”。 那你就是给自己挖坑了。

其实自我介绍也是每个人各有不同,说起来也只能提供大致的思路。和你具体的求职岗位、经历、个人风格有很大的关系。

掌握基础知识

官方文档就是教科书,源码一定要抽时间多看,网上的分析和讲解太多太乱,不要一味地跟着写,这里简单列了几个面试时喜欢反复讲的知识点。

  • 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学习是一条漫长的道路,我们要学习的东西不仅仅只有表面的 技术,还要深入底层,弄明白下面的 原理,只有这样,我们才能够提高自己的竞争力,在当今这个竞争激烈的世界里立足。

如果你觉得自己学习效率低,缺乏正确的指导,可以参考下下面分享我多年工作以来收集整理的学习路线,给大家做个参考:

除了上面的学习路线,还可以额外的配合以下方式学习,效果翻倍~

①看视频进行系统学习

前几年的Crud经历,让我明白自己真的算是菜鸡中的战斗机,也正因为Crud,导致自己技术比较零散,也不够深入不够系统,所以重新进行学习是很有必要的。我差的是系统知识,差的结构框架和思路,所以通过视频来学习,效果更好,也更全面。关于视频学习,个人可以推荐去B站进行学习,B站上有很多学习视频,唯一的缺点就是免费的容易过时。

另外,我自己也珍藏了好几套视频,有需要的我也可以分享给你。

②读源码,看实战笔记,学习大神思路

“编程语言是程序员的表达的方式,而架构是程序员对世界的认知”。所以,程序员要想快速认知并学习架构,读源码是必不可少的。阅读源码,是解决问题 + 理解事物,更重要的:看到源码背后的想法;程序员说:读万行源码,行万种实践。

主要内含微信 MMKV 源码、AsyncTask 源码、Volley 源码、Retrofit源码、OkHttp 源码等等。

③面试前夕,刷题冲刺

面试的前一周时间内,就可以开始刷题冲刺了。请记住,刷题的时候,技术的优先,算法的看些基本的,比如排序等即可,而智力题,除非是校招,否则一般不怎么会问。

关于面试刷题,我个人也准备了一套系统的面试题,帮助你举一反三。

④2020大厂面试高频知识点

  • 图片
  • 网络和安全机制
  • 数据库
  • 插件化、模块化、组件化、热修复、增量更新、Gradle
  • 架构设计和设计模式
  • 性能优化
  • Android Framework
  • Android优秀三方库源码
以上这些内容均免费分享给大家,需要完整版的朋友,点这里可以看到全部内容。或者点击 【这里】 查看获取方式。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 背景
    • 字节头条一面(40min)
    • 字节头条二面(40min):简历项目逐条撕
    • 字节头条字节头条三面(1h)
      • 面试结果
        • 面试总结
        • 面试前准备
          • 自我介绍
            • 掌握基础知识
              • 提升技能
              相关产品与服务
              数据库
              云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
              领券
              问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档