JAVA面经总结

1. TCP 和 UDP 的区别:
传输层有两个传输协议:TCP(传输控制协议)和 UDP(用户数据报协议)。其中,TCP是一个可靠的面向连接的协议,udp是不可靠的或者说无连接的协议

  • TCP 是面向连接的,UDP 是面向无连接的

  • UDP程序结构较简单

  • TCP 是面向字节流的,UDP 是基于数据报的

  • TCP 保证数据正确性,UDP 可能丢包

  • TCP 保证数据顺序,UDP 不保证
    在这里插入图片描述

2. TCP 为什么是可靠连接

  • 通过 TCP 连接传输的数据无差错,不丢失,不重复,且按顺序到达。
  • TCP 报文头里面的序号能使 TCP 的数据按序到达
  • 报文头里面的确认序号能保证不丢包,累计确认及超时重传机制
  • TCP 拥有流量控制及拥塞控制的机制

3.三次握手过程
第一次握手就是客户端给服务器端发送一个报文,第二次就是服务器收到报文之后,会应答一个报文给客户端,第三次握手就是客户端收到报文后再给服务器发送一个报文,三次握手就成功了。

4. 四次挥手过程
当客户A 没有东西要发送时就要释放 A 这边的连接,A会发送一个报文(没有数据),其中 FIN 设置为1, 服务器B收到后会给应用程序一个信,这时A那边的连接已经关闭,即A不再发送信息(但仍可接收信息)。 A收到B的确认后进入等待状态,等待B请求释放连接, B数据发送完成后就向A请求连接释放,也是用FIN=1 表示, 并且用 ack = u+1(如图), A收到后回复一个确认信息,并进入 TIME_WAIT 状态, 等待 2MSL 时间。

5.为什么要等待2MSL
如果说你给上官发送的那个确认如果在中途丢失了,上官迟迟等不到你的确认,他肯定会执行超时重传给你重新发一个请求关闭连接的报文的,如果你不等待这么长时间而直接进入关闭状态,是不是就接收不到这个重传的报文了?那上官是不是就收不到你的确认,进而上官就不能正常关闭了?如下图:

在这里插入图片描述

6.redis
数据类型:字符串、列表、集合、散列表、有序集合
String,List,Set,Zset,Hash

应用场景:计数器,缓存,查找表,消息队列(发布/订阅功能),分布式锁实现

持久化机制:Redis 提供两种持久化机制 RDB(默认) 和 AOF 机制

  1. RDB是Redis默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到硬盘中,对应产生的数据文件为dump.rdb。通过配置文件中的save参数来定义快照的周期。
  2. AOF持久化(即Append Only File持久化),则是将Redis执行的每次写命令记录到单独的日志文件中,当重启Redis会重新将持久化的日志中文件恢复数据。
  3. 优缺点:1、AOF文件比RDB更新频率高,优先使用AOF还原数据。2。AOF比RDB更安全也更大 3.RDB性能比AOF好 4.如果两个都配了优先加载AOF

7.为什么不能用redis做专门的持久化数据库存储
5. 如果Redis被当做缓存使用,使用一致性哈希实现动态扩容缩容。
6. 如果Redis被当做一个持久化存储使用,必须使用固定的keys-to-nodes映射关系,节点的数量一旦确定不能变化。否则的话(即Redis节点需要动态变化的情况),必须使用可以在运行时进行数据再平衡的一套系统,而当前只有Redis集群可以做到这样。

8. 进程与线程的区别

  1. 线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;

  2. 一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;

  3. 进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段,数据集,堆等)及一些进程级的资源(如打开文件和信号等),某进程内的线程在其他进程不可见;

  4. 调度和切换:线程上下文切换比进程上下文切换要快得多。

9.几种进程间的通信方式
在这里插入图片描述

(1) 管道(pipe):管道是一种半双工的通信方式,数据只能单向流动,而且只能在具有血缘关系的进程间使用。进程的血缘关系通常指父子进程关系。

(2)有名管道(named pipe):有名管道也是半双工的通信方式,但是它允许无亲缘关系进程间通信。

(3)信号量(semophore):信号量是一个计数器,可以用来控制多个进程对共享资源的访问。它通常作为一种锁机制,防止某进程正在访问共享资源时,其他进程也访问该资源。因此,主要作为进程间以及同一进程内不同线程之间的同步手段。

(4)消息队列(message queue):消息队列是由消息组成的链表,存放在内核中 并由消息队列标识符标识。消息队列克服了信号传递信息少,管道只能承载无格式字节流以及缓冲区大小受限等缺点。

(5)信号(signal):信号是一种比较复杂的通信方式,用于通知接收进程某一事件已经发生。

(6)共享内存(shared memory):共享内存就是映射一段能被其他进程所访问的内存,这段共享内存由一个进程创建,但多个进程都可以访问,共享内存是最快的IPC方式,它是针对其他进程间的通信方式运行效率低而专门设计的。它往往与其他通信机制,如信号量配合使用,来实现进程间的同步和通信。

(7)套接字(socket):套接口也是一种进程间的通信机制,与其他通信机制不同的是它可以用于不同及其间的进程通信。

10.几种线程间的通信机制
1、锁机制

 1.1 互斥锁:提供了以排它方式阻止数据结构被并发修改的方法。

 1.2 读写锁:允许多个线程同时读共享数据,而对写操作互斥。

 1.3 条件变量:可以以原子的方式阻塞进程,直到某个特定条件为真为止。对条件测试是在互斥锁的保护下进行的。条件变量始终与互斥锁一起使用。

2、信号量机制:包括无名线程信号量与有名线程信号量

3、信号机制:类似于进程间的信号处理。

11.HashMap
什么是hashmap:

  • HashMap的内部实现机制是对数据结构中哈希表(Hash Table)的实现,Hash表又叫散列表。
    Hash表是根据关键码Key来访问其对应的值Value的数据结构,他是通过一个映射函数把关键码映射到表中一个位置来访问该位置的值,从而加快查找的速度。这个映射函数叫做Hash函数,存放的数组叫做Hash表。

Hash的实现:

  • 主要是 哈希算法 和 冲突的解决 计算出map中key的哈希值,在哈希表中找到<key,value>的位置,根据key找value
    当多个哈希值冲突的时候,在哈希值的同一个位置上使用链表结构来保存多个对象,而hashMap访问map的时候
    也是根据key的hashCode的值来快速定位,入伙HashMap中俩个以上的元素具有相同的HashCode值,将会导致性能下降
    在这里插入图片描述

put 和get 方法
在这里插入图片描述

在这里插入图片描述

rehash的解释:

  • 在创建hashMAP的时候可以设置来个参数,一般默认 初始化容量:创建hash表时桶的数量
    负载因子:负载因子=map的size/初始化容量
    当hash表中的负载因子达到负载极限的时候,hash表会自动成倍的增加容量(桶的数量),并将原有的对象重新的分配并加入新的桶内,这称为rehash。这个过程是十分消耗性能的,一般不要,一般建议设置比较大的初始化容量,防止rehash,但是也不能设置过大,初始化容量过大 浪费空间

12.数据库索引类型

  • 主键索引:数据记录里面不能有 null,数据内容不能重复,在一张表里面不能有多个主键索引。
  • 普通索引:使用字段关键字建立的索引,主要是提高查询速度
  • 唯一索引:字段数据是唯一的,数据内容里面能为 null,不能是重复的内容。在一张表里面,是可以添加多个唯一索引。
  • 全文索引:在比较老的版本中,只有 myisam 引擎支持全文索引,在 innodb5.6 后引擎也支持全文索引,在 mysql中全文索引不支持中文。我们一般使用 sphinx 集合 coreseek 来实现中文的全文索引。
  • 组合索引

13. B树与B+树简明扼要的区别
B树:每个节点都存储key和data,所有节点组成这棵树,并且叶子节点指针为null。
在这里插入图片描述
B+树:只有叶子节点存储data,叶子节点包含了这棵树的所有键值,叶子节点不存储指针。
在这里插入图片描述

14.

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值