面试题1
一、线程池
- 线程池的基本参数:核心线程数、最大线程数、最大活跃时间,时间单位、队列长度、线程工厂、线程拒绝策略
public ThreadPoolExecutor(int corePoolSize,
int maximumPoolSize,
long keepAliveTime,
TimeUnit unit,
BlockingQueue<Runnable> workQueue,
ThreadFactory threadFactory) {
this(corePoolSize, maximumPoolSize, keepAliveTime, unit, workQueue,
threadFactory, defaultHandler);
}
- 创建线程池:
private Executor executor1 = new ThreadPoolExecutor(10, 10, 1, TimeUnit.MINUTES, new ArrayBlockingQueue<>(1000),new ThreadFactoryBuilder().setNamePrefix("work-%d").build());
- 基本参数作用:
corePoolSize:这部分线程默认情况下是不会被回收的
maximumPoolSize:线程池允许创建的最大核心线程数
keepAliveTime:多余线程存活时间
unit:多余线程存活时间单位
workQueue: 当核心线程数不够用时,放在该阻塞队列中
threadFactory:线程工厂,可以定义创建线程的线程名称,线程组,优先登记等
线程拒绝策略默认
- 线程池为什么要这么设计?
举个例子:
核心线程数相当于正式员工,一般来说公司有正式员工就可以了,当业务多时,业务忙不过来就需要外包员工(最大线程数),当外包人员还忙不过来就将任务放入阻塞队列中,当还是无法解决掉时,这时候就会拒绝一批业务(拒绝策略),当这个业务量过了后,观察一段时间就相当于我们说的线程过期时间,然后将外包人员归位这就相当于将多余的线程进行回收了
- 为什么不能用Java内嵌的方式去创建线程池,需要我们自己去new?
这是指官方默认提供了Executor创建的线程池吧。针对这个问题,关注过源码,主要是有二个问题:
1.FixedThreadPool,SingleThreadPool这个的阻塞队列设置的是int的最大值,这样会造成大量的请求堆积,从而可能造成OOM
2.CashedThreadPool,ScheduledThreadPool 这个是运行创建的线程最大数量都时int的最大值,从而可能会造成创建很多线程,从而导致OOM
二、设计模式
- 工厂+策略模式解决过多if else的问题
商品下单的过程中,普通商品,跨境商品,秒杀商品,砍价商品,拼团商品,这几种的下单逻辑不一样,来解决此逻辑,避免大量的if else,避免代码过于臃肿
三、linux
部署:java -jar *.jar
后台运行:nohup java -jar &
查询日志:tail -f + vim /精确查询
四、ArrayList和LinkedList底层区别及适用场景?
- ArrayList底层是数组,查询快增删慢,存储空间连续,查询时间复杂度为O(1),ArrayList的初始容量为10,每次新增元素的时候会去判断容量是否溢出,如果溢出了就会进行扩容操作。其中remove的时间复杂度为O(n),get的时间复杂度O(1)
- LinkedList底层是双向链表,查询慢增删快,节点之间通过指针关联,没有初始化大小,也没有扩容的机制,一值在节点的前后新增操作即可。其中Add时间复杂度为O(1)(首尾插入)或O(n)(中间插入),get的时间复杂度为O(n)
五、什么是mysql索引?
- mysql索引是一种排好序的数据结构,作用类似于字典中的目录一样,方便我们快速查询,他的数据结构采用的是 b+树
六、什么是聚蔟索引和非聚蔟索引?
- 主键索引就是聚蔟索引,聚蔟索引的非叶子节点存的是索引值,叶子节点存的是完整的数据行
- 非聚蔟索引的叶子节点存储的是主键索引+索引值
七、什么是回表?
- 当我们使用非聚蔟索引时,如果说非聚蔟索引的索引值不包含我们的索引字段,那么会通过非聚蔟索引查询到主键值,然后聚蔟索引上再查一次,拿到数据。
八、count(1),count(*),count(字段)之间的区别
- 从功能上说,count(1)和count() 都是统计符合查询条件的行数,count(字段)统计自动过滤掉null的值,count(1)和count()使用的优化手段是一样的,所以他们的效率是相同的,但是官方推荐标准使用count(*),count(字段)的话会进行全表扫描,其效率是最低的

浙公网安备 33010602011771号