2017-2020 字节跳动 Android 面试真题
解析
目录
2017-2020 字节跳动 Android 面试真题解析................................................................................... 1
目录..................................................................................................................................................... 1
第一章计算机基础面试题.........................................................................................................1
第一节、网络面试题.........................................................................................................1
第二节、操作系统面试题 (⭐⭐⭐)........................................................................ 21
第三节、数据库面试题 (⭐).................................................................................... 23
第二章 数据结构和算法面试题.............................................................................................25
数据结构与算法...............................................................................................................25
第三章 Java 面试题..................................................................................................................33
第一节 Java 基础面试题..................................................................................................33
第二节 Java 并发面试题.................................................................................................81
第三节 Java 虚拟机面试题 (⭐⭐⭐)......................................................................121
第四章 Android 面试题.........................................................................................................140
第一节 Android 基础面试题 (⭐⭐⭐).................................................................. 140
第二节 Android 高级面试题 (⭐⭐⭐)................................................................... 208
第五章 其他扩展面试题.......................................................................................................346
一、Kotlin (⭐⭐).................................................................................................... 346
二、大前端 (⭐⭐)...................................................................................................346
三、脚本语言 (⭐⭐)...............................................................................................349
第六章非技术面试题.............................................................................................................350
一、高频题集 (⭐⭐⭐)...........................................................................................350
二、次高频题集 (⭐⭐)...........................................................................................352
第一章计算机基础面试题
第一节、网络面试题
一、HTTP/HTTPS (⭐⭐⭐)
1、HTTP 与 HTTPS 有什么区别?
HTTPS 是一种通过计算机网络进行安全通信的传输协议。HTTPS 经由 HTTP 进行通信,但利
用 SSL/TLS 来加密数据包。HTTPS 开发的主要目的,是提供对网站服务器的身份 认证,保
护交换数据的隐私与完整性。
HTPPS 和 HTTP 的概念:
HTTPS(全称:Hypertext Transfer Protocol over Secure Socket Layer),是以安全为目标
的 HTTP 通道,简单讲是 HTTP 的安全版。即 HTTP 下加入 SSL 层,HTTPS 的安全基础是 SSL,
因此加密的详细内容就需要 SSL。 它是一个 URI scheme(抽象标识符体系),句法类同 http:
体系。用于安全的 HTTP 数据传输。https:URL 表明它使用了 HTTP,但 HTTPS 存在不同于
HTTP 的默认端口及一个加密/身份验证层(在 HTTP 与 TCP 之间)。这个系统的最初研发由
网景公司进行,提供了身份验证与加密通讯方法,现在它被广泛用于万维网上安全敏感的通
讯,例如交易支付方面。
超文本传输协议 (HTTP-Hypertext transfer protocol) 是一种详细规定了浏览器和万维网服
务器之间互相通信的规则,通过因特网传送万维网文档的数据传送协议。
https 协议需要到 ca 申请证书,一般免费证书很少,需要交费。http 是超文本传输协议,
信息是明文传输,https 则是具有安全性的 ssl 加密传输协议 http 和 https 使用的是完全不
同的连接方式用的端口也不一样,前者是 80,后者是 443。http 的连接很简单,是无状态的
HTTPS 协议是由 SSL+HTTP 协议构建的可进行加密传输、身份认证的网络协议 要比 http 协
议安全 HTTPS 解决的问题:1 . 信任主机的问题. 采用 https 的 server 必须从 CA 申请一个
用于证明服务器用途类型的证书. 改证书只有用于对应的 server 的时候,客户度才信任次主
机 2 . 防止通讯过程中的数据的泄密和被窜改
如下图所示,可以很明显的看出两个的区别:
注:TLS 是 SSL 的升级替代版,具体发展历史可以参考传输层安全性协议。
HTTP 与 HTTPS 在写法上的区别也是前缀的不同,客户端处理的方式也不同,具体说来:
如果 URL 的协议是 HTTP,则客户端会打开一条到服务端端口 80(默认)的连接,并向其
发送老的 HTTP 请求。 如果 URL 的协议是 HTTPS,则客户端会打开一条到服务端端口 443
(默认)的连接,然后与服务器握手,以二进制格式与服务器交换一些 SSL 的安全参数,附
上加密的 HTTP 请求。 所以你可以看到,HTTPS 比 HTTP 多了一层与 SSL 的连接,这也就
是客户端与服务端 SSL 握手的过程,整个过程主要完成以下工作:
交换协议版本号 选择一个两端都了解的密码 对两端的身份进行认证 生成临时的会话密
钥,以便加密信道。 SSL 握手是一个相对比较复杂的过程,更多关于 SSL 握手的过程细节
可以参考 TLS/SSL 握手过程
SSL/TSL 的常见开源实现是 OpenSSL,OpenSSL 是一个开放源代码的软件库包,应用程序
可以使用这个包来进行安全通信,避免窃听,同时确认另一端连接者的身份。这个包广泛被
应用在互联网的网页服务器上。 更多源于 OpenSSL 的技术细节可以参考 OpenSSL。
2、Http1.1 和 Http1.0 及 2.0 的区别?
HTTP1.0 和 HTTP1.1 的一些区别
HTTP1.0 最早在网页中使用是在 1996 年,那个时候只是使用一些较为简单的网页上和网络
请求上,而 HTTP1.1 则在 1999 年才开始广泛应用于现在的各大浏览器网络请求中,同时
HTTP1.1 也是当前使用最为广泛的 HTTP 协议。 主要区别主要体现在:
1、缓存处理,在 HTTP1.0 中主要使用 header 里的 If-Modified-Since,Expires 来做
为缓存判断的标准,HTTP1.1 则引入了更多的缓存控制策略例如 Entity tag,
If-Unmodified-Since, If-Match, If-None-Match 等更多可供选择的缓存头来控制缓
存策略。
2、带宽优化及网络连接的使用,HTTP1.0 中,存在一些浪费带宽的现象,例如客户
端只是需要某个对象的一部分,而服务器却将整个对象送过来了,并且不支持断点
续传功能,HTTP1.1 则在请求头引入了 range 头域,它允许只请求资源的某个部分,
即返回码是 206(Partial Content),这样就方便了开发者自由的选择以便于充分利
用带宽和连接。
3、错误通知的管理,在 HTTP1.1 中新增了 24 个错误状态响应码,如 409(Conflict)
表示请求的资源与资源的当前状态发生冲突;410(Gone)表示服务器上的某个资
源被永久性的删除。
4、Host 头处理,在 HTTP1.0 中认为每台服务器都绑定一个唯一的 IP 地址,因此,
请求消息中的 URL 并没有传递主机名(hostname)。但随着虚拟主机技术的发展,
在一台物理服务器上可以存在多个虚拟主机(Multi-homed Web Servers),并且它
们共享一个 IP 地址。HTTP1.1 的请求消息和响应消息都应支持 Host 头域,且请求
消息中如果没有 Host 头域会报告一个错误(400 Bad Request)。
5、长连接,HTTP 1.1 支持长连接(PersistentConnection)和请求的流水线
(Pipelining)处理,在一个 TCP 连接上可以传送多个 HTTP 请求和响应,减少了建
立和关闭连接的消耗和延迟,在 HTTP1.1 中默认开启 Connection: keep-alive,一
定程度上弥补了 HTTP1.0 每次请求都要创建连接的缺点。
SPDY
在讲 Http1.1 和 Http2.0 的区别之前,还需要说下 SPDY,它是 HTTP1.x 的优化方案:
2012 年 google 如一声惊雷提出了 SPDY 的方案,优化了 HTTP1.X 的请求延迟,解决了
HTTP1.X 的安全性,具体如下:
1、降低延迟,针对 HTTP 高延迟的问题,SPDY 优雅的采取了多路复用(multiplexing)。
多路复用通过多个请求 stream 共享一个 tcp 连接的方式,解决了 HOL blocking 的
问题,降低了延迟同时提高了带宽的利用率。
2、请求优先级(request prioritization)。多路复用带来一个新的问题是,在连接
共享的基础之上有可能会导致关键请求被阻塞。SPDY 允许给每个 request 设置优先
级,这样重要的请求就会优先得到响应。比如浏览器加载首页,首页的 html 内容应
该优先展示,之后才是各种静态资源文件,脚本文件等加载,这样可以保证用户能
第一时间看到网页内容。
3、header 压缩。前面提到 HTTP1.x 的 header 很多时候都是重复多余的。选择合适
的压缩算法可以减小包的大小和数量。
4、基于 HTTPS 的加密协议传输,大大提高了传输数据的可靠性。
5、服务端推送(server push),采用了 SPDY 的网页,例如我的网页有一个 sytle.css
的请求,在客户端收到 sytle.css 数据的同时,服务端会将 sytle.js 的文件推送给客户
端,当客户端再次尝试获取 sytle.js 时就可以直接从缓存中获取到,不用再发请求了。
SPDY 构成图:
SPDY 位于 HTTP 之下,TCP 和 SSL 之上,这样可以轻松兼容老版本的 HTTP 协议(将 HTTP1.x
的内容封装成一种新的 frame 格式),同时可以使用已有的 SSL 功能。
HTTP2.0 和 HTTP1.X 相比的新特性
新的二进制格式(Binary Format),HTTP1.x 的解析是基于文本。基于文本协议的
格式解析存在天然缺陷,文本的表现形式有多样性,要做到健壮性考虑的场景必然
很多,二进制则不同,只认 0 和 1 的组合。基于这种考虑 HTTP2.0 的协议解析决定
采用二进制格式,实现方便且健壮。
多路复用(MultiPlexing),即连接共享,即每一个 request 都是是用作连接共享机
制的。一个 request 对应一个 id,这样一个连接上可以有多个 request,每个连接的
request 可以随机的混杂在一起,接收方可以根据 request 的 id 将 request 再归属
到各自不同的服务端请求里面。
header 压缩,如上文中所言,对前面提到过 HTTP1.x 的 header 带有大量信息,而
且每次都要重复发送,HTTP2.0 使用 encoder 来减少需要传输的 header 大小,通讯
双方各自 cache 一份 header fields 表,既避免了重复 header 的传输,又减小了需
要传输的大小。
服务端推送(server push),同 SPDY 一样,HTTP2.0 也具有 server push 功能。
需要更深的理解请点击这里
3、Https 请求慢的解决办法
1、不通过 DNS 解析,直接访问 IP
2、解决连接无法复用
http/1.0 协议头里可以设置 Connection:Keep-Alive 或者 Connection:Close,选择是否允许
在一定时间内复用连接(时间可由服务器控制)。但是这对 App 端的请求成效不大,因为
App 端的请求比较分散且时间跨度相对较大。
方案 1.基于 tcp 的长连接 (主要) 移动端建立一条自己的长链接通道,通道的实现是基于
tcp 协议。基于 tcp 的 socket 编程技术难度相对复杂很多,而且需要自己定制协议。但信息
的上报和推送变得更及时,请求量爆发的时间点还能减轻服务器压力(避免频繁创建和销毁
连接)
方案 2.http long-polling 客户端在初始状态发送一个 polling 请求到服务器,服务器并不会
马上返回业务数据,而是等待有新的业务数据产生的时候再返回,所以链接会一直被保持。
一但结束当前连接,马上又会发送一个新的 polling 请求,如此反复,保证一个连接被保持。
存在问题: 1)增加了服务器的压力 2)网络环境复杂场景下,需要考虑怎么重建健康的
连接通道 3)polling 的方式稳定性不好 4)polling 的 response 可能被中间代理 cache 住 ……
方案 3.http streaming 和 long-polling 不同的是,streaming 方式通过再 server response
的头部增加“Transfer Encoding:chuncked”来告诉客户端后续还有新的数据到来 存在问题:
1)有些代理服务器会等待服务器的 response 结束之后才将结果推送给请求客户端。
streaming 不会结束 response 2)业务数据无法按照请求分割 ……
方案 4.web socket 和传统的 tcp socket 相似,基于 tcp 协议,提供双向的数据通道。它的
优势是提供了 message 的概念,比基于字节流的 tcp socket 使用更简单。技术较新,不是
所有浏览器都提供了支持。
3、解决 head of line blocking
它的原因是队列的第一个数据包(队头)受阻而导致整列数据包受阻
使用 http pipelining,确保几乎在同一时间把 request 发向了服务器
4、Http 的 request 和 response 的协议组成
1、Request 组成
客户端发送一个 HTTP 请求到服务器的请求消息包括以下格式:
请求行(request line)、请求头部(header)、空行和请求数据四个部分组成。
请求行以一个方法符号开头,以空格分开,后面跟着请求的 URI 和协议的版本。
Get 请求例子
GET /562f25980001b1b106000338.jpg HTTP/1.1
Host
img.mukewang.com
User-Agent Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML,
like Gecko) Chrome/51.0.2704.106 Safari/537.36
Accept image/webp,image/*,*/*;q=0.8
Referer http://www.imooc.com/
Accept-Encoding gzip, deflate, sdch
Accept-Language zh-CN,zh;q=0.8
第一部分:请求行,用来说明请求类型,要访问的资源以及所使用的 HTTP 版本. GET 说明请
求类型为 GET,[/562f25980001b1b106000338.jpg]为要访问的资源,该行的最后一部分说明
使用的是 HTTP1.1 版本。 第二部分:请求头部,紧接着请求行(即第一行)之后的部分,
用来说明服务器要使用的附加信息 从第二行起为请求头部,HOST 将指出请求的目的
地.User-Agent,服务器端和客户端脚本都能访问它,它是浏览器类型检测逻辑的重要基础.该
信息由你的浏览器来定义,并且在每个请求中自动发送等等 第三部分:空行,请求头部后面
的空行是必须的 即使第四部分的请求数据为空,也必须有空行。 第四部分:请求数据也叫
主体,可以添加任意的其他数据。 这个例子的请求数据为空。
POST 请求例子
POST / HTTP1.1
Host:www.wrox.com
User-Agent:Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR
2.0.50727; .NET CLR 3.0.04506.648; .NET CLR 3.5.21022)
Content-Type:application/x-www-form-urlencoded
Content-Length:40
Connection: Keep-Alive
name=Professional%20Ajax&publisher=Wiley
第一部分:请求行,第一行明了是 post 请求,以及 http1.1 版本。
第二部分:请求头部,第二行至第六行。
第三部分:空行,第七行的空行。
第四部分:请求数据,第八行。
2、Response 组成
一般情况下,服务器接收并处理客户端发过来的请求后会返回一个 HTTP 的响应消息。
HTTP 响应也由四个部分组成,分别是:状态行、消息报头、空行和响应正文。
第一部分:状态行,由 HTTP 协议版本号, 状态码, 状态消息 三部分组成。
第一行为状态行,(HTTP/1.1)表明 HTTP 版本为 1.1 版本,状态码为 200,状态消息为(ok)
第二部分:消息报头,用来说明客户端要使用的一些附加信息
第二行和第三行为消息报头, Date:生成响应的日期和时间;Content-Type:指定了 MIME
类型的 HTML(text/html),编码类型是 UTF-8
第三部分:空行,消息报头后面的空行是必须的