1.Java系列之基础面试题总结

1. 构造器是否可重写

首先,构造器是不能被继承的,因为每个类的类名都不相同,而构造器名称与类名相同,所以根本谈不上继承。

又由于构造器不能继承,所以就不能被重写。但是,在同一个类中,构造器是可以被重载的

2. String类能被继承吗,为什么

不可以,因为String类有final,而final修饰的类是不能被继承的

3. String,StringBuffer,StringBuilder的区别

  • String:不可变,每次对String进行操作都会产生新对象,效率低且浪费内存空间
  • StringBuffer: 可变字符序列,效率低,线程安全
  • StringBuilder: 可变字符序列,效率高,线程不安全

StringBuilder、 StringBuffer继承AbstractStringBuilder,无参数默认初始容量为16,
追加字符串的时候长度超过16则扩容:增加自身长度一倍再加2,如果还放不下,则扩容为所需长度minCapacity

private int newCapacity(int minCapacity) {
    
    
        int newCapacity = (value.length << 1) + 2;
        if (newCapacity - minCapacity < 0) {
    
    
            newCapacity = minCapacity;
        }
}       

4. 线程池五元组了解吗

线程池五元组指的是在使用线程池时,每个线程都需要维护的五个基本信息,包括线程所属的进程ID(PID)、线程ID(TID)、线程所监听的端口号(PORT)、线程状态和任务队列等信息。

其中,PID是进程ID,用于唯一标识一个进程,是操作系统分配给进程的一个唯一标识符;TID是线程ID,用于唯一标识一个线程,是操作系统分配给线程的一个唯一标识符;PORT是端口号,用于标识一个网络连接,不同的线程可以监听同一个端口号,通过不同的TID进行区分;线程状态是线程当前的运行状态,包括空闲、忙碌、等待等状态;任务队列则是线程池中用于存放待执行任务的队列。

维护这些信息可以让线程池更加高效地管理线程,提高线程的复用率,避免了频繁创建和销毁线程的开销,从而提高程序的性能

5. IO模型有哪些,讲讲你理解的nio,bio,aio的区别是啥,谈谈reactor模型

在计算机网络编程中,常用的IO模型主要有阻塞IO(Blocking IO,BIO)、非阻塞IO(Non-Blocking IO,NIO)、多路复用IO(Multiplexing IO,MIO)和异步IO(Asynchronous IO,AIO)。

  • 阻塞IO(BIO):线程会一直阻塞等待直到IO操作完成,期间无法处理其他任务。这种模型适用于并发性较低、并发请求处理较慢的场景。
  • 非阻塞IO(NIO):线程不会阻塞等待IO操作完成,而是通过轮询IO状态来判断是否就绪,如果未就绪则可以处理其他任务。但这种方式需要一直轮询,会增加CPU的负担。
  • 多路复用IO(MIO):通过一个线程处理多个IO请求,典型的实现方式有select、poll、epoll等。这种方式可以有效地减少CPU的负担,但同时也会存在性能瓶颈。
  • 异步IO(AIO):线程发起IO操作后可以立即返回继续执行其他任务,IO操作完成后再回调通知线程。这种方式适用于并发请求较多、并发处理速度较快的场景。

在Java中,常用的IO模型有BIO、NIO和AIO,其中:

  • BIO:Java标准IO模型,使用阻塞IO方式,适用于并发性较低、并发请求处理较慢的场景。
  • NIO:Java New IO模型,使用多路复用IO方式,适用于并发请求数较多、请求处理速度较快的场景。相较于BIO,NIO可以更好地处理高并发请求。
  • AIO:Java Asynchronous IO模型,使用异步IO方式,适用于需要处理大量IO请求的场景。相较于NIO,AIO的效率更高,能够更好地利用CPU资源。

Reactor模式是一种基于事件驱动的IO模型,它使用一个单独的线程来接收和分发事件,而不是为每个连接分配一个线程。当有新的连接到来时,Reactor线程会将其加入到一个事件队列中,然后通过一个或多个IO线程来处理队列中的事件。这种模型可以有效地减少线程的数量,提高系统的并发性和可伸缩性。在Java中,NIO使用的Selector就是一种Reactor模式的实现

6. 介绍下常用的Map

  • TreeMap:基于红黑树实现,实现SortedMap接口,可排序
  • HashMap:基于哈希表实现
  • HashTable:和 HashMap 类似,但它是线程安全的。它是遗留类,不应该去使用它,而是使用 ConcurrentHashMap 来支持线程安全
  • LinkedHashMap:使用双向链表来维护元素的顺序,顺序为插入顺序或者最近最少使用(LRU)顺序

本文持续更新中

猜你喜欢

转载自blog.csdn.net/SJshenjian/article/details/130173785
今日推荐