java高频面试题-基础篇

本文讨论了throw和throws关键字在函数中的区别,TCP三次握手的原因,OSI七层模型的结构,以及Java中线程安全的集合类如ConcurrentHashMap和CopyOnWriteArrayList等。
摘要由CSDN通过智能技术生成

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等,适用于生产者-消费者模式

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值