1. TCP和UDP的区别
a. TCP是面向连接的协议,而UDP是无连接的协议。
b. TCP提供可靠的数据传输,保证数据的有序性和完整性,而UDP则不提供这些保证。
c. TCP使用流控制和拥塞控制机制,以确保数据的可靠传输,而UDP没有这些机制。
d. TCP较慢但稳定,适用于需要可靠传输的应用,如文件传输和网页浏览。而UDP较快但不稳定,适用于实时性要求较高的应用,如音视频传输和在线游戏。
2. TCP三次握手和四次挥手过程
- 三次握手过程:
a. 客户端发送一个SYN(同步)报文给服务器,请求建立连接。
b. 服务器收到SYN报文后,回复一个SYN+ACK(同步+确认)报文给客户端,表示同意建立连接。
c. 客户端收到SYN+ACK报文后,回复一个ACK(确认)报文给服务器,表示连接建立成功。 - 四次挥手过程:
a. 客户端发送一个FIN(结束)报文给服务器,请求关闭连接。
b. 服务器收到FIN报文后,回复一个ACK报文给客户端,表示收到关闭请求。
c. 服务器完成自己的数据传输后,发送一个FIN报文给客户端,请求关闭连接。
d. 客户端收到FIN报文后,回复一个ACK报文给服务器,表示同意关闭连接。此时,连接关闭。
3. B树和B+树的区别
- B树是一种平衡多路查找树,每个节点可以存储多个键和指针。B树的特点是所有叶子节点都在同一层级上,且节点的键值按升序排列。
- B+树也是一种平衡多路查找树,与B树不同的是,B+树的非叶子节点只存储键,而不存储数据,所有数据都存储在叶子节点上。叶子节点使用链表连接,方便范围查询和顺序访问。
- B树的非叶子节点存储键和指针,而B+树的非叶子节点只存储键,减少了非叶子节点的大小。
- B树的叶子节点存储键和数据,而B+树的叶子节点只存储键和数据的指针,减少了磁盘I/O操作。
- B树的范围查询需要在内部节点和叶子节点上进行,而B+树的范围查询只需要在叶子节点上进行。
- B+树的叶子节点使用链表连接,方便范围查询和顺序访问。
4. 链表和数组的区别
a. 存储方式:
- 数组是一种连续存储结构,它将元素在内存中按顺序依次存储,可以通过索引来访问元素。
- 链表是一种离散存储结构,它使用节点来存储元素,每个节点包含数据和指向下一个节点的指针。
b. 动态性:
- 数组的大小一旦确定,通常是固定的,无法动态地改变数组的长度。
- 链表的长度可以动态地增加或减少,通过添加或删除节点来实现。
c. 插入和删除操作的效率:
- 数组在插入和删除元素时,需要移动其他元素以保持连续存储的特性,可能需要进行大量的元素移动,时间复杂度为O(n)。
- 链表在插入和删除元素时,只需要调整节点的指针,不需要移动其他元素,时间复杂度为O(1)。
d. 随机访问的效率:
- 数组通过索引可以直接访问元素,时间复杂度为O(1)。
- 链表需要从头节点开始遍历到目标位置才能访问元素,时间复杂度为O(n)。
e. 内存空间的使用:
- 数组在创建时就需要分配一定的连续内存空间,无论实际使用的元素个数是多少,都会占用固定大小的内存。
- 链表的内存空间是动态分配的,每个节点可以在需要时分配,可以更灵活地利用内存空间。
5. python、C语言、C++的区别
a. 语法和易用性:
- Python的语法简洁、清晰,易于学习和理解。它使用缩进来表示代码块,没有大括号等特殊字符。
- C语言和C++的语法较为复杂,需要注意语法规则和特殊字符的使用。C++是C语言的扩展,除了C语言的语法外,还引入了面向对象编程的特性。
b. 类型系统:
- Python是一种动态类型语言,变量的类型可以在运行时自动推断,不需要显式声明。
- C语言和C++是静态类型语言,变量的类型需要在编译时显式声明,类型检查在编译时进行。
c. 内存管理:
- Python使用自动内存管理机制(垃圾回收),开发者不需要手动管理内存。Python的垃圾回收机制自动处理内存分配和释放。
- C语言和C++需要手动管理内存,开发者需要显式地分配和释放内存,以避免内存泄漏和悬空指针等问题。
d. 应用场景:
- Python适用于快速开发、脚本编写、数据分析和人工智能等领域。它具有丰富的第三方库和框架支持,提供了大量的工具和资源。
- C语言和C++适用于系统级编程、嵌入式开发、游戏开发和性能要求较高的应用。它们具有更接近底层的控制能力,可以直接操作内存和硬件。
互联网大厂测开经历,目前担任测试开发负责人,每天分享互联网面经,如果你有测试相关的问题,欢迎咨询,海鲜市场【简历优化】、【就业指导】、【模拟/辅导面试】,已辅导20位以上同学拿到心仪offer
简历修改129/次
模拟面试180/小时
测试开发工具指导180/小时