《互联网大厂Java面试:核心知识大考验》

79 阅读6分钟

互联网大厂Java面试:核心知识大考验

面试官:好,开始面试。第一轮,先问几个基础的Java核心知识问题。首先,Java 中数据类型分为哪几类?

王铁牛:分为基本数据类型和引用数据类型。基本数据类型有整型、浮点型、字符型、布尔型这些;引用数据类型比如类、接口、数组等。

面试官:回答得不错。那再问你,String 类为什么是不可变的?

王铁牛:因为String类被final修饰,它的内部字符数组也是用final修饰的,一旦初始化就不能再修改,所以是不可变的。

面试官:很好,这两个问题回答得都很准确。接下来进入第二轮,关于多线程的问题。线程有哪些状态?

王铁牛:有新建、就绪、运行、阻塞、死亡这几种状态。新建就是刚创建线程对象;就绪就是线程获取了CPU资源可以执行;运行就是正在执行;阻塞就是因为某些原因暂停执行;死亡就是线程执行完毕。

面试官:嗯,还可以。那说说线程池的作用和优势。

王铁牛:线程池可以复用线程,减少线程创建和销毁的开销,提高性能,还能控制并发线程数,避免资源耗尽。

面试官:最后一轮,关于框架的问题。Spring框架的核心特性有哪些?

王铁牛:它有依赖注入、面向切面编程、IoC容器这些特性。依赖注入就是把对象依赖的其他对象通过配置注入进来;面向切面编程可以把一些通用功能比如日志、事务等模块化;IoC容器管理对象的创建和依赖关系。

面试官:好的,面试就到这里,回去等通知吧。

答案

  1. Java 中数据类型分为哪几类
    • 基本数据类型
      • 整型:包括 byte(1 字节)、short(2 字节)、int(4 字节)、long(8 字节)。用于存储整数数值。
      • 浮点型:float(4 字节)、double(8 字节)。用于存储小数数值。
      • 字符型:char(2 字节)。用于存储单个字符。
      • 布尔型:boolean(通常 1 位,但实际大小因虚拟机而异)。用于表示真或假。
    • 引用数据类型
      • :是面向对象编程中最基本的构造,包含成员变量和方法。
      • 接口:定义了一组方法签名,实现接口的类必须实现这些方法。
      • 数组:可以存储多个相同类型的数据。
  2. String 类为什么是不可变的
    • String 类被声明为 final,这意味着它不能被继承。
    • 其内部使用 char 数组来存储字符,并且这个 char 数组被声明为 final。
    • 当创建一个 String 对象后,其内部的 char 数组一旦初始化,就不能再指向其他的字符数组,也不能修改数组中的元素。例如,当调用 String 的一些方法如 concat 时,实际上并不是修改原来的 String 对象,而是返回一个新的 String 对象。这样保证了 String 对象在多线程环境下的安全性和一致性,因为一旦一个 String 对象被创建和共享,它的值不会被意外修改。
  3. 线程有哪些状态
    • 新建(New):线程刚被创建,还没有调用 start()方法。此时线程对象已经创建,但还没有分配到 CPU 资源。
    • 就绪(Runnable):线程调用了 start()方法后,进入就绪状态。此时线程具备了运行的条件,等待获取 CPU 资源来执行。
    • 运行(Running):线程获取到 CPU 资源,正在执行线程体中的代码。
    • 阻塞(Blocked)
      • 等待阻塞:线程调用 wait()方法,进入等待阻塞状态,释放对象锁,直到其他线程调用该对象的 notify()或 notifyAll()方法唤醒它。
      • 同步阻塞:线程在获取对象锁时,如果该锁被其他线程占用,就会进入同步阻塞状态,直到锁被释放。
      • 其他阻塞:线程调用 sleep()方法、join()方法或者发出了 I/O 请求时,进入其他阻塞状态,直到超时或者 I/O 操作完成。
    • 死亡(Dead):线程执行完了 run()方法或者调用了 stop()方法等正常或异常结束执行后,进入死亡状态。死亡状态的线程不能再重新启动。
  4. 线程池的作用和优势
    • 作用
      • 复用线程:避免频繁创建和销毁线程,减少系统开销。例如在一个高并发的服务器场景中,如果每次请求都创建一个新线程,会消耗大量的系统资源,而线程池可以复用有限的线程来处理多个请求。
      • 控制并发数量:可以根据系统资源情况合理设置线程池的大小,避免过多线程同时运行导致系统资源耗尽。比如在一个有一定硬件资源限制的服务器上,通过线程池控制并发线程数,保证系统稳定运行。
    • 优势
      • 提高性能:由于减少了线程创建和销毁的开销,线程池中的线程可以快速响应任务请求,提高整体性能。
      • 便于管理:统一管理线程的创建、销毁和复用,方便进行资源监控和优化。例如可以通过线程池的参数调整来适应不同的业务负载。
  5. Spring 框架的核心特性有哪些
    • 依赖注入(Dependency Injection)
      • 它是 Spring 框架的核心特性之一。通过依赖注入,对象不需要自己创建所依赖的其他对象,而是由 Spring 容器负责将这些依赖对象注入到需要的地方。这样可以降低对象之间的耦合度。比如一个业务类需要调用另一个数据访问类,传统方式是在业务类中直接创建数据访问类的实例,而使用 Spring 依赖注入,业务类只需要声明对数据访问类的依赖,由 Spring 容器在合适的时候注入实例。
    • 面向切面编程(Aspect - Oriented Programming,AOP)
      • Spring 支持 AOP,可以将一些通用的功能如日志记录、事务管理等模块化。例如,在多个业务方法中都需要进行日志记录,如果不使用 AOP,每个方法都要重复编写日志记录代码。使用 AOP 可以将日志记录功能作为一个切面,通过配置在方法执行前后等切点位置切入,统一处理日志记录,减少代码冗余。
    • IoC 容器(Inversion of Control Container)
      • Spring 的 IoC 容器负责创建、配置和管理对象之间的依赖关系。它提供了一个容器环境,在这个环境中,对象的创建和依赖注入都由容器来完成。开发人员只需要关注对象的业务逻辑,而不需要关心对象的创建过程和依赖关系的维护。例如,一个复杂的应用中有多个相互依赖的业务组件,通过 IoC 容器可以方便地管理这些组件之间的关系,使得代码结构更加清晰和易于维护。