*1.抽象与接口的区别
抽象类 | 接口 | |
关键字 | 继承抽象类的关键字为extends 一个类只能继承一个抽象类 | 实现接口的关键字为implements 一个类可以实现多个接口 |
成员方法 | 抽象方法的访问类型可以是public,protected
可以包含静态方法 抽象类为部分方法提供实现,避免子类重复实现这些方法,提高代码重用性; | 接口所有的成员方法都是被public abstract修饰的抽象方法,不能有方法的实现(JDK1.8之前), java 1.8:default,static |
成员变量 | 属性默认由public static final修饰 | |
构造方法 | 抽象类可以有构造方法,但是不能创建对象。 用于子类的创建 | 不可以 |
main | 可以有 main 方法,并且我们能运行它 | 没有main方法 |
(1)抽象类不能创建对象,那么抽象类中是否有构造器?
抽象类中一定有构造器。构造器的作用 给子类初始化对象的时候要先super调用父类的构造器。
(2)抽象类是否可以被final修饰?
不能被final修饰,因为抽象类设计的初衷就是给子类继承用的。要是被final修饰了这个抽象类了,就不存在继承了,就没有子类。
*2.http状态码
分类 | 分类描述 |
---|---|
1** | 信息,服务器收到请求,需要请求者继续执行操作 |
2** | 成功,操作被成功接收并处理 |
3** | 重定向,需要进一步的操作以完成请求 |
4** | 客户端错误,请求包含语法错误或无法完成请求 |
5** | 服务器错误,服务器在处理请求的过程中发生了错误 |
*3.tcp和udp的区别
区别 | TCP | UDP |
连接 | 面向连接的传输层协议,即传输数据之前必须先建立好连接。 | 无连接 |
可靠性 | 可靠交付:无差错,不丢失,不重复,按序到达 | 是尽最大努力交付,不保证可靠交付。 |
服务对象 | 点对点的两点间服务,即一条TCP连接只能有两个端点; | 支持一对一,一对多,多对一,多对多的交互通信。 |
首部开销 | 首部开销大,首部20个字节。 | 首部开销小,8字节。(源端口,目的端口,数据长度,校验和) |
报文长度 | TCP面向字节流,实际上是TCP把数据看成一连串无结构的字节流,没有”报文边界”的概念 | 面向数据报。UDP原样发送, 既不会拆分, 也不会合并。 |
拥塞控制,流量控制 | TCP有拥塞控制和流量控制保证数据传输的安全性 | UDP没有拥塞控制,网络拥塞不会影响源主机的发送效率。 |
适用场景 | 可靠的但传输速度慢 数据完整性需让位与通信实时性 (如文件传输、重要状态的更新等) | 不可靠的但传输速度快 (IP电话、实时视频等) |
4.TCP三次握手
SYN=1,seq=x
SYN=1,ACK=1,seq=y,ack=x+1
ACK=1,seq=x+1,ack=y+1(不带数据不消耗序号)
四次挥手:
FIN=1,seq=v(即使不携带数据,也要消耗一个序号)
ACK=1,seq=u,ack=v+1
FIN=1,seq=w,ack=v+1
ACK=1,seq=v+1,ack=w+1(msl:报文最大生存时间)
5.http协议
http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式。
HTTP协议特点
1支持客户/服务器模式
HTTP协议支持客户端服务端模式,需要使用浏览器作为客户端来访问服务端。
2简单快速
客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、POST等。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3灵活
HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type(Content-Type是HTTP包中用来表示内容类型的标识)加以标记。
4无连接
每次请求一次,释放一次连接。所以无连接表示每次连接只能处理一个请求。优点就是节省传输时间,实现简单。我们有时称这种无连接为短连接。对应的就有了长链接,长连接专门解决效率问题。当建立好了一个连接之后,可以多次请求。但是缺点就是容易造成占用资源不释放的问题。当HTTP协议头部中字段Connection:keep-alive表示支持长链接。
5单向性
服务端永远是被动的等待客户端的请求。
6无状态
HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。为了解决HTTP协议无状态,于是,两种用于保持HTTP连接状态的技术就应运而生了,一个是Cookie,而另一个则是Session。
http1.0
最早在1996年在网页中使用,内容简单,所以浏览器的每次请求都需要与服务器建立一个TCP连接,服务器处理完成后立即断开TCP连接(无连接),服务器不跟踪每个客户端也不记录过去的请求(无状态),请求只能由客户端发起(单向性)。
http1.1
到1999年广泛在各大浏览器网络请求中使用,HTTP/1.0中默认使用Connection: close。在HTTP/1.1中已经默认使用Connection: keep-alive(长连接),避免了连接建立和释放的开销,但服务器必须按照客户端请求的先后顺序依次回送相应的结果,以保证客户端能够区分出每次请求的响应内容。通过Content-Length字段来判断当前请求的数据是否已经全部接收。不允许同时存在两个并行的响应。
1.1中最重要的一个特点是支持“长连接”,即“一次连接可以多次请求”。
6.Cookie与Session有什么区别?
《面试篇》Http协议 - 开顺 - 博客园 (cnblogs.com)
Cookie对象与HttpSession对象的作用是维护客户端浏览器与服务端的会话状态的两个对象。由于HTTP协议是一个无状态的协议,所以服务端并不会记录当前客户端浏览器的访问状态,但是在有些时候我们是需要服务端能够记录客户端浏览器的访问状态的,如获取当前客户端浏览器的访问服务端的次数时就需要会话状态的维持。
二者不同的是Cookie是通过客户端浏览器实现会话的维持,而HttpSession是通过服务端来实现会话状态的维持。
Cookie是由服务器生成,写入到请求的响应头中,浏览器会保存;服务器通过Set-Cookie
字段向客户端设置Cookie
Session也是服务器生成的,表示服务器中的一片内存,每个客服端对应一个Session,客户端之间的Session相互独立;每次客户端发起请求,都会带上Cookie,Cookie里面一般都会有一个JSESSIONID,服务器就是通过这个JESSIONID来找到客户端对应Session,所以一般用户的登录信息都会存放在Session;这样也解决了Http协议无状态的问题
默认生命周期:cookie关闭浏览器就结束,session30分钟
7.Http协议中有那些请求方式?如何选择使用什么方法?
1.GET方法提交的数据会放在URL之后,以?分割URL和传输数据。POST方法是把提交的数据放在HTTP包的request body(请求体)中。
2.GET方法提交的数据大小有限制(因为浏览器对URL的长度有限制),而POST方法提交的数据没有限制。
3.GET比POST更不安全,因为参数直接暴露在url中,但是POST方法提交的参数也可以通过F12查看,从安全性考量区别不大。
4.get请求参数会被完整保留在浏览历史记录里,而post中的参数不会被保留。
5.GET产生一个TCP数据包;POST产生两个TCP数据包。
对于GET方式的请求,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);
而对于POST,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。在网络环境好的情况下,发一次包的时间和发两次包的时间差别基本可以无视。而在网络环境差的情况下,两次包的TCP在验证数据包完整性上,有非常大的优点。并不是所有浏览器都会在POST中发送两次包,Firefox就只发送一次。
8、Http协议中有那些请求方式?如何选择使用什么方法?
- GET : 获取资源; 所以查询操作一般用GET
- POST: 传输实体主体, 创建更新操作用POST
- PUT: 传输文件
- HEAD: 获取报文首部,如果想要查询某个请求的头信息可以用这个方法
- DELETE: 删除资源,所以删除操作用DELETE
- OPTIONS: 询问服务器支持哪些方法,响应头中返回 Allow: GET,POST,HEAD
- TRACE: 追踪路径;在请求头中在Max-Forwards字段设置数字,每经过一个服务器该数字就减一,当到0的时候就直接返回,一般通过该方法检查请求发送出去是否被篡改
9.Http如何实现持久连接的呢?
我:(毛线啊,我只是个来面试Java的初级程序员,干嘛要反复拿Http来摩擦我呢?!不过没事,我皮的很,这道题我又会) 我:在HTTP协议的早期,每进行一次HTTP通信就要断开一次tcp连接,当时传输的内容少还能接受,现在每个网页一般的会包含大量的图片,每次请求都会造成TCP连接的连接和断开,增加通信的开销。
为了解决这个问题所以想出了持久连接的方法,也叫做keep-alive,只要一端没有提出断开连接就会一直保持TCP连接的状态。持久化连接使的客户端可以同时并发发送多个请求,不用一个接着一个的等待响应。