跳至主要內容
这是我准备的一些java后端maven面试题

Maven 的生命周期是什么?在每个生命周期阶段中,Maven 做了什么?

Maven 的生命周期包括 clean、default 和 site 三个阶段。在 clean 阶段,Maven 主要用于清理项目目录,删除之前生成的构建产物。在 default 阶段,Maven 主要完成编译、测试、打包、安装、部署等构建任务。在 site 阶段,Maven 会生成项目的文档和站点。

default 生命周期包括以下阶段:

validate:验证项目是否正确且所有必要的信息可用。
compile:编译项目的源代码。
test:使用合适的单元测试框架测试编译后的代码。
package:将编译后的代码打包成可发布的格式,如 JAR、WAR 等。
verify:对打包后的代码进行额外的集成测试,以保证其质量。
install:将打包好的项目安装到本地 Maven 仓库,以供其他项目使用。
deploy:将打包好的项目部署到远程 Maven 仓库,以供其他开发者使用。


程序员诚哥大约 5 分钟面试题mavenjava
java中Date与LocalDateTime的区别

摘要

本文探讨了Java中DateLocalDateTime两个日期和时间类的区别。以下是摘要:

  • Date是Java早期引入的日期和时间类,而LocalDateTime是Java 8中引入的新日期和时间类。
  • Date是可变类,容易引发线程安全问题,而LocalDateTime是不可变类,更加可靠和可维护。
  • Date考虑系统时区,而LocalDateTime不带时区信息,如果需要处理时区,可以使用ZonedDateTime类。
  • Date精确到毫秒级别,但设计存在问题,容易出错。LocalDateTime提供了更好的精确度,可表示纳秒级别的时间。
  • Date的API设计相对较旧,不够直观,部分方法已过时。LocalDateTime的API设计更现代化、易于使用,并提供了方便的方法来处理日期和时间。

程序员诚哥大约 4 分钟面试题java
java中避免使用“isSuccess“作为变量名的原因和解决方法

阿里巴巴Java开发手册的说法

在阿里巴巴Java开发手册中关于这一点,有过一个『强制性』规定:
在这里插入图片描述

其他原因

另外根据Java命名约定,方法名应该以动词开头,而变量名应该以名词或形容词开头。使用"isSuccess"作为变量名可能会让其他开发人员困惑,误以为它是一个方法调用。

解决方法

建议将"isSuccess"改写为"success"


程序员诚哥大约 2 分钟面试题java阿里巴巴Java开发手册
springboot源码解析:用@RestControllerAdvice和@ExceptionHandler处理全局异常

摘要

本文讨论 Spring Boot 中的 @RestControllerAdvice 注解及其作用。@RestControllerAdvice 注解用于定义全局异常处理器和全局数据绑定设置。它标记的类可以处理全局范围内的异常,并根据定义的处理方法执行自定义逻辑。我们还探讨了 Spring 底层是如何实现和处理 @RestControllerAdvice 的。

Spring Boot 使用基于注解的配置方式,通过扫描和初始化标记了 @RestControllerAdvice 注解的类来创建全局异常处理器。该类中的方法使用 @ExceptionHandler 注解来标记,用于处理特定类型的异常。通过 AOP 和事件机制,Spring 在关键的处理流程中拦截、处理异常和数据绑定,并使用 @RestControllerAdvice 注解提供的机制来实现全局异常处理和数据绑定设置。


程序员诚哥大约 6 分钟面试题springbootjava
讲讲@Configuration 和 @Component 的区别

一句话回答

  • @Configuration 用于定义配置类,其中包含了用 @Bean 注解定义的 bean 创建方法,用于配置 Spring 容器。
  • @Component 用于标记普通的 Spring bean 类,它们可以是服务类、数据访问对象或其他组件,用于自动扫描和注册到 Spring 容器。

详细回答

  1. @Configuration
    • @Configuration 是一个特殊的 Spring 注解,它用于标记一个类,表明这个类是一个配置类。配置类通常包含了一组用于定义 Spring bean 的方法。
    • 配置类中的方法通常使用 @Bean 注解来定义 bean 对象,并且这些方法可以包含复杂的逻辑,以创建和配置 bean。
    • @Configuration 类通常用于 Java 配置方式,它允许你以编程方式配置 Spring 容器。这对于集中管理应用程序的配置非常有用。

程序员诚哥大约 3 分钟面试题springbootjava
interceptor和filter的区别

Interceptor(拦截器)和 Filter(过滤器)都是在Java Web应用中用于处理请求和响应的组件,但它们有一些关键区别:

  1. 位置

    • Filter位于Web容器的底层,它拦截请求和响应在Servlet之前和之后的所有内容,包括静态资源(如HTML、CSS、JavaScript文件)。
    • Interceptor是Spring框架的一部分,通常用于拦截处理器方法(Controller方法)的调用,它在Servlet层之上工作,专门用于Spring MVC应用。
  2. 依赖

    • Filter是Servlet规范的一部分,不依赖于任何特定的框架。你可以在任何Servlet容器中使用它,而不仅仅是在Spring应用中。
    • Interceptor是Spring框架的一部分,因此依赖于Spring。它仅在Spring应用中使用,并且通常与Spring MVC一起工作。
  3. 使用范围

    • Filter通常用于处理与HTTP请求和响应相关的通用任务,如日志记录、字符编码转换、身份验证、跨站点请求伪造(CSRF)防护等。
    • Interceptor主要用于Spring MVC应用中,在请求到达控制器(Controller)之前或之后执行特定的操作,如身份验证、日志记录、性能测量、权限检查等。
  4. 配置方式

    • Filter的配置通常在web.xml文件中进行,或者通过注解方式配置(Servlet 3.0+支持)。
    • Interceptor的配置是在Spring配置文件中进行的,通常通过实现HandlerInterceptor接口来创建自定义拦截器,并在配置文件中声明它们。
  5. 执行顺序

    • Filter的执行顺序在web.xml中定义的顺序,或者在注解中指定的顺序。多个Filter按照配置的顺序依次执行。
    • Interceptor的执行顺序可以通过配置来定义,Spring框架会按照配置的顺序执行多个拦截器。

程序员诚哥大约 2 分钟面试题springbootjava
linkedlist和arraylist的区别

LinkedListArrayList都是常见的数据结构,用于存储和操作集合元素,如果需要频繁进行插入和删除操作,LinkedList可能更适合。如果需要快速随机访问和较小的内存占用,ArrayList可能更合适。

以下是它们之间存在一些关键的区别:

  1. 底层数据结构

    • ArrayListArrayList使用动态数组(数组)作为其底层数据结构。这意味着它在内存中是连续存储的,可以通过索引快速访问元素。
    • LinkedListLinkedList使用双向链表作为其底层数据结构。这意味着每个元素都包含了指向前一个元素和后一个元素的引用,但不是连续存储的。
  2. 插入和删除操作

    • ArrayList:插入和删除元素通常需要移动其他元素,特别是在列表的中间或开头。这些操作的时间复杂度为O(n),其中n是列表的大小。
    • LinkedList:由于双向链表的结构,插入和删除元素通常更高效,因为只需要调整指针。这些操作的时间复杂度为O(1),除非需要遍历列表来找到特定位置。
  3. 随机访问

    • ArrayList:由于底层是数组,ArrayList支持快速的随机访问,可以通过索引直接访问元素,时间复杂度为O(1)。
    • LinkedListLinkedList不支持直接的随机访问,必须从头或尾部开始遍历链表来找到特定位置的元素,时间复杂度为O(n/2),其中n是列表的大小。
  4. 内存使用

    • ArrayList:由于是连续存储的数组,ArrayList通常在内存上占用的空间更少。
    • LinkedListLinkedList需要额外的内存来存储链表节点的引用,因此通常占用的内存更多。
  5. 迭代性能

    • ArrayListArrayList在迭代操作上通常比LinkedList更快,因为它可以通过数组索引直接访问元素。
    • LinkedListLinkedList的迭代性能较差,因为它需要在链表节点之间移动,并且不支持随机访问。

程序员诚哥大约 2 分钟面试题java
redis有哪些数据类型并用java代码实现一下

以下是Redis中常见的数据类型:

  1. 字符串(String):Redis中的字符串是二进制安全的,可以包含任何数据,例如文本、图像或序列化的对象。常见的字符串操作包括设置、获取、追加、增加数字等。

  2. 哈希表(Hash):哈希表是一个键值对集合,用于存储对象的字段和相关值。在Redis中,哈希表适合用于表示和存储对象,每个字段都是一个属性,与属性相关联的值是属性的值。

  3. 列表(List):列表是有序的字符串元素集合,可以在列表的两端进行插入和删除操作。Redis的列表是支持重复元素的,可以用于实现队列、堆栈和日志等数据结构。

  4. 集合(Set):集合是一组唯一的字符串元素,不允许重复值。可以执行集合的交集、并集和差集等操作,还可以用于实现点赞、标签等功能。

  5. 有序集合(Sorted Set):有序集合与集合类似,但每个元素都有一个关联的分数(score),元素根据分数进行排序。有序集合适用于排行榜、范围查询等情况。

  6. 位图(Bitmap):位图是一个由二进制位组成的数据结构,可以进行位运算操作。位图通常用于处理布尔数据、跟踪用户行为等。

  7. HyperLogLog(基数估计):HyperLogLog是用于估计集合中不同元素数量的数据结构。它可以进行高效的基数估计,适用于大规模的数据集。

  8. 地理空间数据(Geospatial Data):Redis支持存储和查询地理位置数据,如经度和纬度信息。这使得可以在Redis中构建地理应用,如位置服务。

  9. 流(Stream):流是有序的消息记录,用于处理事件驱动的数据。流支持添加、消费和检索消息,适用于日志、消息队列等场景。


程序员诚哥大约 3 分钟面试题redisjava
SpringBoot 如何进行参数校验

在Spring Boot中进行参数校验通常是使用JSR 303规范(也称为Bean Validation)的注解和Spring的Validation API来完成的。以下是一些常见的步骤和示例,用于在Spring Boot应用程序中进行参数校验:

  1. 添加依赖:
    首先,确保在项目的pom.xml文件中添加以下依赖,以引入Spring Boot和Bean Validation相关的库:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>
    <dependency>
        <groupId>javax.validation</groupId>
        <artifactId>validation-api</artifactId>
    </dependency>
    <dependency>
        <groupId>org.hibernate.validator</groupId>
        <artifactId>hibernate-validator</artifactId>
    </dependency>
    
  2. 创建DTO类(数据传输对象):
    在你的应用中创建一个DTO类,该类用于接收和验证请求参数。在DTO类的字段上使用Bean Validation注解来指定参数校验规则。例如:

    import javax.validation.constraints.NotBlank;
    import javax.validation.constraints.Positive;
    
    public class UserDTO {
        @NotBlank(message = "用户名不能为空")
        private String username;
        
        @Positive(message = "年龄必须为正整数")
        private int age;
        
        // Getter和Setter方法
    }
    

程序员诚哥大约 3 分钟面试题springbootjava
SpringBoot中@Autowired @Resource @Qualifier的区别

@Autowired@Resource@Qualifier 是在Spring框架中用于管理依赖注入和连接Bean的常用注解,它们各自有不同的用途:

  • @Autowired 主要用于基于类型的注入。
  • @Resource 用于基于名称的注入,不仅限于Spring。
  • @Qualifier 用于在存在多个相同类型的Bean可供注入时,指定Bean的名称或标识符,通常与 @Autowired@Resource 结合使用来解决歧义问题。

程序员诚哥大约 1 分钟面试题springbootjava
2