面试题测试

1.如何在springboot启动时,获取/data/目录下的所有文件名。

您可以使用Java的File类来获取指定目录下的所有文件名。以下是一种在Spring Boot应用程序启动时获取指定目录下所有文件名的方法:

在您的Spring Boot应用程序中,创建一个服务或组件类,用于获取文件名。
java
Copy code
@Component
public class FileNameService {

private final String directoryPath = "/data/";

public List<String> getAllFileNames() {
    List<String> fileNames = new ArrayList<>();
    File directory = new File(directoryPath);
    File[] fileList = directory.listFiles();
    if (fileList != null) {
        for (File file : fileList) {
            if (file.isFile()) {
                fileNames.add(file.getName());
            }
        }
    }
    return fileNames;
}

}
在Spring Boot应用程序的启动类或配置类中,使用@Autowired或@Bean注解注入FileNameService,以便在应用程序启动时调用getAllFileNames方法。
java
Copy code
@SpringBootApplication
public class MyApp {

@Autowired
private FileNameService fileNameService;

public static void main(String[] args) {
    SpringApplication.run(MyApp.class, args);
}

@PostConstruct
public void printFileNames() {
    List<String> fileNames = fileNameService.getAllFileNames();
    System.out.println("All file names in /data/ directory:");
    fileNames.forEach(System.out::println);
}

}
启动应用程序,您将看到所有位于/data/目录中的文件名。
请注意,这种方法仅适用于获取/data/目录中的文件名,不包括子目录中的文件名。如果您想要获取子目录中的文件名,您需要使用递归方法来遍历整个目录树。

2.请描述一下,从输入URL地址,到页面完成展示之间发生了什么,应用做了前后端分离,后台服务只有一个进程,没有调用其他服务,有使用数据库,建议画出流程图。
客户端输入URL地址,包括协议、主机名、端口号和请求路径等信息,如:http://www.example.com:8080/index.html。
客户端向DNS服务器发出域名解析请求,将域名解析为对应的IP地址,如:192.168.1.1。
客户端向服务器发送HTTP请求,请求包括HTTP方法、请求头、请求体等信息。
服务器接收到HTTP请求后,解析请求,根据请求路径和参数等信息,将请求转发给前端服务处理。
前端服务接收到请求后,根据请求路径和参数等信息,处理相应的业务逻辑,包括根据需要向后台服务发送请求,读取数据库等操作。
前端服务将处理结果封装成HTTP响应,包括响应码、响应头、响应体等信息,返回给服务器。
服务器接收到HTTP响应后,解析响应,将响应转发给客户端。
客户端接收到HTTP响应后,解析响应,根据响应头和响应体等信息,渲染页面。
客户端将渲染后的页面展示给用户。

3.有一个表A,请使用SQL找出所有根据user_code重复,且open_time与close_time存在重复的数据,如果close_time为空则默认为关闭时间无穷大。

Id user_code … open_time close_time
1 A 2019-01-01 2019-12-31
2 B 2019-02-01
3 C 2019-02-03 2019-12-31

100 A 2020-01-01
101 C 2018-01-01 2020-12-31

200 A 2020-06-01
201 B 2019-06-01 2020-12-31

例如上表中的数据,第1行与100、200行虽然user_code重复,但时间不重叠,不应该被查出来;100行与200行user_code重复,且open_time与close_time存在重叠;3行与101行的存在重叠应该被查出来;2行与201行时间存在重叠应该查出来。

SELECT A1., A2.
FROM A AS A1
INNER JOIN A AS A2
ON A1.user_code = A2.user_code
AND A1.Id < A2.Id
AND ((A1.close_time IS NULL AND A2.close_time IS NULL) OR
(A1.close_time >= A2.open_time AND (A2.close_time IS NULL OR A1.open_time <= A2.close_time)))

4.现在有一个数字与字母的映射表,且有以下规则:

映射表:
数字 字母
3 A
5 B
7 C

规则:

1.碰到当前数字时,使用字母替换,例如,3-> A
2.碰到当前数字的倍数时,使用字母替换, 例如:6->A
3.碰到多个数字的倍数时,使用多个对应的字母替代,例如:15 -> AB,21->AC
请根据映射表和规则,给出0-100之间的转换结果,提示:不要直接在for循环中使用if判断,尽可能的使用设计模式。

package com.eric.springboottest;

import java.util.HashMap;
import java.util.Map;

public class Converter {
private final RuleChain ruleChain;

public Converter() {
    Map<Integer, String> map = new HashMap<>();
    map.put(3,"A");
    map.put(5,"B");
    map.put(7,"C");
    this.ruleChain = new RuleChain(map);
}

public String convert(int n) {
    StringBuilder result = new StringBuilder();

// for (int i = 1; i <= n; i++) {
// result.append(ruleChain.handle(i)).append(" ");
// }
result.append(ruleChain.handle(n));
return result.toString().trim();
}

public static void main(String[] args) {
    /**
     * 在这个实现中,MappingRule 接口定义了单个数字的转换规则,NumberLetterMappingRule 类实现了该接口,
     * 并封装了单个数字的映射规则。RuleChain 类实现了 MappingRule 接口,封装了多个数字的转换规则。
     * Converter 类将规则链和输入数字结合在一起进行转换。
     */
    Converter converter = new Converter();
    System.out.println(converter.convert(15));
}

}

package com.eric.springboottest;

public interface MappingRule {

String handle(int n);

}

package com.eric.springboottest;

public class NumberLetterMappingRule implements MappingRule {
private final int number;
private final String letter;

public NumberLetterMappingRule(int number, String letter) {
    this.number = number;
    this.letter = letter;
}

@Override
public String handle(int n) {
    if (n % number == 0) {
        return letter;
    }
    return "";
}

}

package com.eric.springboottest;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class RuleChain implements MappingRule {

private final List<MappingRule> rules;

public RuleChain(Map<Integer, String> mappingRules) {
    this.rules = new ArrayList<>();
    for (Map.Entry<Integer, String> entry : mappingRules.entrySet()) {
        rules.add(new NumberLetterMappingRule(entry.getKey(), entry.getValue()));
    }
}

@Override
public String handle(int n) {
    StringBuilder result = new StringBuilder();
    for (MappingRule rule : rules) {
        result.append(rule.handle(n));
    }
    if (result.length() == 0) {
        result.append(n);
    }
    return result.toString();
}

}
1.如何在springboot启动时,获取/data/目录下的所有文件名。

您可以使用Java的File类来获取指定目录下的所有文件名。以下是一种在Spring Boot应用程序启动时获取指定目录下所有文件名的方法:

在您的Spring Boot应用程序中,创建一个服务或组件类,用于获取文件名。
java
Copy code
@Component
public class FileNameService {

private final String directoryPath = "/data/";

public List<String> getAllFileNames() {
    List<String> fileNames = new ArrayList<>();
    File directory = new File(directoryPath);
    File[] fileList = directory.listFiles();
    if (fileList != null) {
        for (File file : fileList) {
            if (file.isFile()) {
                fileNames.add(file.getName());
            }
        }
    }
    return fileNames;
}

}
在Spring Boot应用程序的启动类或配置类中,使用@Autowired或@Bean注解注入FileNameService,以便在应用程序启动时调用getAllFileNames方法。
java
Copy code
@SpringBootApplication
public class MyApp {

@Autowired
private FileNameService fileNameService;

public static void main(String[] args) {
    SpringApplication.run(MyApp.class, args);
}

@PostConstruct
public void printFileNames() {
    List<String> fileNames = fileNameService.getAllFileNames();
    System.out.println("All file names in /data/ directory:");
    fileNames.forEach(System.out::println);
}

}
启动应用程序,您将看到所有位于/data/目录中的文件名。
请注意,这种方法仅适用于获取/data/目录中的文件名,不包括子目录中的文件名。如果您想要获取子目录中的文件名,您需要使用递归方法来遍历整个目录树。

2.请描述一下,从输入URL地址,到页面完成展示之间发生了什么,应用做了前后端分离,后台服务只有一个进程,没有调用其他服务,有使用数据库,建议画出流程图。
客户端输入URL地址,包括协议、主机名、端口号和请求路径等信息,如:http://www.example.com:8080/index.html。
客户端向DNS服务器发出域名解析请求,将域名解析为对应的IP地址,如:192.168.1.1。
客户端向服务器发送HTTP请求,请求包括HTTP方法、请求头、请求体等信息。
服务器接收到HTTP请求后,解析请求,根据请求路径和参数等信息,将请求转发给前端服务处理。
前端服务接收到请求后,根据请求路径和参数等信息,处理相应的业务逻辑,包括根据需要向后台服务发送请求,读取数据库等操作。
前端服务将处理结果封装成HTTP响应,包括响应码、响应头、响应体等信息,返回给服务器。
服务器接收到HTTP响应后,解析响应,将响应转发给客户端。
客户端接收到HTTP响应后,解析响应,根据响应头和响应体等信息,渲染页面。
客户端将渲染后的页面展示给用户。

3.有一个表A,请使用SQL找出所有根据user_code重复,且open_time与close_time存在重复的数据,如果close_time为空则默认为关闭时间无穷大。

Id user_code … open_time close_time
1 A 2019-01-01 2019-12-31
2 B 2019-02-01
3 C 2019-02-03 2019-12-31

100 A 2020-01-01
101 C 2018-01-01 2020-12-31

200 A 2020-06-01
201 B 2019-06-01 2020-12-31

例如上表中的数据,第1行与100、200行虽然user_code重复,但时间不重叠,不应该被查出来;100行与200行user_code重复,且open_time与close_time存在重叠;3行与101行的存在重叠应该被查出来;2行与201行时间存在重叠应该查出来。

SELECT A1., A2.
FROM A AS A1
INNER JOIN A AS A2
ON A1.user_code = A2.user_code
AND A1.Id < A2.Id
AND ((A1.close_time IS NULL AND A2.close_time IS NULL) OR
(A1.close_time >= A2.open_time AND (A2.close_time IS NULL OR A1.open_time <= A2.close_time)))

4.现在有一个数字与字母的映射表,且有以下规则:

映射表:
数字 字母
3 A
5 B
7 C

规则:

1.碰到当前数字时,使用字母替换,例如,3-> A
2.碰到当前数字的倍数时,使用字母替换, 例如:6->A
3.碰到多个数字的倍数时,使用多个对应的字母替代,例如:15 -> AB,21->AC
请根据映射表和规则,给出0-100之间的转换结果,提示:不要直接在for循环中使用if判断,尽可能的使用设计模式。

package com.eric.springboottest;

import java.util.HashMap;
import java.util.Map;

public class Converter {
private final RuleChain ruleChain;

public Converter() {
    Map<Integer, String> map = new HashMap<>();
    map.put(3,"A");
    map.put(5,"B");
    map.put(7,"C");
    this.ruleChain = new RuleChain(map);
}

public String convert(int n) {
    StringBuilder result = new StringBuilder();

// for (int i = 1; i <= n; i++) {
// result.append(ruleChain.handle(i)).append(" ");
// }
result.append(ruleChain.handle(n));
return result.toString().trim();
}

public static void main(String[] args) {
    /**
     * 在这个实现中,MappingRule 接口定义了单个数字的转换规则,NumberLetterMappingRule 类实现了该接口,
     * 并封装了单个数字的映射规则。RuleChain 类实现了 MappingRule 接口,封装了多个数字的转换规则。
     * Converter 类将规则链和输入数字结合在一起进行转换。
     */
    Converter converter = new Converter();
    System.out.println(converter.convert(15));
}

}

package com.eric.springboottest;

public interface MappingRule {

String handle(int n);

}

package com.eric.springboottest;

public class NumberLetterMappingRule implements MappingRule {
private final int number;
private final String letter;

public NumberLetterMappingRule(int number, String letter) {
    this.number = number;
    this.letter = letter;
}

@Override
public String handle(int n) {
    if (n % number == 0) {
        return letter;
    }
    return "";
}

}

package com.eric.springboottest;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

public class RuleChain implements MappingRule {

private final List<MappingRule> rules;

public RuleChain(Map<Integer, String> mappingRules) {
    this.rules = new ArrayList<>();
    for (Map.Entry<Integer, String> entry : mappingRules.entrySet()) {
        rules.add(new NumberLetterMappingRule(entry.getKey(), entry.getValue()));
    }
}

@Override
public String handle(int n) {
    StringBuilder result = new StringBuilder();
    for (MappingRule rule : rules) {
        result.append(rule.handle(n));
    }
    if (result.length() == 0) {
        result.append(n);
    }
    return result.toString();
}

}

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值