1,throw 和 throws 的区别?
不同点:
一:位置不同。throws用在函数上,后边跟的是异常类,可以跟多个异常类。throw用在函数内,后面跟的是异常对象。
二:功能不同。①throws用来声明异常,让调用者只知道该功能可能出现的问题,可以给出预先得处理方式。
throw抛出具体的问题对象,执行到throw。功能就已经结束了跳转到调用者,并将具体的问题对象抛给调用者,
也就是说throw语句独立存在时,下面不要定义其他语句,因为执行不到。②throws表示出现异常的一种可能性,
并不一定会发生这些异常,throw则是抛出了异常,执行throw则一定抛出了某种异常对象。
相同点:
两者都是消极处理异常的方式,只是抛出或者可能抛出异常,但是不会由函数去处理异常,真正的处理异常由函数的上层调用处理
2,tcp 为什么要三次握手,两次不行吗?为什么?
原因1:主要是为了防止已经失效的连接请求报文突然又传送到了服务器,
从而导致不必要的错误和资源的浪费。
如果使用的是两次握手建立连接,假设有这样一种场景,客户端发送的第一个请求连接并且没有丢失,
只是因为在网络中滞留的时间太长了,由于TCP的客户端迟迟没有收到确认报文,以为服务器没有收到,
此时重新向服务器发送这条报文,此后客户端和服务器经过两次握手完成连接,传输数据,然后关闭连接。
此时之前滞留的那一次请求连接,因为网络通畅了, 到达了服务器,这个报文本该是失效的,
但是,两次握手的机制将会让客户端和服务器再次建立连接,这将导致不必要的错误和资源的浪费。
如果采用的是三次握手,就算是那一次失效的报文传送过来了,服务端接受到了那条失效报文并且回复了确认报文,
但是客户端不会再次发出确认。由于服务器收不到确认,就知道客户端并没有请求连接。
原因2: 两次握手只能保证单向连接是畅通的。因为TCP是一个双向传输协议,只有经过第三次握手,
才能确保双向都可以接收到对方的发送的数据。
三次握手过程:
第一次握手:客户端发送syn包(seq=x)到服务器,并进入SYN_SEND状态,等待服务器确认;第二次握手:
服务器收到syn包,必须确认客户的SYN(ack=x+1),同时自己也发送一个SYN包(seq=y),即SYN+ACK包,
此时服务器进入SYN_RECV状态;第三次握手:客户端收到服务器的SYN+ACK包,向服务器发送确认包ACK(ack=y+1),
此包发送完毕,客户端和服务器进入ESTABLISHED状态,完成三次握手。
握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。
理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。
3,OSI 的七层模型都有哪些?
1、应用层:网络服务与最终用户的一个接口。
2、表示层:数据的表示、安全、压缩。
3、会话层:建立、管理、终止会话。
4、传输层:定义传输数据的协议端口号,以及流控和差错校验。
5、网络层:进行逻辑地址寻址,实现不同网络之间的路径选择。
6、数据链路层:建立逻辑连接、进行硬件地址寻址、差错校验等功能。
7、物理层:建立、维护、断开物理连接。
4,java线程安全的集合类主要有中些?
ConcurrentHashMap:是线程安全的哈希表实现,适用于多线程并发读写操作的场景。
CopyOnWriteArrayList:是线程安全的动态数组实现,适用于读操作频繁、写操作较少的场景。
ConcurrentLinkedQueue:是线程安全的链表队列实现,适用于多线程并发读写操作的场景。
ConcurrentSkipListMap:是线程安全的跳表实现,适用于有序的并发操作。
BlockingQueue:是一个接口,提供了阻塞队列的功能,常见的实现类有ArrayBlockingQueue、LinkedBlockingQueue等,适用于生产者-消费者模式