Java开发工程师
约 814 字大约 3 分钟
Java开发工程师
面试时间:
2024年10月21日19点
面试方式:
线上
面试问题:
序号 | 问题 | 解答 | 备注 |
---|---|---|---|
1 | #{}和${}区别 | #{}预编译参数防止 SQL 注入 ${}字符串替换容易导致 SQL 注入 | |
2 | SQL注入是什么?如何避免? | 在应用程序中输入恶意的SQL代码来操控数据库 预编译语句、分配最小权限、每次输入加验证和过滤 | |
3 | 数据库分库分表 | 水平分表垂直分表 | |
4 | MyBatisPlus比MyBatis好处?MyBatisPlus中代码生成器原理? | MyBatis Plus 是 MyBatis 的增强版简化 CRUD 操作,内置分页插件,专注于开发业务 | 代码生成器原理没答出来 |
5 | 缓存雪崩?解决? | 同一时间大量缓存过期 设置随机过期时间 | |
6 | Redis持久化机制有哪些 | RDB、AOF | |
7 | SpringCloud服务发现组件有哪些 | Alibaba的Nacos和Netflix的Eureka | 还有Consul和Zookeeper |
8 | 分布式锁是什么?Redis中分布式锁实现?SETNX原理 | 分布式系统中用于控制多个进程或线程对共享资源的访问 SETNX命令 SETNX命令的原理是在键不存在的情况下设置键值对,返回1表示设置成功,返回0表示键已存在。 | setnx原理没答出来 |
9 | 面向对象三大特性 | 封装继承多态 | |
10 | String、StringBuilder、StringBuffer区别 | String 一旦创建后,其内容就不能改变每次对字符串进行修改时都会创建一个新的字符串对象 StringBuffer线程安全,性能略低于 StringBuilder StringBuilder不是线程安全的,性能略高 | |
11 | 进程生命周期?多线程有什么用? | 初始运行阻塞等待超时等待终止 让程序同时执行多个任务,提高程序的并发能力 | |
12 | 死锁如何产生?怎么预防? | 互斥、请求与保持、不剥夺、循环等待 | |
13 | 事务管理 | 编程式事务TransactionTemplate、声明式事务@Transactional | |
14 | 使用@Transactional注解要注意什么 | 自定义事务方法被public修饰、不能在方法内部调用、数据库引擎要支持事务、抛出非运行时异常加(Rollback=异常名.class) | 事务失效场景 |
15 | Spring、SpringBoot、SpringCloud区别 | 轻量级框架包括依赖注入和AOP 简化Spring搭建过程 依赖大于配置、内置Tomcat 分布式微服务 配置中心服务发现 | |
16 | mvn install和mvn package命令 | 没答出来 | package构建项目的可部署包 install除了构建可部署包外,还将工件安装到本地Maven仓库 |
// 给一个都是非负整数的数组
// 重新排列数组中每个数使其组成一个最大的整数
// 输出字符串形式
// 输入arr={1,2,3}
// 输出"321"
// 输入arr={90,3,7,5,11}
// 输出"9075311"
// 输入arr={0,0,0,0,0}
// 输出"0"
public static String solute(int[] arr){
String[] str = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
Arrays.sort(str, (o1, o2) -> {
String str1 = o1 + o2;
String str2 = o2 + o1;
return str2.compareTo(str1);
});
if (str[0].equals("0")){
return "0";
}
StringBuilder sb = new StringBuilder();
for(String num : str){
sb.append(num);
}
return sb.toString();
}