牛客网
1.在Java中抽象类之间也允许出现继承关系
2.接口中不能含有静态代码块以及静态方法,而抽象类可以有静态代码块和静态方法;
3.接口中的成员变量和成员方法只能是Public(或者缺省不写)
4 FIFO:先进先出算法。
OPT:最佳置换算法。
LRU:最近最久未使用算法。
LFU:最近最少使用算法。
NUR:最近未使用算法。
5 反向代理的原理
所谓反向代理就是指在用户发起访问请求,由代理服务器接收,然后将请求转发给正式服务器,并且将正式服务器处理完的数据返回给客户端,此时代理服务器就表现为一个服务器。这么做看起来多经过了一步,稍显麻烦,但实则是好处多多。
6.负载均衡原理方法
weight轮询(默认),ip_hash,fair,url_hash,权重
7.Redis 5种类型
String,hash,list,Sorted Set,set
8.Nginx需要隔离出来单独做一台服务器吗?如果nginx挂掉能不能访问tomcat
tomcat和nginx可以部署在同一个服务器上,nginx挂掉不能在通过nginx访问但可以越过nginx直接访问tomcat,只是要知道tomcat的地址和端口号
9.Session 共享怎么做?单点登陆原理和单点注销原理
放在数据库,sso单点登陆,作为一个单独的认证中心
注销就是摧毁全局回话,然后就摧毁所有局部回话
10.死锁:互斥,不可侵占,请求与保持,循环条件
HashMap怎么根据K来求值
HashMap里面存的是一个entry,一个对象,相当key,value是一直保持着一起
HsahMap用来那种hash算法
Objects.hashCode(key) ^ Objects.hashCode(value);
int hash = hash(key.hashCode());
int i = indexFor(hash, table.length);
static int hash(int h) {
// This function ensures that hashCodes that differ only by
// constant multiples at each bit position have a bounded
// number of collisions (approximately 8 at default load factor).
h ^= (h >>> 20) ^ (h >>> 12);
return h ^ (h >>> 7) ^ (h >>> 4);
}
/**
* Returns index for hash code h.
*/ static int indexFor(int h, int length) {
return h & (length-1);
}
10Arp是什么?Arp欺骗的原理是什么?
IP地址转为mac地址
当一台主机向另一台主机通信的时候。
1首先是做通信操作,
2然后装载数据,装载双方的IP和mac地址
3只知道对分的ip不知道mac,就通过ip的网关广播找到对应的ip,恢复mac.如果在对分的arp表中已经存在啦当前的ip就更换 mac
4然后装载通信
Arp欺骗原理就是当a在广播的时候,把已经装好的数据包返给对方,用对方的ip但是用自己的mac地址。就能实现arp欺骗原理。
11.数据库事物4大特征:acid,原子性,一致性,隔离性,持久性。
数据库隔离类别 读未提交,读已提交,不可重复的,串行:实现原理 第一个未做任何锁。第二个读共享锁,写就是排它锁执行完就释放。 第三个是要等事物结束才释放行级锁。第四个是表锁。
12 TCP三次握手,为什么是三次,不是二次,TCP四次挥手?
三次握手
第一次握手:建立连接时,客户端发送syn包(syn=j)到服务器,并进入SYN_SENT状态,等待服务器确认;SYN:同步序列编号(Synchronize Sequence Numbers)。
第二次握手:服务器收到syn包,必须确认客户的SYN(ack=j+1),同时自己也发送一个SYN包(syn=k),即SYN+ACK包,此时服务器进入SYN_RECV状态;
第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=k+1),此包发送完毕,客户端和服务器进入ESTABLISHED(TCP连接成功)状态,完成三次握手。
四次挥手
为什么连接的时候是三次握手,关闭的时候却是四次握手?
答:因为当Server端收到Client端的SYN连接请求报文后,可以直接发送SYN+ACK报文。其中ACK报文是用来应答的,SYN报文是用来同步的。但是关闭连接时,当Server端收到FIN报文时,很可能并不会立即关闭SOCKET,所以只能先回复一个ACK报文,告诉Client端,"你发的FIN报文我收到了"。只有等到我Server端所有的报文都发送完了,我才能发送FIN报文,因此不能一起发送。故需要四步握手。
为什么不能用两次握手进行连接?
答:3次握手完成两个重要的功能,既要双方做好发送数据的准备工作(双方都知道彼此已准备好),也要允许双方就初始序列号进行协商,这个序列号在握手过程中被发送和确认。
现在把三次握手改成仅需要两次握手,死锁是可能发生的。作为例子,考虑计算机S和C之间的通信,假定C给S发送一个连接请求分组,S收到了这个分组,并发 送了确认应答分组。按照两次握手的协定,S认为连接已经成功地建立了,可以开始发送数据分组。可是,C在S的应答分组在传输中被丢失的情况下,将不知道S 是否已准备好,不知道S建立什么样的序列号,C甚至怀疑S是否收到自己的连接请求分组。在这种情况下,C认为连接还未建立成功,将忽略S发来的任何数据分 组,只等待连接确认应答分组。而S在发出的分组超时后,重复发送同样的分组。这样就形成了死锁。
如果已经建立了连接,但是客户端突然出现故障了怎么办?
TCP还设有一个保活计时器,显然,客户端如果出现故障,服务器不能一直等下去,白白浪费资源。服务器每收到一次客户端的请求后都会重新复位这个计时器,时间通常是设置为2小时,若两小时还没有收到客户端的任何数据,服务器就会发送一个探测报文段,以后每隔75分钟发送一次。若一连发送10个探测报文仍然没反应,服务器就认为客户端出了故障,接着就关闭连接。