面试

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

全部评论

相关推荐

10-23 16:33
门头沟学院 Java
本人某中9本科,成绩中等,目前没科研没实习,目前后端学到了javaWeb,开始没定好方向,在学国外课程,走工程路线起步有点晚了,到这个时间点了还在学JavaWeb,顿感迷茫,不知道是坚持走下去还是寒假去准备考研。考研这个路弄得我还是心痒痒的,因为从众考研的人也不在少数,所以会有这方面的心理安慰吧,就是“不行我可以去考研啊”,而且意味着三年的缓冲,为了复试还有积攒经验美化简历,其实现在也可以去申入实验室打杂;就业可能意味着多些工作经验,工程岗应该到后面还是经验大于学历?还是有点迷茫了,求助好心人有无路线启发
千千倩倩:同27给点建议,现在这个时间点可以快速看完外卖和点评,不用跟着敲,但一定要在看的时候总结每个部分的整个业务流程,对其中的实现有一个大概的印象。然后直接开始看八股,刷算法。八股和算法最好还是在项目学习中穿插着看。如果计算机基础,算法这些基础好,加上每天刻苦学习,两周可以达到勉强能面试的水平,到时候就直接海投中小厂,在约面和面试的过程中不断巩固知识。没找到实习也没关系,就当积累经验。再沉淀一波直接明年三月开始投暑期,毕竟是9本,总是有面试机会的,只要你这三个月不懈怠,面试发挥得一定不错,只要拿到一个中,大厂暑期实习,秋招就有竞争力了。总得而言,现在还有机会,但是时间非常紧张,需要你结合自己情况考虑,共勉
你会选择考研还是直接就业
点赞 评论 收藏
分享
Java面试先知:我也是和你一样的情况,hr 说等开奖就行了
点赞 评论 收藏
分享
迷茫的大四🐶:现在是幻想时间查看图片
双非本科的出路是什么?
点赞 评论 收藏
分享
头像
10-22 20:13
中南大学 Java
序言大家好呀。我是希晨er,一个初入职场的程序猿小登最近上班摸鱼刷到了一篇文章:10年深漂,放弃高薪,回长沙一年有感,还有聊聊30岁大龄程序员过往的心路历程,突然就有点感慨。我如今也做出了和大明哥一样的抉择,只是更早。此外我22年的人生,好像从来没好好记录过。正好现在工作不太忙,就想把这些经历写下来,也希望能得到社区里各位前辈的指点个人背景我是03年出生的西安娃,父母都是普通打工人。刚从中南大学软件工程专业毕业半年,现在在老家的央企过着躺平摆烂的日子成长轨迹从农村到城市的童年我家并不是西安的,只是爸妈在西安上班,从小学之后就把我接到了西安。后来老家房子拆了,爷爷奶奶也搬了过来。农村的生活,我觉...
Yki_:看哭了,恋爱那一段你女朋友说你不够关心她,可你毕竟也愿意遇到矛盾写几千字来和她慢慢分析;说不愿意给她花钱,我感觉可能只是消费观不一样;如果她想留在长沙,也应该提前跟你说开。不过她也许会心疼你放弃大厂offer转向数字马力?我也因为同样的原因有过一段幸福而充满遗憾的感情,不过跟爱情相比确实前途更重要一点。至于offer的选择,换我我也会这么选。把这些旧事记录下来以后,接下来就好好向前看吧,加油兄弟
🍊晨光随笔
点赞 评论 收藏
分享
评论
5
7
分享

创作者周榜

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