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基础不扎实的问题,多看源码有利于夯实基础。