
面试题集合
文章平均质量分 58
saber@p
星辰滚烫不如麻辣烫
展开
-
理解Java语言的特性,是否是解释执行
Java特性考的是我们对Java 语言的全局认知,大概需要分以下去作答,探讨一、基本的语言特性面向对象(封装,继承,多态)反射泛型Lambda二、 丰富的Java类库集合包,并发包,网络,IO/NIO三、Java虚拟机垃圾回收器平台无关性(JVM运行.class文件)编译模式有解释 也有 编译(Just - in - time编译实现),混合模式四、JRE提供了很多辅助工具javac ,jps,jstack理解平台无关性(一次编译,到此运行)“一次原创 2021-04-14 17:14:45 · 174 阅读 · 0 评论 -
MyBatis缓存
MyBatis系统中默认定义了两级缓存默认情况下,MyBatis是开启了一级缓存(SqlSession级别的缓存,也称为本地缓存)二级缓存需要手动开启和配置,它是基于namespace级别的缓存为了提高扩展性,MyBatis定义了缓存接口Cache,我们可以通过Cache接口来自定义二级缓存一级缓存一级缓存也叫本地缓存与数据库同一次会话期间查询到的数据会被放到本地缓存中程序会先去缓存里面查找,缓存里没有再去查询数据库,并且将记录添加到缓存中一级缓存失效的情况sqlS.原创 2021-01-18 15:55:36 · 90 阅读 · 0 评论 -
SpringMVC执行流程
SpringMVC的执行,全靠内部DistpatcherSelvet 调度具体的流程比如用户发起了一条url请求1、DispatcherSelvet 调用HandlerMapping(映射处理器)解析url,HandlerMapping 根据url 去查找对应的Handler(处理器)2、HandlerMapping 找到了具体的处理器 HandlerExecution ,返回给DispatchSelvet3、DispatchSelvet 调用HandlerAdapter(处理器适配器),按.原创 2021-01-18 15:20:45 · 86 阅读 · 0 评论 -
类实例化顺序
引入阿里巴巴的一道面试题public class Test1 { public static int k = 0; public static Test1 t1 = new Test1("t1"); public static Test1 t2 = new Test1("t2"); public static int i = print("i");//3 public static int n = 99; public int j = print("j".原创 2021-01-17 16:33:45 · 112 阅读 · 0 评论 -
SQL编写和执行顺序
SQL编写顺序select distinct 字段from 表1join 表2on 联表条件where 搜索条件group by 分组字段having 分组条件order by 排序字段limit 分页大小SQL执行顺序from 表1on 联表条件join 表2where 搜索条件group by 分组字段having 分组条件select distinct 字段order by 排序字段limit 分页 .原创 2021-01-16 20:29:10 · 179 阅读 · 0 评论 -
SQL优化
1、大批量插入数据主键有序插入(先对数据进行排序后插入)关闭唯一性校验,等插入完后重新开启手动提交事务直接在一句insert 里面完成,避免重复的获取连接比如优化前insert into tb_test values(4,'Tim'); insert into tb_test values(1,'Tom'); insert into tb_test values(3,'Jerry'); insert into tb_test values(5,'Rose'); insert int原创 2021-01-16 16:56:55 · 135 阅读 · 0 评论 -
SQL索引失效的几种情况
1、 没有正确使用符合索引例如我们根据user表中的A,B,C创建一个符合索引create index on user(A,B,C)实际上mysql是为我们创建了三个索引AABABC假如你从B 或者C 开始查 就没有用到索引select B from user while B = ‘b’2、范围查询右边的列使用索引无效select A from user where C > 1 and A = 'a'3、对索引列进行运算,索引失效select A from user原创 2021-01-16 16:09:17 · 5098 阅读 · 1 评论 -
分析定位慢SQL的步骤
1、 查看SQL执行频率查看crud的提交次数show status like 'Com%'查看crud的提交行数show status like 'Innodb_rows_%'2、定位低效率SQL1、在mysql的慢日志中查看2、命令行show processlistinfo 列是显示sql语句3、explain分析执行计划explain + 具体的sql 语句例如 explain select * from user主要的 参数解读id 表示执行顺序原创 2021-01-16 15:43:39 · 551 阅读 · 0 评论 -
LRU算法 + 手写LRU实现缓存淘汰机制
什么是LRU?如果你学过操作,必然有听过 LRU 算法,他是一种常用的页面置换算法实现的思想:选择最近最久未使用的数据予以淘汰用LRU算法实现缓存淘汰策略1、底层数据结构的分析缓存,必须要读 + 写 两个操作 ,如果读的效率要快,底层是采用哈希表结构,写的效率要快,底层就要采用 链表,所以 LRU的底层实现采用的数据结构就是哈希链表 (哈希表 + 双向链表)实现LRU算法的两种方式一、借助Jdk 提供的LinkedHashMap继承LinkedHashMap,重写里面的淘汰判断remove原创 2021-01-14 11:14:23 · 428 阅读 · 1 评论 -
Spring的循环依赖问题分析
什么是循环依赖?多个bean之间相互依赖,形成了一个闭环我们都知道,spring中通过ioc容器,通过反射机制,控制反转,帮我们创建了对象;那么,现在我们要创建一个bean A,但是bean A 依赖的bean B ,而bean B 中又去依赖了bean A,例如下面的构造class A { //依赖b private B b; public A (B b) { this.b = b; }}class B { //依赖a private A原创 2021-01-13 15:58:47 · 303 阅读 · 0 评论 -
Spring5 的aop通知顺序
这里讲的版本是spring5Aop常用通知注解@Around 环绕通知: 环绕目标方法执行@Before 前置通知: 目标方法之前执行@AfterThrowing 异常通知: 出现异常时候执行@AfterReturning 返回后通知: 执行方法结束前执行(异常不执行)@After 后置通知: 目标方法之后执行(始终执行)执行的顺序画了个脑图 ,方便理解第一步 @Around 环绕前执行第二步 @Before 目标方法之前执行第三步 执行目标方法第四步: 1原创 2021-01-13 14:21:56 · 852 阅读 · 3 评论 -
AQS第三篇 —— 深入源码解读
从根本上说 ,如果你不懂AQS ,没有深入的理解AQS的设计艺术,那么你就谈不上真的意义上的懂得JUC编程原创 2021-01-12 17:44:49 · 254 阅读 · 0 评论 -
AQS第二篇 —— AQS的初步认识
AQS内部体系架构 ( state变量+CLH双端Node队列 )AQS的两个重要构成AQS的int变量 stateAQS的CLH队列一、AQS的同步状态State成员变量查看底层源码 /** * 同步状态 */ private volatile int state;state成员变量,用来记录锁的占有情况当state = 0 ,表示当前锁并没有被线程占有,处于空闲状态当state = 1 ,表示锁被某个线程占有,其他想要占有锁的线程 就应该进入原创 2021-01-12 14:05:35 · 264 阅读 · 1 评论 -
AQS第一篇 —— AQS为什么是JUC内容中最重要的基石?
抽象的队列同步器AQS从字面上理解是 抽象的队列同步器是用来构建锁或者其它同步器组件的重量级基础框架及整个JUC体系的基石通过内置的FIFO(先进先出)队列来完成资源获取线程的排队工作,并通过一个int类变量 表示持有锁的状态锁和同步器的关系对于我们调用的那些Api,像什么ReentrantLock,CountDownLatch,Smeaphore 等等 他们底层具体如何如何实现 上锁等待,解锁唤醒,都是依赖于AQS的统一管理锁,面向锁的使用者 :定义了程序员和锁交互的使用层API,隐藏原创 2021-01-12 13:16:03 · 358 阅读 · 4 评论 -
为什么要出现LockSupport?
在LockSupport 没出现以前 , 实现等待通知,我们是通过synchronized 或者是显示锁Lock下面下个案例让大家明白 public static void main (String[] args) throws Exception { Object lockObject = new Object(); AtomicInteger atomicInteger = new AtomicInteger(0); new Thread((原创 2021-01-12 11:17:08 · 346 阅读 · 0 评论 -
假如生产环境出现CPU占用过高,请谈谈你的分析思路和定位
下面我写一个有问题的代码原创 2021-01-11 15:20:28 · 394 阅读 · 0 评论 -
你真的会有用GitHub查找资料吗 ?
不少人,包括小编在GitHub上面找资料,都是直接在输入框输入内容回车,比如下面的找java但是这样找是不精准的,下面讲一些寻找好的项目的技巧in关键词限制搜索范围公式 xxx关键词 in:name或description或readmexxx in:name 项目名包含xxxxxx in:description 项目描述包含xxxxxx in:readme 项目的readme文件包含xxx演示搜索项目名或readme中包含秒杀的项目stars或fork数量关键词去查找xxx关键词原创 2021-01-11 14:17:39 · 529 阅读 · 0 评论 -
服务器变慢,诊断思路和性能评估
一、用 top 命令查看整个机器的运行情况二、查看CPU : vmstat 指令三、查看内存 free四、看硬盘 df五、查看 磁盘IO iostat六、查看网络IO ifstat原创 2021-01-11 00:18:37 · 241 阅读 · 0 评论 -
G1垃圾收集器
以前收集器特点年轻代和老年代是各自独立且连续的内存块年轻代收集,使用单eden+S0+S1进行复制算法老年代收集必须扫描整个老年代区域都是以尽可能快速地执行GC为设计原则G1的特点G1的底层原理采用的Region区域化垃圾收集器 :最大的好处是化整为零,避免全内存扫描,只需要按区域进行扫描即可 (效率大大提升)G1下的Young GC针对Eden区进行收集 ,Eden区消耗殆尽后会被触发,采用小区域收集 + 形成连续的内存块(逻辑上连续),避免了内存碎片如果Eden的数据移动原创 2021-01-10 23:27:04 · 216 阅读 · 0 评论 -
怎么看服务器默认的垃圾收集器是哪个?生产上如何配置垃圾收集器? 谈谈你对垃圾收集器的理解
怎么查看默认的垃圾收集器是哪个默认的垃圾收集器有哪些原创 2021-01-10 21:51:04 · 341 阅读 · 0 评论 -
GC垃圾回收算法和垃圾收集器的关系 ? 分别是什么?
GC四大算法一、引用计数法(了解即可)每个对象有一个引用计数器,当对象被引用一次则计数器加1,当对象引用失效一次,则计数器减1,对于计数器为0的对象意味着是垃圾对象,可以被GC回收。目前虚拟机基本都是采用可达性算法,从GC Roots 作为起点开始搜索,那么整个连通图中的对象边都是活对象,对于GC Roots 无法到达的对象变成了垃圾回收对象,随时可被GC回收。二、复制算法(Copying)年轻代中使用的是Minor GC,采用的就是复制算法(Copying)HotSpot JVM 把年轻原创 2021-01-10 20:23:52 · 808 阅读 · 1 评论 -
谈谈你对OOM的认识
注意下:口头表述中很多人喜欢 叫成OOM还有栈溢出异常,实际上他们是错误一、 栈溢出 java.lang.StackOverflowError这种一般是出现了循环调用方法,因为每一次调用方法 都需要给方法开辟一块栈帧public class StackOverflowDemo { public static void main(String[] args) { stackOverflow(); } private static void stackOver原创 2021-01-10 18:00:40 · 388 阅读 · 0 评论 -
强引用、软引用、弱引用、虚引用分别是什么
强引用(默认支持的默认)强引用就是我们常见的普通对象引用 /** * 强引用 */ private Object strongReference= new Object();只要还有一个强引用指向一个对象,就表明对象“活着”当内存不足 的时候,JVM开始垃圾回收,对于强引用的对象,就算是出现了OOM也不会对该对象进行回收,死也不收强引用是造成内存泄漏的主要原因软引用软引用需要通过Jdk提供的 java.lang.ref.SoftReference实现原创 2021-01-10 17:32:41 · 501 阅读 · 0 评论 -
盘点查看JVM系统默认值
JVM的参数类型下面绘制成思维导图,方便理解我自己敲的脑图 链接https://www.processon.com/view/link/5ffaa864e401fd661a251e71#map查看JVM默认值JVM常用基本配置参数有哪些原创 2021-01-10 15:11:51 · 204 阅读 · 0 评论 -
JVM垃圾回收的时候如何确定垃圾 ? 是否知道什么是GC Roots
什么是垃圾简单来说,就是内存中已经不再被使用到的空间就是垃圾要进行垃圾回收,要先判断对象是否可以被回收下面介绍几种用来判断是否垃圾的算法一、引用技术法(了解即可)通过给对象添加计数器,每当有一个地方引用它,计数器值就 + 1,有一个地方引用失效就,计数器值就 - 1只要计数器值为零,就说明这个对象不再被使用,可以当作垃圾回收优点是 :实现简单缺点 : 1、每次对对对象的赋值是都要维护引用计数器,且计数器本身也有一定的损耗2、解决不掉循环引用的问题二、枚举根节点做可达性分心 (根搜索路径原创 2021-01-10 11:31:31 · 958 阅读 · 16 评论 -
死锁编码及定位分析
死锁产生的原因简单来说就是 不同的线程 持有对方需要的一把锁 还妄图去获取别人手上的一把锁1、系统资源不足2、进程运行推进的顺序不合适3、资源分配不当死锁的解决方案 详细的可以去参考 哲学家问题手写一个死锁案例package com.demo;/** * 手写一个死锁案例 */public class DeadlockDemo { public static void main (String[] args) throws InterruptedException {原创 2021-01-08 16:03:24 · 148 阅读 · 1 评论 -
线程池用过吗?生产上如何设置合理参数
线程池的拒绝策略一、为什么要采用拒绝策略当等待队列已经排满了,再也塞不下新任务线程池的中的max线程数 也达到了,无法继续为新任务服务这个时候,我们需要拒绝策略机制 去 合理的处理这个问题二、Jdk内置的几种拒绝策略1、AbortPolicy (默认) :直接抛出RejectedExecutionException异常阻止系统正常运行2、CallerRunsPolicy :调用者运行,该策略既不会抛弃任务,也不会抛出异常,而是将某些任务回退给调用者,从而降低新任务的流量3、DiscardOl原创 2021-01-08 14:45:53 · 380 阅读 · 3 评论 -
线程池使用过吗?谈谈对于ThreadPoolExecutor的理解
使用线程池的好处1、线程复用;2、控制最大线程数;3、管理线程JDK提供几种线程池的使用方法 (开发中要手写)java中的线程池是通过Executor框架实现一、newSingleThreadPool 创建单线程化的线程池/** * 创建单线池化的的线程池newSingleThreadExecutor */public void newSingleThreadExecutor () { ExecutorService executor = Executors.newSingle原创 2021-01-08 11:56:58 · 326 阅读 · 0 评论 -
阻塞队列知道吗?
阻塞队列的概念阻塞队列的工作原理图如下当阻塞队列是空时,从队列中获取元素的操作会被阻塞当阻塞队列是满时,从队列中添加元素的操作会被阻塞为什么要使用阻塞队列呢首先在多线程领域下,阻塞是指某些情况下会挂起线程,一旦条件满足,被挂起的线程又会自动被唤醒使用了阻塞队列后我们不需要手动的去唤醒,和阻塞,控制这些小细节 待会下面的生产者-消费者代码会带你感受其中的便捷介绍下BlockingQueue的核心方法阻塞队列的种类分析ArrayBlockingQueue :由数组结构组成的有界阻塞队列原创 2021-01-08 00:21:51 · 208 阅读 · 0 评论 -
CountDownLatch/CyclicBarrier/Semaphore使用过吗?
CountDownLatchCountDownLatch让一些线程阻塞,直到另外一些线程完成操作后 才被唤醒CountDownLatch主要有两个方法,当一个或多个线程调用await方法时,调用线程会被阻塞。其它线程调用countDown方法会将计数器减一(调用countDown方法的线程不会阻塞),当计数器的值变为0时,因调用await方法被阻塞的线程会被唤醒,继续执行demo/** * CountDownLatch案例 */public class CountDownLatchDemo {原创 2021-01-07 22:54:25 · 167 阅读 · 0 评论 -
公平锁/非公平锁/可重入锁/递归锁/自旋锁,谈谈你的理解?+手写一个自旋锁
1、公平锁和非公平锁公平锁 :多个线程申请锁的顺序来获取锁(先来后到)非公平锁 :多个线程通过争抢来获得锁(获取是不按照顺序的)synchronized,是一个非公平锁java 中 ReentrantLock 采用不同i的构造方法 可以是公平锁 也可以是非公平锁 /** 默认的非公平锁 */ public ReentrantLock() { sync = new NonfairSync(); }可以通过有参构造 创建一个公平锁原创 2021-01-07 21:00:32 · 300 阅读 · 0 评论 -
ArrayList线程不安全,请编写一个不安全的案例,并且给出解决方案
不安全的案例额,这里我踩坑了,在Junit中启动编写启动,一直启动不起来,后面百度才知道Junit中不能启动多线程(详细的可以去见这个https://blog.youkuaiyun.com/qq_40889460/article/details/101192003)System.out.println("----------线程不安全案例-----------"); List<String> list = new ArrayList<>(); for (int原创 2021-01-06 22:32:40 · 281 阅读 · 0 评论 -
CAS你知道吗?
比较并交换 AtomicInteger atomicInteger = new AtomicInteger(1); atomicInteger.compareAndSet(1,2);底层代码的实现 /** this:当前的对象 valueOffset:对象的内存地址 expect:当前线程从主存读取到的变量副本 update:当前线程准备修改变量的值 */ public final boolean compareAndSet(int expect, int update) {原创 2021-01-06 20:28:12 · 176 阅读 · 0 评论