Java面经10.15

0.动态规划的实现

动态规划的核心思想:

  • 分治思想:将问题分解为若干个子问题,通过求解这些子问题来解决整个问题。
  • 状态定义:定义状态表示问题的某一阶段。
  • 状态转移方程:通过状态转移方程将前一个状态的解引入当前状态。
  • 存储中间结果:通过存储已经计算过的子问题结果,避免重复计算,提高效率。

代码示例(斐波那契):

java 复制代码
public class FibonacciDP {

    // 动态规划求解斐波那契数列
    public static int fibonacci(int n) {
        if (n <= 1) {
            return n;
        }

        // 定义 dp 数组来存储中间结果
        int[] dp = new int[n + 1];
        dp[0] = 0;
        dp[1] = 1;

        // 根据状态转移方程计算结果
        for (int i = 2; i <= n; i++) {
            dp[i] = dp[i - 1] + dp[i - 2];
        }

        return dp[n]; // 返回第 n 项的值
    }

    public static void main(String[] args) {
        int n = 10; // 求第 10 项的斐波那契数列值
        System.out.println("Fibonacci number at position " + n + " is: " + fibonacci(n));
    }
}

1.在Springboot中是是如何实现自动配置的?

1.1. @EnableAutoConfiguration注解

Springboot的自动配置是通过@EnableAutoConfiguration实现的。

java 复制代码
@Target({ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Inherited
@AutoConfigurationPackage
@Import({AutoConfigurationImportSelector.class})
public @interface EnableAutoConfiguration {
    String ENABLED_OVERRIDE_PROPERTY = "spring.boot.enableautoconfiguration";

    Class<?>[] exclude() default {};

    String[] excludeName() default {};
}

这个注解位于@SpringBootApplication 中,它导入的 AutoconfigurationImportselector会通过扫描类路径中的依赖,根据应用的上下文自动加载配置类,并为应用自动注入合适的Bean。

@SpringBootApplication实际上包含了@EnableAutoConfiguration,从而启用了自动配置功能。

1.2. spring.factories文件

Spring Boot的自动配置依赖于META-INF/spring factories文件,该文件中列出了所有自动配置类。当Spring Boot启动时,它会根据 soring.factories 文件中指定的配置类加载相应的自动配置。

示例( spring.factories文件片段):

java 复制代码
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
org.springframework.boot.autoconfigure.jdbc.DataSourceAutoConfiguration,\
org.springframework.boot.autoconfigure.orm.jpa.HibernateJpaAutoConfiguration,\
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

spring.factories 文件的内容是EnableAutoconfiguration注解扫描的目标。Spring Boot 会根据应用的环境条件,选择性地加载这些配置类。

1.3. 条件注解(@Conditional)

自动配置类通常使用(@ConditionalOnClass、@ConditionalOnMissingBean、@ConditionalomProperty等条件注解。它们控制自动配置的加载条件,例如仅在类路径中存在某个类时,才加载某些配置。

java 复制代码
@Configuration
@ConditionalOnClass(DataSource.class)  // 只有类路径中存在 DataSource 时才生效
public class DataSourceAutoConfiguration {
   @Bean
   @ConditionalOnMissingBean  // 如果没有自定义 DataSource,则使用默认配置
   public DataSource dataSource() {
       return new HikariDataSource();
   }
}

2.Spring和SpringBoot、SpringMVC有何区别?

2.1.Spring

Spring是一个Java的轻量级应用框架,提供了基于IOC和AOP的支持,用于构建企业级应用。Spring有多个模块,包括Spring Core、Spring Context、Spring JDBC、Spring Web等,每个模块提供了不同的功能。

2.2.SpringMVC

SpringMVC是Spring框架的一部分,是基于MVC设计模式的Web框架,用于构建Web应用程序。它提供了控制器、视图解析器、数据绑定、异常处理等功能,使得开发Web应用变得更加简单。SpringMVC还支持RESTful架构。

2.3.SpringBoot

SpringBoot 是基于Spring框架的一个开发框架,用于快速构建独立的、生产级别的Spring应用程序。它通过自动配置和约定优于配置的方式,简化了Spring应用程序的配置和开发过程。SpringBoot集成了很多常用的第三方库和工具,例如Spring Data、Spring Security、Thymeleaf、Logback 等,可以极大地提高开发效率。

因此,SpringBoot可以看作是在Spring的基础上,通过自动配置和约定优于配置的方式,提供了更加简单、快速的开发体验。而 SpringMVC则是Spring框架中用于构建web应用程序的模块。

3.ArrayList和LinkedList的区别

  • ArrayList基于动态数组,查询速度快,插入、删除慢
  • LinkedList基于双向链表,插入删除快,查询速度慢

4.为什么ArrayList查找效率很快

ArrayList的底层是数组结构,(数组中的每个元素都有索引存在)在查询元素时底层是通过访问数组元素方式进行查询。

​ 而数组只能存储同一类型的元素。并且声明一个数组时,会在内存中申请一块连续相邻的内存空间。当要通过索引访问数组元素时,可通过数组地址值和偏移量,直接计算出要查找元素的内存地址,所以数组支持通过索引直接访问元素,效率非常高。

5.你对Docker了解多少,使用Docker的好处

5.1.Docker的概念

Docker是一种容器化技术,它允许开发者将应用程序及其所有依赖项打包到一个独立的容器中,包括操作系统、库、运行时环境等。这个容器可以在任何支持Docker的平台上运行,确保应用程序在不同环境中具有一致的行为。

5.2.Docker的工作原理

Docker利用Linux容器(LXc)的技术,并通过镜像(Image)、容器(Container)、仓库

(Repository)等主要概念来实现应用的生命周期管理。具体来说,开发者首先创建一个Docker 镜像,镜像是一个只读模板,包含应用程序及其运行所需的所有文件。然后,基于这个镜像,Docker可以启动一个或多个容器,容器是镜像的运行实例。

5.3.Docker的优势

轻量便捷、可移植、隔离、版本控制、简化部署、提高开发效率、资源优化、安全性、可扩展性和弹性以及支持 CI/CD 等优势,极大地提高了应用程序的开发、测试和部署效率。

6.收获

让我意识到了自己Java基础不扎实的问题,多看源码有利于夯实基础。

相关推荐
oi771 分钟前
使用itextpdf进行pdf模版填充中文文本时部分字不显示问题
java·服务器
mqiqe7 分钟前
Python MySQL通过Binlog 获取变更记录 恢复数据
开发语言·python·mysql
AttackingLin9 分钟前
2024强网杯--babyheap house of apple2解法
linux·开发语言·python
少说多做34320 分钟前
Android 不同情况下使用 runOnUiThread
android·java
知兀20 分钟前
Java的方法、基本和引用数据类型
java·笔记·黑马程序员
蓝黑202043 分钟前
IntelliJ IDEA常用快捷键
java·ide·intellij-idea
Ysjt | 深44 分钟前
C++多线程编程入门教程(优质版)
java·开发语言·jvm·c++
ephemerals__1 小时前
【c++丨STL】list模拟实现(附源码)
开发语言·c++·list
码农飞飞1 小时前
深入理解Rust的模式匹配
开发语言·后端·rust·模式匹配·解构·结构体和枚举