Android秋招,字节跳动一面
()开局自我介绍。
项目部分:
ijkplayer有研究过吗?(没有)
Java:
Android:
计算机网络:
操作系统:
算法题:
合并两个有序链表(送分题,感谢面试官)
反问:
Q : 简单评价一下?
A : 基础不咋地,Java基础薄弱,Android多了解一些开源库,代码规范还好。
Q :啥时候发感谢信?
#面经##校招##字节跳动#
项目部分:
ijkplayer有研究过吗?(没有)
Java:
- int、float、double几个字节?(int、float4个字节,double 8个字节)
- Java有操作符重载吗?(没有,C++就有操作符重载)
- String进行+操作底层实现 (使用Stringbuidler 进行append操作)
- Java传值是值传递还是引用传递? (值传递,但是对于对象传递其值地址,修改后会改变其值)
- 参数对象对其地址进行修改后源地址会不会修改? (不会,对地址进行修改后引用新的地址,原有地址不会改变)
- Java同步机制有哪些? (锁,这里应该展开来讲讲锁的一些机制和原理以及为什么需要同步)
- 为什么Java要有线程池
线程池就是对线程进行管理的一种方式,可以防止以下情况的出现:
1)频繁的创建线程、销毁线程浪费资源
2)线程数过多导致线程切换过多,效率低,线程过少导致任务等待时间过长,效率低
3)线程重用效率低,不能够很好的利用线程资源
4) 不能提供定时执行、定期执行、单线程、并发数控制等功能。
- 锁static方法跟锁普通方法区别? (锁普通方法作用与实例,锁静态方法作用于类)
- JVM运行时内存区域? (把五个区域以及作用都简单讲了一下)
- GC发生在哪个区域? (堆区,这里应该再讲讲GC的一些机制和原理)
- 回调函数中为什么参数不加final会报错? (加上final后存放位置变为方法区的常量池,这样子其他线程才可以获得到)
- 讲一讲泛型(这里应该把泛型的机制详细讲一讲才对)
- 泛型类型擦除后是什么数据类型?(其定义父类,如ArrayList是List,没有指定的话就是Object)
- 异常机制大概讲一下 (大概讲了异常的几种机制)
- Error能不能Catch住 (不可以,是一种不可检异常)
- 为什么Java要有异常机制,C 没有(Java语言按照面向对象的思想来处理异常,使得程序具有更好的维护性)
Android:
- 详细讲一下Handler机制 (详细讲了一圈)
- MessageQueue使用了什么数据结构? (为了确保插入时维护时间顺序,因此使用了链表来做数据结构)
- Looper跟MessageQueue以及Handler的数量情况 (一个线程一般只有一个Looper和messagequeue,可以有多个 Handler)
- Looper.get为什么能够获得Looper,底层是怎么实现的?(它是一个ThreadLocal变量,在调用Looper.prepare()的时候就会把该实例存在线程当中)
- 讲一讲TheadLocal (是一种将变量放到线程本地的操作,接下来在操作时就能够直接操作本地变量,本质上是一个HashMap来做的,)
- 了解HandlerThead吗?(不知道)复盘:(HandlerThread对象start后可以获得其Looper对象,并且使用这个Looper对象实例Handler,之后Handler就可以运行在其他线程中了。)
- 让你创建一个线程后初始化Looper,然后再外部如何确保获取到这个Looper是已经初始化的了?(可以通过sleep等待子线程Looper完)
- 讲一下OKHTTP的调用方法 (同步调用:okhttp.send() 异步调用: okhttp.excute())
- 讲一下OKHTTP的责任链模式 (责任链模式是在okhttp发送请求时会把请求一层一层进行处理,其中有头部处理,复用处理等等)
- 讲一下OKHTTP的责任链调用过程
在发送一个任务之后,任务会进入异步消息队列,进入之后一旦被调度就会进行职责链处理,主要有五个部分:
RetryAndFollowUpInterceptor: 该部分进行两部分的操作:在请求失败之后判断是否需要重新发起请求。 当服务器返回当前请求需要进行重定向时直接发起新请求,并且在条件允许的情况下复用当前连接。
BridgeInterceptor: 对头部进行处理,例如编码、压缩处理、设置cookie、内容长度设置。
CacheInterceptor:对缓存进行处理,一般有三个步骤:
1) 判断是否有可用缓存,有的话若无网络则使用。
2) 网络请求回来之后判断是否需要更新缓存,若是更新。若不是则更新命中率。
3)如果判断当前缓存失效,删除
ConnectInterceptor: 负责判断是否复用连接、使用连接。主要有以下步骤:
1) 判断该地址是否已经有连接,若有直接使用原有连接,没有进入第2步(okhttp确保一个地址只发起一个连接)
2) 若找不到连接,则进行配置路由,配置之后再次进行查找连接,若查找连接成功复用连接,这里是为了防止http域名压缩之后出现的情况
3) 找不到则发起新连接,且更新到连接池
4)判断连接池有无新的连接出现,若有则删除新连接
- CallServerInterceptor:负责向服务器发起真正的访问请求,并在接收到服务器返回后读取响应返回。
- Android中还有什么地方用到了责任链模式 (回答了事件分发机制且简单讲了事件分发的过程)
- 事件分发上级是如何知道下级是否拦截的 (通过返回值)
- sharepreferrence apply跟commit区别
apply()方法是异步的,在提交文件修改之后,会先将文件写入到内存当中,然后创建线程异步将文件写入到外存当中。
commit()方法是同步的提交之后马上写入到外存并且返回值。 - apply之后立即读数据能够读到吗?(可以,会先放到内存当中,sharedPreferences通过xml文件存储数据,获取的时候在通过解析xml文件获取)
- apply过程中的缓存有吗?(有的)
- 了解动画吗?(不了解)
计算机网络:
- TCP UDP区别?
可靠性角度:TCP可靠、UDP不可靠
连接建立角度:TCP建立连接、UDP不建立连接
传输数据角度:TCP通过字节传输、UDP通过报文传输 - TCP如何确保可靠的?
这个问题还是答得少了,应该多答一些:
在连接建立的角度:通过三次握手建立连接、四次挥手断开连接
在防止传输出错的角度:通过校验和验证是否出现错误
在防止失序的角度:通过给每个字节编号来实现
在流量控制的角度:通过拥塞控制来进行实现
在防止丢包的角度:通过停止等待协议实现 - 直播使用TCP还是UDP?
必然是UDP
操作系统:
- 大端小端的概念(数据地位放在低地址为小端,数据地位放在高地址为大端)
- Java是大端还是小端?(不知道)(小端存储)
- Android是大端还是小端?(不知道)(应该跟Java一致都是小端)
- 网络是大端还是小端?(网络是大端)
算法题:
合并两个有序链表(送分题,感谢面试官)
反问:
Q : 简单评价一下?
A : 基础不咋地,Java基础薄弱,Android多了解一些开源库,代码规范还好。
Q :啥时候发感谢信?
A : 我把情况报给HR,HR决定。
总结:
这次面试感觉挺舒服的,面试官很好,就是自己Java太久没看了实在是垃圾,算法做出来了,很简单。
不过应该要感谢信了。下次继续。
个人复盘:
虽然收了感谢信但是这次面试还是受益匪浅,暴露出自己的几个缺点:
1、太久没有面试,面试的一些经验出现丢失,应该是自己遇到会的东西多讲一些,而不是等着面试官问。
2、Java基础不扎实,需要补充Java基础知识。
3、Android基础还好,但是需要有更加深度、全面的学习。
接下来的面试准备有两个方向:
1、恶补Java基础
2、将Android会的部分进行深挖,高度概括总结,让面试官问的时候可以打出一套组合拳。