面试

tcp为什么要四次挥手:TCP协议采用四次挥手(Four-Way Handshake)来确保可靠地终止一个连接,原因主要包括以下几点:

全双工通信的需要:TCP连接是全双工的,意味着数据可以同时在两个方向上传输。因此,每个方向的连接关闭都需要独立进行。当一端完成数据发送任务后,它会发送一个FIN(Finish)标志来终止这个方向的连接。四次挥手确保了两个方向上的连接都能被正确且独立地关闭。

确保数据完整性:在四次挥手过程中,当一端发送了FIN请求断开连接后,另一端可能还有数据需要发送。因此,它会先回复一个ACK确认收到断开请求,然后继续发送剩余数据,直到自身数据发送完毕,再发送自己的FIN包。这样可以确保双方的数据都能够被完整地传输,不会因过早关闭连接而导致数据丢失。

确保双方都准备好关闭:第一次挥手是客户端请求断开,第二次挥手是服务器确认收到断开请求。但此时服务器可能还在发送数据,因此需要等到数据发送完毕后再发送第三次挥手(服务器的FIN包)。客户端在收到服务器的FIN后,发送最后一个ACK,表示已经准备好关闭连接。这样确保了双方都明确知道对方已经没有数据要发送,可以安全关闭连接。

防止旧数据混淆:四次挥手的最后阶段还包括一个等待时间(TIME_WAIT状态),在此期间,连接不会立即释放,以防最后一个ACK包在网络中丢失,需要重传。这有助于确保不会有旧的数据片段在新连接中被错误地接收。

综上所述,TCP四次挥手是为了确保在关闭连接时双方的数据传输完整,连接的关闭是有序且可靠的,同时也为可能的重传留出了时间,以此来维护数据的一致性和连接的稳定性。

list,set, map:List(列表)

特点:List是一个有序的集合,可以包含重复元素。每个元素都有一个索引,从0开始,可以按照索引访问元素。

常用实现:ArrayList, LinkedList, Vector等。其中,ArrayList提供了快速的随机访问,但插入和删除效率较低(尤其是在列表前面或中间操作);LinkedList适合频繁的插入和删除操作,但随机访问较慢。

应用场景:当需要保持元素的插入顺序,或需要通过索引来访问元素时,使用List。

Set(集)

特点:Set是一个不包含重复元素的集合,即每个元素最多只能出现一次。它没有索引,不能通过索引来访问元素。

常用实现:HashSet, LinkedHashSet, TreeSet等。HashSet提供最快的查询速度,但不保证元素的迭代顺序;LinkedHashSet保持插入顺序;TreeSet对元素进行排序,要么自然排序,要么通过比较器Comparator。

应用场景:当你需要确保集合中元素的唯一性时,应该使用Set。

Map(映射)

特点:Map是一种键值对的数据结构,每个键(Key)都是唯一的,对应一个值(Value)。Map中的元素是成对出现的,键不能重复,但值可以。

常用实现:HashMap, LinkedHashMap, TreeMap, Hashtable等。HashMap提供了快速的访问速度,但不保证顺序;LinkedHashMap保持插入顺序或访问顺序;TreeMap按键自然排序或定制排序;Hashtable是线程安全的,但已逐渐被ConcurrentHashMap取代,因为后者在并发操作上表现更好。

应用场景:当需要通过特定的键来查找、存储或删除关联的值时,Map是理想的选择。

总结来说,选择使用List、Set还是Map,取决于你的具体需求:是否需要保证元素的唯一性、是否需要有序访问、是否需要键值对存储等。

hashmap和hashtable的区别:HashMap和Hashtable在Java中都是用来存储键值对的数据结构,但它们之间存在一些关键差异,主要体现在以下几个方面:

线程安全性:

Hashtable:是线程安全的,它通过在方法上同步(synchronized)来实现,这意味着在多线程环境下可以直接使用Hashtable而无需额外的同步措施,但这也使得它在单线程环境下的性能不如HashMap。

HashMap:非线程安全,如果在多线程环境中不加控制地使用HashMap,可能会导致数据不一致的问题。为了在多线程环境下安全使用,可以使用Collections.synchronizedMap()方法来包装HashMap,或者使用更现代且高效的ConcurrentHashMap。

支持null值:

HashMap:允许null键和null值,尽管推荐尽量避免使用null键,因为这样会降低哈希表的性能。

Hashtable:既不允许null键也不允许null值,尝试插入null会导致NullPointerException。

继承关系和接口实现:

HashMap:继承自AbstractMap类,并实现了Map接口。

Hashtable:继承自较老的Dictionary类,同样实现了Map

全部评论

相关推荐

不愿透露姓名的神秘牛友
05-20 16:14
已编辑
不止遇到一次了,什么都不会,让提合并请求,问什么是合并请求。让gitlab.页面把测试截图附上,不知道截图要放在哪,那么大的编辑看不到吗让配开发机,问ip是什么东西……这都咋进来的啊,我们(我2023年毕业)那会儿没AI的时候面试都是直接linux,docker,k8s,git,结构与算法,计网。怎么才过去2年,实习生跟傻子一样,有些问题问的我难受,不会git commit,不会git pull,不会切换分支,直接要覆盖master....————而且态度非常敷衍,3天前给开个仓库权限,连本地都没有拉下来。让写一个小文档,都是说一句,写一句,说把目录加上,挺嗤之以鼻,最后还是把目录加上了😂😂任何文档和注释都是方便后来人的,现在的人真的很自负啊,打开github看看任何一个开源项目的文档和注释,都写的很详细。难道现在的同学在校期间不经常拉开源项目看源码学习吗? 哪怕是一个swap函数,开源项目里都经常注释:1 3 5 7 9 2 4 6 8 10^           ^l              rswap:{功能描述}{使用样例}————给我气笑了,没次问我有什么任务的时候,我都是说,优先你学校导师的项目,然后再做公司需求。然后给了两个需求,一个月内搞定就行,既然是agent开发,1. 部署需要维护项目的开发环境2.阅读opencode/openclaude代码(我个人感觉龙虾的源码agent部分很常规,就一个channel+agent,还不如看claude泄露的代码和opencode)然后任务1搞了几周说因为环境问题,他申请到的远程开发机是linux,装的python2,项目是py3的,所以没搭建,我说你不行就用conda或docker把环境屏蔽了呢,没搭理我。任务2:看了很长时间代码,给我回了一句,opencode和openclaude是用go写的……我说你打开github看右下角那的语言是ts还是go…… 结果满脸懵的说ts是什么……我让看agent loop,哪怕全局搜索一下while(true),跳过去从头看到尾就大致清楚了,压根没看。————嘻嘻,我已经开始做社招简历了。
redf1sh:默认会git结果发现真不会,这种一看就是没做过项目的,真做过项目的至少会提交
点赞 评论 收藏
分享
评论
5
7
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务