Android面试(下篇)

0,java里queue中的add方法和offer方法有什么区别?

答:区别:两者都是往队列尾部插入元素,不同的时候,当超出队列界限的时候,add()方法是抛出异常让你处理,而offer()方法是直接返回false。
注:以下学习内容来自于陈敏的博客,博客地址Android面试题解(下篇)
一、计算机网络知识点:

1,五层协议体系结构分别是什么?每一层都有哪些协议?

答:
物理层:
数据链路层:逻辑链路控制
网络层:ip协议,地址解析协议ARP,逆地址解析协议RARP,因特网控制报文协议ICMP
传输层:传输控制协议TCP、用户数据包协议UDP
应用层:文件传输协议FTP、远程登录协议TELNET、超文本传输协议HTTP协议、域名系统DNS、简单网络管理协议SNMP、简单邮件管理系统SMTP。

2,为什么有MAC地址还要有IP地址?

答:
每台主机在出产的时候都有一个唯一的MAC地址,但是ip地址的分配是根据网络的拓扑结构,得以保证路由选择方案建立在网络所处的拓扑位置基础而不是设备制造商的基础上。
使用ip地址更方便数据传输。数据包在这些节点之间的移动是由ARP协议复杂将IP地址映射到MAC地址上来完成的。

3,TCP和UDP的区别?

答:
TCP传输控制协议:面向连接,使用全双工的可靠信道,提供可靠的服务,即无差错、不丢失、不重复且按时序到达;拥塞控制、流量控制、超时重发、丢弃重复数据等等可靠性检测手段;面向字节流,每条TCP连接只能是点到点的,用于传输可靠性要求较高的数据。
UDP用户数据报协议:无连接,使用不可靠信道,尽最大努力交付,即不保证可靠交付,无拥塞控制,面向报文,支持一对一、一对多、多对一和多对多的交互通信,用于传输可靠性要求较低的数据。

4,TCP为什么要三次握手?为什么四次挥手?

(1),TCP连接的建立(三次握手):客户端向服务端发送一个表示建立连接的报文段SYN报文段;一旦包含SYN报文段的IP数据报到达服务器主机,服务器从IP数据报中提取出TCP、SYN报文段,为该TCP连接分配需要的缓存和变量,并向客户端发送表示允许连接的报文段ACK;在收到ACK报文段之后,客户端也要给该连接分配缓存和变量,客户端向服务器再发送一个报文段ACK,表示对允许连接的报文段进行了确认。自此完成一次TCP连接。
第三次握手可以避免由于客户端延迟的请求连接的请求,使得服务端无故再次建立连接。
(2),断开TCP连接:TCP的四次挥手
由于TCP的连接是全双工的,因此每个方向都必须单独关闭,客户端在数据发送完毕后发送一个结束数据段FIN,且服务端也返回确认数据段ACK,此时结束了客户端到服务端的连接;然后客户端接收到服务端的连接;然后客户端接收到服务端发送的FIN,且服务端也收到了ACK之后,自此双方的数据通信完全结束。简单说就是"先关读,后关写",一共需要四个阶段:服务器读通道关闭–>客户端写通道关闭–>客户机读通道关闭–>服务器写通道关闭。
客户端达到的TIME_WAIT状态时间是MaximumSegmentLifetime的两倍,而不是直接进入CLOSED状态的原因。(保证TCP协议的全双工连接能够可靠关闭、保证本次连接的重复数据从网络中消失)
TCP相关拓展扩展:刘望舒(Android进阶之光)

5,播放视频是用TCP还是UDP

答:适合用UDP,因为UDP适用于对网络通讯质量不高、要求网络通信速度能尽量快的实时性应用;而TCP适用于对网络通讯质量要求高的可靠性应用。而且视频区分关键帧和普通帧,虽然UDP会丢帧旦如果只是普通的丢帧损失并不大,取而代之的是高速率和实时性。

6,状态码

答:状态码由三位数字组成,第一位数字表示响应的类型,常用的状态码由五大类。

  • 1xx:表示服务器接收了客户端的请求,客户端可继续发送请求

  • 2xx:表示服务器已经成功接收到请求并进行处理,200 ok,表示客户端请求成功

  • 3xx:表示服务器要求客户端重定向

  • 4xx:表示客户端的请求非法

    • 400 Bad Request:表示客户端请求语法有错误,不能被服务器所理解
    • 401 unauththonzed:表示请求未经授权,该状态代码必须与www-Authenticate报头域一起使用。
    • 403 Forbidden:表示服务器收到请求,但是拒绝提供服务,通常会在响应正文中给出不提供服务的原因。
    • 404 Not Found:请求的资源不存在,例如,输入了错误的url
  • 5xx:表示服务器未能正常处理客户端的请求而出现意外错误

    • 500 internet server error:表示服务器发生不可预期的错误,导致无法完成客户端的请求
    • 503 service unavaliable:表示服务器当前不能够处理客户端的请求,在一段时间之后,服务器可能会恢复正常
7,get和post的区别?

答:get:当客户端要从服务端读取某个资源的时候使用get,一般用于获取/查询资源信息;get参数通过url传递,传递的参数是有长度限制,不能用来传递敏感信息。
post:用于客户端给服务端提供信息较多时可以使用post,post会附带用户数据,一般用于更新资源信息,post将请求参数封装在http请求数据中,可以传输大量数据,传参方式比get更安全

8,HTTP1.0、HTTP1.1、HTTP2.0区别

答:

  • http1.0默认短连接,http1.1默认使用长连接,http1.1增加更多的请求头和响应头来改进和扩充HTTP1.0的功能,比如身份认证、状态管理和cache缓存等
9,http2和http1.x相比的新功能特性
  • 新的二进制格式:http2.0的协议解析决定采用二进制格式,实现方式方便且更加健壮,不同于HTTP1.x的解析方式是基于文本
  • 多路复用:连接共享,即每一个request都是用

连接共享机制的

  • 服务端推送:服务器主动向客户端推送消息
  • 引申:长连接和短连接的优缺点和适用场景,HTPP长连接和短连接
10,HTTP和TCP的区别

答:

  • TCP是传输层协议,定义数据传输和连接方式的规范。通过三次握手建立连接、四次挥手释放连接。
  • HTTP是应用层协议,定义的是传输数据的内容的规范,HTTP的连接使用"请求–响应"的方式。基于TCP协议传输,默认端口号是80
11,HTTP和HTTPS的区别
  • HTTP(超文本传输协议):运行在TCP之上;传输的内容是明文;端口号是80
  • HTTPS:运行在SSL/TLS之之上,SSL/TLS运行在TCP之上,传输的内容经过加密,端口号是443
12,HTTP和Socket的区别
  • HTTP是应用层协议,基于TCP协议,使用"请求–响应"方式建立连接,在请求时需要先建立连接且客户端要先发出请求,可见服务器需要等待客户端发送一次请求后才能将数据传回给客户端
  • Socket(套接字)是对TCP/IP协议的封装,是接口而不是协议;创建socket连接时可以指定传输层协议TCP或UDP;socket建立连接过程有三个步骤:服务器监听—>客户端请求—>连接确认,可见服务器可以直接将数据传送给客户端(HTTP2.0也增加了服务端推送的能力)
13,在浏览器地址输入url会发生什么?

答:

  • 浏览器向DNS服务器请求解析该url中的域名所对应的IP地址
  • 解析ip地址后,根据ip地址和默认端口80,和服务器建立TCP连接
  • 浏览器发出读取文件的HTTP请求,该请求报文作为TCP三次握手的第三次报文的数据发送给服务器
  • 服务器对浏览器请求做出响应,并把对应的html文件发送给浏览器
  • 释放TCP连接,若connection模式为close,则服务器主动关闭TCP连接,客户端被动关闭连接,释放TCP连接,若connection模式为keepalive,则该连接会保持一段时间,在该时间内可以继续接收请求
  • 客户端将服务器响应的html文本解析并显示
14,工作内存和主内存的关系?在java中内存模型有哪些可以保证并发过程的原子性、可见性和有序性的措施?

答:

  • java内存模型就是通过定义程序中各个变量的访问规则,即在虚拟机中将变量存储到内存和从内存中取出变量这样的底层细节。
  • 主内存是所有变量的存储位置,每条线程还有自己的工作内存,用于保存该线程使用到的变量的主内存副本拷贝。为了获取更好的的运行速度,虚拟机可能会让工作内存优先存储于寄存器和高速缓存
  • 保证并发过程中的原子性、可见性和有序性的措施:1,原子性:一次操作要么执行要么都不执行。2,可见性:当一个线程修改了共享变量的值,其他线程能够立即得知这个修改消息。通过在修改变量后将新值同步回主存,在变量读取前从主存刷新变量值这种依赖依赖主内存作为传递媒介的方式来实现。提供了三个关键字保证可见性:volatile能保证新值能立即同步到主存,且每次使用前立即从主存刷新,synchronized对一个变量执行unlock操作之前可以把此变量同步回主内存中,final修饰的字段在构造器中一旦初始化完成且构造器没有把this的引用传递出去,就可以在其他线程中就能看见final字段的值。3,有序性:程序按照代码指令顺序执行。volatile本身就包含了禁止指令重排序的语义,synchronized保证一个变量在同一个时刻只允许一个线程对其进行lock操作,使得持有同一个锁的两个同步快只能串行地进入。
15,JVM、Dalvik、ART的区别?

答:

  • Dalvik是谷歌自己开发的用于Android平台的java虚拟机,不是java虚拟机,没有遵循java虚拟机规范,区别有:1,java虚拟机基于栈,基于栈的机器必须使用指令来载入和操作栈中的数据,而Dalvik虚拟机基于寄存器。2,java虚拟机运行的是java字节码,Dalvik运行的是自己专属的.dex字节码格式的文件(java类被编译成.class文件后会通过一个dx工具将所有的.class文件转换成一个.dex文件,然后Dalvik虚拟机会从其中读取指令和数据)。3,一个应用对应一个Dalvik虚拟机实例,独立运行。4,java虚拟机在运行的时候为每一个类装载字节码,而Dalvik程序只包含一个.dex文件,这个文件包含了程序中所有的类。
  • ART:代替Dalvik,应用无需每次运行都要先编译,而是在安装的时候就预编译字节码到机器语言,提升运行时效率;预先编译也使得ART占用空间比Dalvik大,即用空间换时间,由于减少运行时重复编译,可明显改善电池续航,降低了能耗。
16,java中堆和栈的区别?

答:

  • 栈内存:存放基本数据类型和局部变量,当在代码块定义一个变量时会在栈中为这个变量分配内存空间,当超过变量的作用域后这块空间就会被自动释放掉
  • 堆内存:用来存放运行时创建的对象,比如通过new关键字创建出来的对象和数组,需要由java虚拟机的自动垃圾回收器来管理。

操作系统

1,进程和线程的区别

答:

  • 进程是os分配和管理资源的单位,线程是CPU调度和管理的单位,是CPU调度的最小单元
  • 进程拥有独立的地址空间,而线程共享地址空间
  • 进程创建的开销比较大,线程创建的开销小
2,进程死锁的产生和避免?

答:

  • 死锁产生的条件:1,互斥使用2,不可抢占3,请求和保持4,循环等待。
  • 解决死锁的思路:1,银行家算法:判断此次请求是否会造成死锁,若会则拒绝该请求。2,鸵鸟算法:忽略该问题,常用于在极少发生死锁的情况。死锁的避免:通过合理的资源分配算法来确保永远不会形成环形等待的封闭进程链,即"如果一个进程的当前请求的资源会导致死锁,系统拒绝启动该进程,如果一个资源的分配会导致下一步的死锁,系统就拒绝该次分配"
16,数据结构和算法
17,设计模式MVC、MVP和MVVM,好在哪里?不好在哪里?

答:

  • MVP含义:model:数据层,负责存储、检索、操纵数据;view:UI层,显示数据,并向presenter报告用户行为;presenter:作为view与model层交互的中间纽带,从model拿数据,应用到UI层,管理ui的状态,影响用户的行为。
  • mvp相比于MVC模式的优势:1,分离了视图逻辑和业务逻辑,降低了耦合。2,activity只处理生命周期的任务,代码变得更加简洁。3,视图逻辑和业务逻辑分别抽象到了view和presenter的接口中去,提高了代码的可阅读性。4,presenter被抽象成接口,可以有多种具体的实现,所以方便进行单元测试。5,把业务逻辑抽到presenter中去,避免后台线程引用这activity导致activity的资源无法被系统回收从而引起内存泄漏和OOM。
  • MVVM的含义:与MVP类似,利用数据绑定(Data binding)、依赖属性(dependency property)、命令(command)、路由事件(routed event)等新加特性,打造了一个更加灵活高效的架构。
  • MVVM相比于MVP的优势:在常规的开发模式中,数据变化需要更新UI的时候,需要先获取UI控件的引用,然后再更新UI,获取用户的输入和操作也需要通过UI控件的引用,但在MVVM中,这些都是通过数据驱动来自动完成,数据变化后会自动更新UI,UI的改变也能自动反馈到数据层,数据成为主导因素,这样MVVM层在业务逻辑处理中只要关心数据,不需要直接和UI打交道,在业务处理过程中简洁方便很多。
18,生产者和消费者模型

答:
该模型通过一个缓存队列,既解决了生产者和消费者之间的强耦合的问题,又平衡了生产者和消费者的处理能力。具体规则:1,

第五章网络编程与网络框架相对于mvp的优势

5.1 网络分层

网络分层有不同的模型,有7层模型,也有5层模型,一般5层模型更好理解,丰常用,网络的每一层是为了完成每一种功能而设定的。为了实现这些功能,就需要遵守过共同的规则,这个规则就叫作"协议"。
5层协议从上到下分别是应用层、传输层、网络层、数据链路层和物理层。越靠下的层越接近硬件。

1. 物理层
2. 数据链路层
3. 网络层
4. 传输层
5. 应用层

5.2 TCP的三次握手和四次挥手

在后续分析OkHttp章节的时候会设计TCP三次握手四次挥手的知识,通常我们进行HTTP连接网络的时候会进行TCP的三次握手和四次挥手,然后传输数据,之后再释放连接。

TCP的传输过程是:

打开连接—>写请求数据—>读相应数据—>关闭连接

TCP三次握手的过程如下:

第一次握手:建立连接。客户端发送连接请求,将SYN设置为1,、sequence number(seq)设置为x:接下来客户端进入SYN_SENT状态,等待服务端的确认。
第二次握手:服务器收到客户端的SYN报文段,对SYN报文段进行确认,设置Acknowledgment Number(ACK)为x+1(seq+1);同时自己还要发送SYN请求信息,将SYN设置为1、seq为y。服务端将上述所有信息放到SYN+ACK报文段中,一并发送给客户端,此时服务端进入SYN_SEND状态。
第三次握手:客户端收到服务端的SYN+ACK报文段;然后将ACK设置为y+1,向服务端发送ACK报文段,这个报文发送完毕后,客户端和服务端都进入ESTABLISHED(TCP连接成功)状态,完成TCP的三次握手。
当客户端和服务端通过三次握手建立了TCP连接之后,当数据传输完毕,断开连接时就需要进行TCP的四次挥手。

TCP四次挥手过程

第一次挥手:客户端设置seq和ACK,向服务端发送一个FIN报文段。此时,客户端进入FIN_WAITE_1状态,表示客户端没有数据要发送给服务端了。
第二次挥手:服务端收到了客户端发送的FIN报文段,向客户端回了一个ACK报文段。
第三次挥手:服务端向客户端发送FIN报文段,请求关闭连接,同时服务端进入LAST_ACK状态。
第四次挥手:客户端接收到服务端发送的FIN报文段,向服务端发送ACK报文段,然后客户端进入TIME_WAIT状态,服务端收到客户端的ACK报文段后,就关闭连接,此时,客户端等待2MSL(最大报文生存时间)后依然没有收到回复,则说明服务端已正常关闭,这样客户端就可以关闭连接了。
如果有大量的连接,那么每次来连接、关闭时都要经历三次握手、四次挥手,这很显然会造成性能低下。因此,HTTP有一种keepalive connections的机制,它可以在传输数据后仍然保持连接,当客户端需要再次获取数据时,直接使用刚刚空闲下来的连接而无需再次握手。

5.3 HTTP协议原理

http是应用层的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。于1990年提出,后不断完善和扩展。

5.3.1,http简介

1,http历史版本
  • HTTP10.9:1991年发布的版本,
  • HTTP1.0:1996年发布的版本,
  • HTTP1.1
  • SPDY协议:2009年谷歌为了解决HTTP1.1效率不高的问题而自行研发的协议
  • HTTP2:2015年发布的新版本,SPDY协议的主要特性也在这个版本中
2,http协议的主要特点

HTTP协议的主要特点如下。

  • 支持C/S模式
  • 简单快速:客户端向服务器请求服务时,只需要传输请求方法和路径,请求方法常用的有GET、HEAD、POST等等,每种方法都规定了客户与服务器之间的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
  • 灵活:HTTP允许传输任意的数据,正在传输的类型由Content-type加以标记。
  • 无连接:无连接的含义是限制每次连接只处理一个请求,服务器处理完客户的请求,并收到客户的应答后,即断开连接,采用这种方式可以节省传输时间。
  • 无状态:HTTP是无状态协议,无状态是指协议对于事物处理没有记忆能力。缺少状态意味着如果后续需要前面的信息,则它必须重传,这样可能导致每次连接传递的数据量巨大,而另一方面,在服务器端不需要先前信息时它的应答会很快。
http url的格式如下

http://host[":"port][abs_path]
http表示通过http协议来定位资源;host表示合法的internet主机域名或者ip地址,port指定一个端口号,为空则使用默认端口80,abs_path制定请求资源的URI(web上指定的任意可用资源),HTTP有两种报文,分别是请求报文和响应报文。

5.3.2 http请求报文

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值