java场景面试题讲解,帮你搞定面试,24、25届学生看过来

前言

这个小编最近总结的面试题,也有相应的视频讲解,在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站一键三连给个鼓励,可以关注后续,我会持续创作对大家有帮助的视频给大家
B站号

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值