小米的Java开发一面面经
1.Java的Object类的hashCode()方法的作用
hashCode()方法返回一个整形值,用来表示对象的hash码,有以下约定:
- Java代码在执行期间,对一个对象多次执行hashCode()返回的哈希值相同,前提是将对象作为equals比较时的标尺消息未修改。Java程序调用两次main方法,对象的hashCode方法返回值无须一致。
- 如果两个对象相等,则其调用hashCode方法的返回值一定相等。
- 但是,如果两个对象的hashCode()返回相等,不能说明两个对象相等。
因此重写equals方法(equals方法在Object类中使用==实现,如果自定义类要使用equals方法则必须重写该方法)时必须要重写hashCode方法。而hashCode方法最主要的作用是增强哈希表的性能,如hashMap,使用hashCode可以快速得出对象的的哈希码,然后根据哈希算法得出对象的位置,直接判断此位置是否存在对象。
Object类中的方法:hashCode();equals();getClass();clone();wait();wait(long);wait(long,int);notify();notifyAll();toString();finalize();
2.Java何时会使用到wait方法
wait()必须必须在获取了对象的锁(monitor)才能执行该对象的wait方法(notify方法同样如此)。当调用wait方法后,线程会释放对象的锁,与Thread类的sleep方法不同的是,sleep方法只能使线程陷入休眠状态。
3.Java执行sleep方***不会释放资源
sleep ,释放cpu资源,不释放锁资源,如果线程进入sleep的话,释放cpu资源,如果外层包有Synchronize,那么此锁并没有释放掉。wait用于锁机制,sleep不是,这就是sleep不释放锁,wait释放锁的原因,sleep是线程的方法,跟锁没关系,wait,notify,notifyall 都是Object对象的方法,是一起使用的,用于锁机制。
4.Java中有哪些锁
锁的分类有:公平锁/非公平锁、共享锁/排它锁、互斥锁/读写锁、乐观锁/悲观锁。可重入锁/不可重入锁、分段锁、轻量级锁/重量级锁/偏向锁、自旋锁。
我的回答是:synchronized,cas,lock,Volatile等。
5.Volatile关键字和锁有区别吗?
有区别,volatile关键字只能保证变量的有序性和防止指令重排序,不能保证变量的原子性,所以他只能适用一些简单的数据结构,如Java中的基本类型,而不支持一些计算的操作。
ReetrantLock默认是非公平锁;
6.hashMap中的hash方法有什么作用?
异或其hashCode获得值的高16位的值,目的是提高返回值的随机性,减少hsah冲突。
7.put一个对象的过程
put一个对象时,先定位对象在数组中的位置,如果该位置没有元素存在,就直接插入。如果该位置有元素存在,就先与要插入位置的key进行比较,如果key相同就直接把value进行覆盖,如果key不同就判断该位置是否是一个树节点如果是就把元素添加到树中,如果不是就把元素插入元素的尾部(如果此时hashMap底层数组长度大于等于64,且链表节点的元素个数大于8就会对链表进行树化操作)
8.spring的IOC和AOP使用了哪些Java底层的技术
AOP中用到了动态代理和反射以及动态字节码技术(不写出Java文件通过代码直接生成class字节码文件)
9.JVM对synchronized关键字的优化
1.锁消除(逃逸分析):JVM在编译时会对synchronized中的代码进行扫描,去除那些不可能发生资源共享的锁,从而减少线程请求锁空间。
2.锁粗化:连续多个加锁解锁操作连在一起,扩展成一个范围更大的锁,将锁的粒度放大:如在for循环中的锁会被放在for循环外。
3.使用偏向锁和轻量级锁的锁升级概念优化synchronized获取锁和释放锁带来的性能消耗。
10.http的请求的报文结构是什么
请求头、请求行和请求体组成。
请求行包涵请求的请求方法,请求地址和http的版本号
请求头包括请求首部字段,主要包括若干属***端根据此获取客户端信息
请求体是请求的具体内容包含多个键值对组成。
11.http的keep-alive有什么作用,及其与tcpkeep-alive的区别
http的keep-alive的作用是开启http的长连接,减少tcp连接建立的次数,以提高性能和服务器的吞吐量。但是keep-alive也存在一些问题,长时间的tcp连接会导致系统资源的无效占用,故要正确设置keep-alive timeout时间(即服务器连接建立后如果keep-alive timeout的时间内客户端与服务端无请求那么就会断开连接)
Tcp的Keepalive:当超过一段时间之后,TCP自动发送一个数据为空的报文(侦测包)给对方,如果对方回应了这个报文,说明对方还在线,连接可以继续保持,如果对方没有报文返回,并且重试了多次之后则认为链接丢失,没有必要保持连接。
http keep-alive与tcp keep-alive,不是同一回事,意图不一样。http keep-alive是为了让tcp活得更久一点,以便在同一个连接上传送多个http,提高socket的效率。而tcp keep-alive是TCP的一种检测TCP连接状况的保鲜机制。
13.http的四次挥手
- 客户端进程发出连接释放报文,并且停止发送数据。释放数据报文首部,FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号。
服务器收到连接释放报文,发出确认报文,ACK=1,ack=u+1,并且带上自己的序列号seq=v,此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间
客户端收到服务器的确认请求后,此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)。
服务器将最后的数据发送完毕后,就向客户端发送连接释放报文,FIN=1,ack=u+1,由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认。
客户端收到服务器的连接释放报文后,必须发出确认,ACK=1,ack=w+1,而自己的序列号是seq=u+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2∗ *∗MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态。
服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些。
为什么客户端最后还要等待2MSL?
MSL(Maximum Segment Lifetime),TCP允许不同的实现可以设置不同的MSL值。
第一,保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失,站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器。
第二,防止类似与“三次握手”中提到了的“已经失效的连接请求报文段”出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失。这样新的连接中不会出现旧连接的请求报文。
为什么建立连接是三次握手,关闭连接确是四次挥手呢?
建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端。
而关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次。
关于四次挥手部分参考:https://blog.csdn.net/qzcsu/article/details/72861891
14.Java的垃圾回收机制
没答出来面试官题示说先简述JVM垃圾回收分那些区域,内存是怎么划分的,而各个区域用的垃圾回收。
15.为什么要使用索引
- 通过创建唯一性索引,可以保证数据库表中每一行数据的唯一性。
- 可以大大加快 数据的检索速度(大大减少的检索的数据量), 这也是创建索引的最主要的原因。
- 帮助服务器避免排序和临时表。
- 将随机IO变为顺序IO
- 可以加速表和表之间的连接,特别是在实现数据的参考完整性方面特别有意义。
算法题:
1.找一个链表的中间结点
双指针,快慢指针
2.不使用迭代前序输出一个二叉树
栈
3.理发师问题:一个理发师给n个人理发,每个人理发时间t[i],不能同时给两个相邻的人理发求最大理发时间。例:4个人t={2,5,3,9}最大时间为5+9 = 14
动态规划
面试官很nice我一些记不清楚的地方会引导我去回答,但奈何本人太菜,感觉一面必挂。就把面经发出来攒攒运气。
#面经##小米##Java工程师##校招#