jdk面试题
说一下都有哪些线程安全的集合类
ConcurrentHashMap、Vector、HashTable、StringBuffer、ArrayBlockingQueue、LinkedBlockingQueue、PriorityBlockingQueue。
介绍一下线程池怎么调优
首先线程池参数的设置,分为
- CPU 密集型任务 我们可以将线程数设置的小一点。
- 耗时型 IO 任务 我们可以将线程数设置的大一点。
有这么一个公式:线程数 = CPU 核⼼数 * (1 + 平均等待时间 / 平均⼯作时间)
还有就是最主要的是用压测工具进行压测,比方说上面规定CPU使用率不能超过80%以及内存占用情况,这个时候我们在压测的时候就可以监控CPU的占用率,如果离80%还差的远的话,就可以调大线程数。如果已经超过80%了,这个时候我们就将线程数调小一点。大概就是这么一个思虑。
对于cpu密集型任务,我们可以设置线程数为CPU核心数+1。
对于IO密集型任务,因为io读取文件的时候,我们的cpu空闲下来是可以做一些其他的事情,这个时候,可以将线程数设置的大一点。也就是说io时间越长,线程数越大。可以设置为2*cpu核心数。
arraylist循环删除的时候会有什么问题
https://www.cnblogs.com/Joe-Go/p/10419573.html
从前往后删会出现问题,会出现并发修改的问题。
从后往前删是没有问题的。
主要因为两个属性:modCount 、expectedModCount
介绍一下有哪些不可变的集合(面试有被问到)
List.of()
Set.of()
Map.of()
介绍一下都有哪些io流了(面试有被问到)
按读写单位大小分类:
字节流:以字节为单位,如InputStream和OutputStream。
字符流:以字符为单位,如Reader和Writer
按实际IO操作分类:
输入流:从文件读入到内存,如InputStream和Reader。
输出流:从内存读出到文件,如OutputStream和Writer
按是否直接与节点连接分类:
节点流:直接与数据源相连,如FileInputStream、FileOutputStream、FileReader、FileWriter。
处理流:对已存在的流进行封装,如BufferedInputStream、BufferedOutputStream、BufferedReader、BufferedWriter
NIO在项目中有哪些应用(面试有被问到)
可以先和面试官说,向我们项目中使用到了spring cloud gateway来做网关,我们都知道gateway底层有用到spring webflux,而webflux底层就有用到netty。而netty就是对NIO的一种很好的应用。
java nio适用于连接数较多且连接时间较短的场景。
高并发的网络服务器:NIO允许一个线程管理多个连接,非常适合处理高并发的网络通信,如Web服务器、聊天服务器等1。
实时通信应用:NIO的非阻塞特性和事件驱动机制使得它非常适合需要实时处理消息、低延迟的应用程序。
大规模文件传输:NIO的非阻塞特性可以使得系统更高效地利用资源,适合处理大量数据的传输,特别是大文件的传输。
多协议支持:NIO可以轻松支持多种协议,如TCP、UDP等,因为它提供了更灵活的I/O操作方式。
游戏服务器:游戏服务器通常需要处理大量的并发连接和实时通信,NIO能够提供良好的性能和可扩展性,满足游戏服务器的需求。
nio中有三大组件:channel通道、buffer缓存区和selector选择器。
加签和验签的作用是什么(面试有被问到)
加签和验签的主要作用是确保数据的完整性和真实性。
加签:使用Hash函数(如MD5或SHA-256)对原始报文生成报文摘要,然后使用发送方的私钥对这个摘要进行加密,生成数字签名。
为什么实际项目开发中不用反射(面试有被问到)
因为不安全
怎样提高反射的执行效率(面试有被问到)
https://www.kdun.com/ask/300153.html
说一下什么是ajax(面试有被问到)
它是异步的JavaScript和xml
说白了就是用js来实现页面的局部刷新。(以前很老的那个时代是整个页面的刷新)
比方说我给某个视频点了一个赞,就只需要刷新。
怎样解决项目中出现的版本依赖冲突,以及如果项目启动起来之后,出现功能不正常的话,又是怎样哪些依赖冲突的。(面试有被问到)
发生依赖冲突主要表现为系统启动或运行中会发生异常,99%表现为三种NoClassDefFoundError、ClassNotFoundException、NoSuchMethodError。下面逐一讲解一下定位技巧。
方式一:可以通过在JVM启动参数中增加" -XX:+TraceClassLoading",然后重新启动系统,在系统工程日志中即可看到JVM加载类的信息。从中即可找到JVM是从哪个jar包中加载的。
方式二:通过IDEA Maven Helper 插件查找冲突jar包有哪些业务依赖。也就是说我们可以利用这个插件很轻松的就能够看到哪些依赖冲突了。
方法三:在Maven项目中,pom.xml
文件中的<exclusions>
标签用于排除某些依赖项,这通常在你需要引入一个依赖项,但是这个依赖项又引用了其他你不想要的库时使用。
例如,假设你有一个依赖项A
,它又依赖于B
库,但是你想要排除B
库,那么你可以在A
的依赖声明中添加<exclusions>
标签。
说一下反射怎样加载字节码文件(面试有被问到)
Class.forName("类的全限定名");
类名.class;
对象.getClass();
@NotEmpty、@NotBlank、@NotNull(面试有被问道)
@NotNull
这是一个比较基础的验证注解,用于确保一个对象(Integer,Long,Double等等等)不为null
。
@NotBlank
这个注解主要用于验证String
类型的字段,要求字符串不能为null
且去除首尾空格后长度大于 0。也就是说,它验证的是字符串是否有实际的内容(非空白)。
@NotEmpty
通常用于验证集合(如List
、Set
、Map
等)或数组是否非空。非空的定义是集合或者数组的长度大于 0。
@Data
@EqualsAndHashCode(callSuper = false)
@Accessors(chain = true)
public class ArticleRequest implements Serializable {
private static final long serialVersionUID=1L;
@NotBlank(message = "请填写文章标题")
@Length(max = 200, message = "文章标题最多200个字符")
private String title;
@NotBlank(message = "请填写文章作者")
@Length(max = 50, message = "文章作者最多50个字符")
private String author;
@NotNull(message = "是否热门不能为空")
private Boolean isHot;
@NotEmpty(message = "其他推荐文章不能为空")
private List<ArticleRequest> articleRequestList;
}
Controller方法的使用
以上这些校验的注解都是需要@Valid 或@Validated 配合上使用才会生效的,还可以对新增和修改做单独的配置.
@Valid
是 Java Bean Validation(JSR 380)规范中的一个注解,用于标记需要进行验证的对象。它可以触发对象及其嵌套对象(如果有的话)的验证逻辑,以确保数据的合法性。如果验证不通过,会抛出相应的验证错误。
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.Valid;
public class User {
@NotBlank
private String name;
@Min(18)
private int age;
// 构造函数、getter和setter方法等
}
public class UserRegistrationRequest {
@Valid
private User user;
// 构造函数、getter和setter方法等
}
@RequestMapping("/register")
public String registerUser(@Valid UserRegistrationRequest request) {
// 处理注册逻辑
return "success";
}
@Validated
是 Spring 框架提供的注解,它是对@Valid
的增强。除了支持@Valid
的基本验证功能外,它还提供了分组验证和方法参数验证等功能。
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.Min;
import org.springframework.validation.annotation.Validated;
public class User {
@NotBlank(groups = {AdminUpdate.class, UserUpdate.class})
private String name;
@Min(value = 18, groups = AdminUpdate.class)
private int age;
// 构造函数、getter和setter方法等
}
public interface AdminUpdate {}
public interface UserUpdate {}
@Service
@Validated
public class UserService {
public void updateUserByAdmin(@Validated(AdminUpdate.class) User user) {
// 管理员更新用户信息的逻辑
}
public void updateUserByUser(@Validated(UserUpdate.class) User user) {
// 用户自己更新信息的逻辑
}
}
说一下在项目中都有哪些地方使用到了单例模式(面试中有被问到)
1.数据库连接池
在一个应用程序中,频繁地创建和销毁数据库连接是非常耗费资源的。数据库连接池的作用是预先创建一定数量的数据库连接,并对这些连接进行管理,当需要访问数据库时,从连接池中获取连接,使用完毕后再归还连接。所以数据库连接池通常会被设置为单例模式。
2.配置文件读取器
在项目中,通常会有配置文件来存储一些应用程序的参数,如redis的配置信息,kafka的配置信息、数据库连接信息、日志级别等,因为这些配置信息通常是固定的,这个时候我们可以将其设置为单例模式。
3.日志记录器
在实际项目中,日志打印的类通常会被设置为单例模式。
你在实际项目开发中都用到了哪些设计模式(面试有被问到)
做还款的时候有使用到工厂模式、模版方法模式
单例模式
策略模式
责任链模式 @Order()
i++底层
一共分为三步:
1.将i变量加载到内存中
2.将i变量进行加1操作
3.将i变量进行赋值
你有没有制作过jar包
怎么将hashmap 转化为线程安全的类
使用Collections类中的synchronizedMap()方法。
public class Solution2 {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
Integer i3 = 200;
Integer i4 = 200;
System.out.println(i1 == i2);
System.out.println(i3 == i4);
}
}
public class Solution2 {
static int a = 10;
public static void main(String[] args) {
change(a);
System.out.println(a);
}
public static void change(int num) {
num = 20;
}
}
// output:10