第一次面试
自我介绍,然后问了项目,项目中遇到什么困难
一些问题
1.hashmap,concurrentHashmap区别是什么
答:
hashmap是线程不安全的,concurrentHashMap是线程安全的
2.为什么hashmap是不安全的?
答:
···多线程下扩容死循环。JDK1.7中的 HashMap 使用头插法插入元素,在多线程的环境下,扩容的时候有可能导致环形链表的出现,形成死循环。因此,JDK1.8使用尾插法插入元素,在扩容时会保持链表元素原本的顺序,不会出现环形链表的问题。
···多线程的put可能导致元素的丢失。多线程同时执行 put 操作,如果计算出来的索引位置是相同的,那会造成前一个 key 被后一个 key 覆盖,从而导致元素的丢失。此问题在JDK 1.7和 JDK 1.8 中都存在。
···put和get并发时,可能导致get为null。线程1执行put时,因为元素个数超出threshold而导致rehash,线程2此时执行get,有可能导致这个问题。此问题在JDK 1.7和 JDK 1.8 中都存在。
3.如果想要线程安全该怎么办?
·使用concurrentHashMap,因为ConcurrentHashMap 选择了与 HashMap 相同的数组+链表+红黑树结构;在锁的实现上,抛弃了原有的 Segment 分段锁,采用CAS + synchronized
实现更加低粒度的锁。将锁的级别控制在了更细粒度的哈希桶元素级别,也就是说只需要锁住这个链表头结点(红黑树的根节点),就不会影响其他的哈希桶元素的读写,大大提高了并发度。所以可以保证线程安全。
4.ArrayList知道吗,讲一下
ArrayList是 java 集合框架中比较常用的数据结构。继承自 AbstractList,实现了 List 接口。底层基于数组实现容量大小动态变化。允许 null 的存在。同时还实现了 RandomAccess、Cloneable、Serializable 接口,所以ArrayList 是支持快速访问、复制、序列化的。
ArrayList扩容,本质就是计算出新的扩容数组的size后实例化,并将原有数组内容复制到新数组中去。默认情况下,新的容量会是原容量的1.5倍。
5.计算机网络 三次握手四次挥手 。
三次握手机制:
-
第一次握手:客户端请求建立连接,向服务端发送一个同步报文(SYN=1),同时选择一个随机数 seq = x 作为初始序列号,并进入SYN_SENT状态,等待服务器确认。
-
第二次握手:服务端收到连接请求报文后,如果同意建立连接,则向客户端发送同步确认报文(SYN=1,ACK=1),确认号为 ack = x + 1,同时选择一个随机数 seq = y 作为初始序列号,此时服务器进入SYN_RECV状态。
-
第三次握手:客户端收到服务端的确认后,向服务端发送一个确认报文(ACK=1),确认号为 ack = y + 1,序列号为 seq = x + 1,客户端和服务器进入ESTABLISHED状态,完成三次握手。
四次挥手机制
-
第一次挥手:客户端向服务端发送连接释放报文(FIN=1),主动关闭连接,同时等待服务端的确认。
- 序列号 seq = u,即客户端上次发送的报文的最后一个字节的序号 + 1
-
第二次挥手:服务端收到连接释放报文后,立即发出确认报文(ACK=1),确认号 ack = u + 1。
这时 TCP 连接处于半关闭状态,即客户端到服务端的连接已经释放了,但是服务端到客户端的连接还未释放。这表示客户端已经没有数据发送了,但是服务端可能还要给客户端发送数据。
-
第三次挥手:服务端向客户端发送连接释放报文(FIN=1),主动关闭连接,同时等待客户端的确认。
- 序列号 seq = w,即服务端上次发送的报文的最后一个字节的序号 + 1。
-
第四次挥手:客户端收到服务端的连接释放报文后,立即发出确认报文(ACK=1),确认号为 ack = w + 1。
此时,客户端就进入了
TIME-WAIT
状态。注意此时客户端到 TCP 连接还没有释放,必须经过 2*MSL(最长报文段寿命)的时间后,才进入CLOSED
状态。而服务端只要收到客户端发出的确认,就立即进入CLOSED
状态。可以看到,服务端结束 TCP 连接的时间要比客户端早一些。
6.你在你项目里面什么地方用到了三次握手?
每一次Controller的请求都用到了TCP三次握手
7.常用数据结构知道哪些,知道几种排序算法,时间复杂度是多少。
数组,链表,二叉树
冒泡排序 O(n^2)
快速排序 O(n·logn)
希尔排序O(nlog2n)
插入排序O(n2)
8.SpringBoot注解知道哪些
SpringBootApplication
RestController
9.RestController跟Controller有什么区别
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 终于写完轮子一部分:tcp代理 了,记录一下
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理