面试

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

全部评论

相关推荐

08-27 18:56
河海大学 Java
🕒 岗位面试时间 37分钟经纬恒润:智能驾驶仿真工程师 base 南京先自我介绍介绍一个最有成就感的项目针对项目提了几个问题问了两个特别简单的八股问题如何访问c++类中的私有成员变量,公有get函数,还有友元函数冒泡算法tcp的三次握手和四次挥手面试官介绍部门问是否感兴趣(其实面试官已经发现了我的兴趣是编程开发相关跟他们的业务不匹配)我还是小小地挣扎了一下,说对智能驾驶还是比较感兴趣的好家伙结果一问,我还很庆幸面试前特地去了解了,然而回答的时候就只记得看过脑子是回答不上来,嘴还在巴拉巴拉说问是否接受出差问期望薪资反问公司的培养方案如何?2周扫盲,几月之后考核(忘了多久,第一次面试忘了录音) 如果加入部门,需要掌握哪些仿真工具?最后问了对我面试的评价。面试官直说了感觉我的兴趣和技能和部门不匹配,但是不会直接pass,还给了个希望,可以推到其他部门考虑看看。🤔 面试感受面试官人很好,即使我回答不出来也不会让我尴尬。面试凉掉的主要原因还是投递的时候很盲目,只看岗位要求,官网的岗位职责写的也很泛,面试官介绍部门的业务方向和我想的完全不一样。我以为要求c++/Python是通过编程开发智能驾驶仿真系统。即使我的技能和兴趣和部门不是很匹配。面试官还是很耐心地解释了一下他们部门的主要业务是基于matalb和HIL做功能的黑盒测试。最后又去看了一下岗位职责,是它写的有点误导性,负责智能驾驶仿真系统开发。👥 面试总结面试是双向选择,不用太担心和紧张把语速放慢,给脑子思考的时间发出来攒个人品,希望有帮助,共勉明天还有一场面试加油 #第一次面试#
查看9道真题和解析 第一次面试
点赞 评论 收藏
分享
5 7 评论
分享
牛客网
牛客企业服务