没答上来的题:
1.hashset底层结构 hashmap(战战兢兢答的)
HashSet的实现原理总结如下:
①是基于HashMap实现的,默认构造函数是构建一个初始容量为16,负载因子为0.75 的HashMap。封装了一个 HashMap 对象来存储所有的集合元素,所有放入 HashSet 中的集合元素实际上由 HashMap 的 key 来保存,而 HashMap 的 value 则存储了一个 PRESENT,它是一个静态的 Object 对象。
②当我们试图把某个类的对象当成 HashMap的 key,或试图将这个类的对象放入 HashSet 中保存时,重写该类的equals(Object obj)方法和 hashCode() 方法很重要,而且这两个方法的返回值必须保持一致:当该类的两个的 hashCode() 返回值相同时,它们通过 equals() 方法比较也应该返回 true。通常来说,所有参与计算 hashCode() 返回值的关键属性,都应该用于作为 equals() 比较的标准。
③HashSet的其他操作都是基于HashMap的。
2.hashmap的key为空时怎么办?
hashMap是根据key的hashCode来寻找存放位置的,可以看到,前面那个for循环,是在talbe[0]链表中查找key为null的元素,如果找到,则将value重新赋值给这个元素的value,并返回原来的value。
如果上面for循环没找到则将这个元素添加到talbe[0]链表的表头。
3.tcp断开连接的步骤 面试官说说的太大 每一步都应有明确的步骤 比如第一次客户端向服务端发送请求想要说的是“数据已经发送完了” 我说的是客户端发送一个SYN=1 ACK=1的想要断开连接的请求
结合已有总结如下:
首先客户端发送一个连接释放报文,FIN=1(我的数据发送完了)
返回一个确认报文,tcp连接处于半关闭状态,B能向A发送数据但A不能向B发送数据
不再需要连接时,发送连接释放报文,FIN=1
A收到后发送确认,进入TIME_WAIT状态,等待2msl释放连接
B收到A确认后释放报文
4.手撕1. 二叉树层序遍历未判空 运行时报空指针异常 通过0
5.手撕2. 利用快排思想寻找第K大 AC 面试官在此处引导很多 如何优化 无非是省时间或空间 通过比较减少交换次数 最终引导出根据K可剪枝一些不必要的排序(递归过程)
6.滑动窗口何时变化 我回答的是接收端来不及接收时会变小 防止分组丢失 面试官文还有其他什么情况?
总结:Java基础(答得较好)+手撕代码(第一题没改出来 第二题没用快排思想 但AC)+计网(理解不够深刻)
面试官说后端竞争激烈 建议试试客户端 晚上等是否有二面
全部评论
(18) 回帖