精选8道滴滴、360公司的Java技术面试题(附答案)
1.JVM中加载类的时机具体举例?以及双亲委派加载的机制是什么?
(1)JVM中加载类的时机具体举例:
1)使用new关键字实例化对象,读取或设置一个雷的静态字段以及调用一个类的静态方法的时候
2)使用java.lang.reflect包的方法对类进行反射调用时,如果此类没有初始化,则要触发其初始化
3)当初始化一个类是,发现其父类还没有进行初始化,则需要先触发其父类的初始化
4)当虚拟机启动是,用户需要指定一个要运行的主类,虚拟机会先初始化这个主类
(2)双亲委派加载的机制:
当一个类收到了类加载请求,它首先不会尝试自己去加载这个类,而是把这个请求委派给父类完成,每一个层次类加载器都是如此,因此,所有的加载请求都应该传送到启动类加载其中,只有当父类加载器反馈自己无法完成这个请求的时候,子类加载才会尝试自己去加载。
2. Http协议和Https协议的区别是什么?
1)https协议需要到ca申请证书,一般免费证书较少,因而需要一定费用。
2)http是超文本传输协议,信息是明文传输,https则是具有安全性的ssl加密传输协议。
3)http和https使用的是完全不同的连接方式,用的端口也不一样,前者是80,后者是443。
4)http的连接很简单,是无状态的;HTTPS协议是由SSL+HTTP协议构建的可进行加密传输、身份认证的网络协议,比http协议安全。
3. http协议中的Get请求和Post请求的区别是什么?
1) GET请求的数据是放在HTTP包头中的,也就是URL之后,通常是像下面这样定义格式的,(而Post是把提交的数据放在HTTP正文中的)。
login.action?name=hyddd&password=idontknow&verify=%E4%BD%E5%A5%BD
a,以 ?来分隔URL和数据;
b,以& 来分隔参数;
c,如果数据是英文或数字,原样发送;
d,如果数据是中文或其它字符,则进行BASE64编码。
2)GET提交的数据比较少,最多1024B,因为GET数据是附在URL之后的,而URL则会受到不同环境的限制的,比如说IE对其限制为2K+35,而POST可以传送更多的数据(理论上是没有限制的,但一般也会受不同的环境,如浏览器、操作系统、服务器处理能力等限制,IIS4可支持80KB,IIS5可支持100KB)。
3)Post的安全性要比Get高,因为Get时,参数数据是明文传输的,而且使用GET的话,还可能造成Cross-site request forgery攻击。而POST数据则可以加密的,但GET的速度可能会快些。
所以综上几点,总结成下表:
4. TCP/IP协议中三次握手机制具体是什么?窗口滑动机制的作用和基本机制是什么?
Tcp/Ip协议的三次握手机制图:
具体解释如下:
第一次握手:客户端向服务器端发送连接请求包SYN(syn=j),等待服务器回应;
第二次握手:服务器端收到客户端连接请求包SYN(syn=j)后,将客户端的请求包SYN(syn=j)放入到自己的未连接队列,此时服务器需要发送两个包给客户端;
(1)向客户端发送确认自己收到其连接请求的确认包ACK(ack=j+1),向客户端表明已知道了其连接请求
(2)向客户端发送连接询问请求包SYN(syn=k),询问客户端是否已经准备好建立连接,进行数据通信;
第三次握手:客户端收到服务器的ACK(ack=j+1)和SYN(syn=k)包后,知道了服务器同意建立连接,此时需要发送连接已建立的消息给服务器;
向服务器发送连接建立的确认包ACK(ack=k+1),回应服务器的SYN(syn=k)告诉服务器,我们之间已经建立了连接,可以进行数据通信。
ACK(ack=k+1)包发送完毕,服务器收到后,此时服务器与客户端进入ESTABLISHED状态,开始进行数据传送。
窗口滑动机制的作用:
TCP协议作为一个可靠的面向流的传输协议,其可靠性和流量控制由滑动窗口协议保证,而拥塞控制则由控制窗口结合一系列的控制算法实现。
具体介绍:
窗口滑动就是说一次传输几个数据。对所有数据帧按顺序赋予编号,发送方在发送过程中始终保持着一个发送窗口,只有落在发送窗口内的帧才允许被发送;同时接收方也维持着一个接收窗口,只有落在接收窗口内的帧才允许接收。这样通过调整发送方窗口和接收方窗口的大小可以实现流量控制。
5. Dubbo的优点是什么?Dubbo对分布式事务是如何处理的?
Dubbo的优点:
1)Dubbo具有调度、发现、监控、治理等功能,支持相当丰富的服务治理能力
2)集群容错
当服务调用失败时,根据我们的业务不同,可以使用不同的策略来应对这种失败。
3)负载均衡
当同一个服务有多个提供者在提供服务时, 客户端如何正确的选择提供者实现负载均衡dubbo也给我们提供了几种方案
4)多协议
dubbo提供了多种协议给用户选择, 如Dubbo协议、Hessian协议、HTTP协议、RMI协议、WebService协议、Thrift协议、Memcached协议、Redis协议。
Dubbo对分布式事务的处理:
分布式事务暂不支持。用户可以自己根据实际情况来实现分布式事务,比如:
1)结合RocketMQ消息中间件实现的可靠消息最终一致性
2)TCC补偿性事务解决方案
3)最大努力通知型方案
6. Mysql数据库的左连接、右连接、全连接?
左连接、右连接、全连接整体上属于外连接的范畴。具体来讲如下:
1)左连接:left join
左向外联接的结果集包括 left join子句中指定的左表的所有行,而不仅仅是联接列所匹配的行。如果左表的某行在右表中没有匹配行,则在相关联的结果集行中右表的所有选择列表列均为空值。
左连接sql举例:
select A.*,B.* from A left join B on A.id=B.infoid
2)右连接:right join
右向外联接是左向外联接的反向联接。将返回右表的所有行。如果右表的某行在左表中没有匹配行,则将为左表返回空值。
右连接sql举例:
select A.*,B.* from A right join B on A.id=B.infoid
3)全连接:full join
完整外部联接返回左表和右表中的所有行。当某行在另一个表中没有匹配行时,则另一个表的选择列表列包含空值。如果表之间有匹配行,则整个结果集行包含基表的数据值。
全连接sql举例:
select A.*,B.* from A full join B on A.id=B.infoid
7. 数据库的悲观锁、乐观锁的机制和使用场景是什么?
悲观锁:
悲观锁的特点是先获取锁,再进行业务操作,即“悲观”的认为获取锁是非常有可能失败的,因此要先确保获取锁成功再进行业务操作。
悲观锁的使用场景:
并发量不大且不允许脏读,可以使用悲观锁解决并发问题
乐观锁:
乐观锁是先进行业务操作,不到万不得已不去拿锁。即“乐观”的认为拿锁多半是会成功的,因此在进行完业务操作需要实际更新数据的最后一步再去拿一下锁。
乐观锁的使用场景:
1)乐观锁在不发生取锁失败的情况下开销比悲观锁小,但是一旦发生失败回滚开销则比较大,因此适合用在取锁失败概率比较小的场景,可以提升系统并发性能
2)乐观锁还适用于一些比较特殊的场景,例如在业务操作过程中无法和数据库保持连接等悲观锁无法适用的地方
8. Zookeeper的典型应用场景是什么?
1)命名服务(Naming Service)
2)数据发布与订阅(配置中心)
3)分布式通知/协调
4)集群管理与Master选举
5)分布式锁
6)分布式队列