前言
这个小编最近总结的面试题,也有相应的视频讲解,在b站,讲的不是很好但是让人很容易听得懂,如果大家觉得还可以的话,可以给b站一个三连,鼓励小编有动力继续创作,因为最近上班比较忙所以就断更很久了
【2024 java面试场景题目解析】
点击连接跳转到B站观看视频
1、现在我这里有一批身份证号码,我要如何找出他们得重复得数量【求相同字符串得数量】
String str = "a,b,a,d,c,d,e,a,r,r,4,5,6,4,5,6,23,sdf,sfff,se,sfff";
Map<String, Integer> map = new HashMap<String, Integer>();
String[] strings = str.split(",");
for (String string : strings) {
if (map.containsKey(string)){
map.put(string,map.get(string)+1);
}else {
map.put(string,1);
}
}
System.out.println(map);
2、如何从数据库表里面查找出重复数据得条目数【我们要根据什么来判断那两条数据是相同得】
select idCard, count(*) from table group by idcard having count(*) > 1
3、如何过滤出list集合里面得空字符串【java8新特性 stream 操作】
List<String> list = new ArrayList<String>();
List<String> stringList = list.stream().filter(
item -> !item.trim().isEmpty())
.collect(Collectors.toList());
4、如何实现一个线程安全得单例模式【spring Bean 单例模式】
public class SingletonDemo {
private static SingletonDemo instance;
private SingletonDemo() {}
public static SingletonDemo getInstance(){
if (instance == null){
synchronized (SingletonDemo.class){
if (instance == null){
instance = new SingletonDemo();
return instance;
}
}
}
return instance;
}
}
如何实现一个不被反射破解得安全单例模式
public class SingletonSafe {
private static SingletonSafe instance;
private SingletonSafe() {
if (instance != null) {
throw new RuntimeException("单例已被创建");
}
}
public static SingletonSafe getInstance() {
return SingletonHolder.INSTANCE;
}
static class SingletonHolder {
private static final SingletonSafe INSTANCE = new SingletonSafe();
}
}
5、如何通过拦截器来实现计算接口响应时间
- 通过获取请求进入接口的时候,然后等待接口业务处理完成之后,走拦截器之后的时候记录接口结束时间
- 结合ThreadLocal类来实现流转当前线程请求的接口时间,并且在执行完之后要记得清除ThreadLocal中的记录不然会内存溢出
@Slf4j
public class WebInvokeTimeInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
log.info("preHandle: 接口时间拦截器");
StringBuffer requestURL = request.getRequestURL();
log.info("接口地址 URL: {}", requestURL);
String method = request.getMethod();
log.info("接口请求方式: {}", method);
log.info("接口请求参数: {}", request.getParameterMap());
String requestURI = request.getRequestURI();
log.info("接口请求路径 URI: {}", requestURI);
long startTime = System.currentTimeMillis();
log.info("接口开始时间: {}", startTime);
ThreadLocalUtil.set(String.valueOf(startTime));
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long endTime = System.currentTimeMillis();
log.info("接口结束时间: {}", endTime);
log.info("接口耗时: {}", endTime - Long.parseLong(ThreadLocalUtil.get()) + "ms");
ThreadLocalUtil.remove();
}
}
// 配置拦截器,配置类
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new WebInvokeTimeInterceptor()).addPathPatterns("/**");
}
}
public class ThreadLocalUtil {
private static final ThreadLocal<String> threadLocal = new ThreadLocal<>();
public static void set(String value) {
threadLocal.set(value);
}
public static String get() {
return threadLocal.get();
}
public static void remove() {
threadLocal.remove();
}
}
6、MySQL得sql优化该怎么做?
这个问题我们要从多个角度去分析
首先从语法层面去分析
- 我们尽量少使用嵌套子查询
- 尽量避免使用like关键字通配符开头
- 少使用select*语句,尽量按需获取指定得字段
- 避免在where子句中判断null值,尽量使用特殊值来代替null值
- 使用in子句得时候不能有太复杂得子查询
- 合理得使用join关键字,尽量使用小表去驱动大表,减少笛卡尔积
从业务层面
- 我们可以按照业务来拆分sql语句,在编码层面去控制
从索引层面优化
- 高频得查询语句,我们可以采用覆盖索引
- 常用得查询语句,我们可以采用联合索引
7、Spring中常见得注解有哪些?
@Controller、 @RestController、@Service、@Repository、@Autowired、@Configuration、@Bean、
@Socpe、@PostConstruct【构造方法执行后执行】、@RequestMapping等相关注解、@ComponentScan、@Component
8、系统日志是怎么实现得?springboot默认得日志框架是那个?
我们使用logback框架实现得,这个springboot也是采用这个框架实现得
我们需要配置logback-spring.xml配置文件
9、数据库如何自定义一个分页查询工具类?
主要是采用limit 关键字结合offset偏移量来实现得,前面跳过多少行,然后在查询多少数据出来
10、mybatis得分页插件使用得是那个,有了解过他是怎么实现得嘛
pagehelper
它的基本原理是通过拦截Executor,StatementHandler,ParameterHandler和ResultSetHandler这四个对象,修改原始的sql语句,增加limit和count等语句,从而实现分页效果。
他用过ThreadLocal这个线程变量来实现传递当前线程的分页参数来重构sql语句
11、数据库索引有了解嘛,请你说一下数据库索引?
MySQL主要采用得是innodb默认引擎,它主要采用得聚簇索引,采用B+树得索引结构
12、请你说一下HashMap得数据结构,以及扩容机制实现?
java8之后采用数组+链表+红黑树
初始容量是一个长度为16得桶数组,扩容因子是0.75,当满足这个条件得时候,会重新扩容2倍得新的桶数组,然后遍历就集合重新计算hash在重新排列
13、我们如何确保数据库里面存入得数据保持一致,还有取数据得时候也要保持一致?
问的就是事务得解决,我们可以采用锁来解决这个问题
大家看完觉得有帮助,帮小编在B站一键三连给个鼓励,可以关注后续,我会持续创作对大家有帮助的视频给大家