最近开始找工作了,坐标杭州。渣渣感觉面试应该挺困难的,也不知道具体会问哪些类型,会在面试完把每一次面试问到的题目列出来, 一个作用是参考记录,另一个作用是可以把自己不会或者弱项的问题及时补齐。
暂时是先把问题列出来,有时间的时候会把答案补上。
希望能找到一个好工作,加油
尼尧的面试日记:面试记录(三)
- 本次面试过程
- 面试题
-
- 一、你先简单介绍一下自己吧。
- 二、了解mysql吗,那先说一下数据库的主键索引和普通索引的区别。
- 三、刚才听你说到聚集索引,那你说说(后提醒这是联合索引,你记错了)。
- 四、说一说乐观锁和悲观锁
- 五、线程池知道吗,说说其中的参数,或者知道几个说几个。
- 六、说一说bean什么情况下注入失败。
- 七、AOP知道吗,那你知道在同一个类中,某个方法调用了切面的方法,切面生效吗/li>
- 八、暂时问这么多吧,你有什么要问我的/li>
我大概总结一下,小型公司2年以下开发主要业务就是CRUD,招人肯定是希望能立马上手,所以面试范围我押题是常用的框架(SpringBoot、Spring基本概念,Mybatis),事务、数据库相关(锁、事务级别、sql优化,数据库底层概念等)、异常。有些会问一些设计模式(主要掌握工厂模式、单例模式、代理模式。)。
中大型公司的话,加上 JVM,集合,并发编程,一些 络知识。有些可能还会有一两道算法题。甚至开始问分布式了,具体看他们业务。
大厂请直接参考我画的java路线图,大厂知识路线没有3年以下之分,只有深/广度之分:Java知识体系脑图(2020年)
本次面试过程
- 背景
小型公司,常驻项目现场(非外包),政府、银行类业务。电话面试,问的比较简单。
- 过程
本次就一轮面试,一开始也是自我介绍,然后就问了几个问题。
面试题
一、你先简单介绍一下自己吧。
阿巴阿巴… (几年工作经验,上一家项目主要负责哪一块,自己的强项是什么。)
二、了解mysql吗,那先说一下数据库的主键索引和普通索引的区别。
索引类型 | 说明 |
---|---|
主键索引 | 使用主键字段作为索引(聚集索引),唯一且不能为空。主键索引的叶子节点存放的是整行数据 ;主键索引也被称为聚簇索引 |
普通索引(非主键索引) | 普通索引使用除主键外某一个字段作为索引,是辅助索引中的一种。辅助索引的叶子节点存放的是主键的值;辅助索引也被称为二级索引 |
- 什么是索引/strong>
索引在MySQL中也叫做“键”或者”key”(primary key,unique key,还有一个index key),是存储引擎用于快速找到记录的一种数据结构。索引对于良好的性能非常关键,尤其是当表中的数据量越来越大时,索引对于性能的影响愈发重要,减少io次数,加速查询。
其中primary key、unique key,还有约束的效果,primary key 不为空且唯一,unique key 唯一,而index key只有加速查询的效果,没有约束效果
- 主键索引和非主键索引
聚集索引和辅助索引示意图如下:
三、刚才听你说到聚集索引,那你说说(后提醒这是联合索引,你记错了)。
联合索引,即多个字段共同组成的索引。
联合索引有两个特点(好处):
- 最左匹配原则。比如字段(a,b,c)作为联合索引,那么他的查询条件只能是 (a)、(a,b)、(a,b,c),字段间关联词为 and,若用or失效。
若你自行测试发现(a,c)也生效,但仔细观察实际上只用了(a)索引。
创建复合索引时,应该仔细考虑列的顺序,将区分度高的放在最左边,依次排下来,范围查询的条件尽可能的往后边放。
- 在第一个键相同的情况下,已经对第二个键进行了排序处理。因为B+树特性,索引本身在叶子节点已经排序了。
四、说一说乐观锁和悲观锁
- 乐观锁
乐观锁( Optimistic Locking ) 相对悲观锁而言,乐观锁机制采取了更加宽松的加锁机制。悲观锁大多数情况下依靠数据库的锁机制实现,以保证操作最大程度的独占性。
乐观锁不是一种实际的锁,它是一种理论,一般通过CAS(比较并交换)来实现。一般数据库中都会存在隐藏字段版本 ,可通过比较版本 实现。
乐观锁的特点是先进行业务操作,不到万不得已不会去拿锁。乐观地认为拿锁多半会是成功的,因此在完成业务操作需要实际更新数据的最后一步再去拿一下锁。
- 悲观锁
悲观锁(Pessimistic Locking),是指在数据处理过程,使数据处于锁定状态,一般使用数据库的锁机制实现。思路即一开始处理就先锁上,处理完毕后再释放锁。
现在互联 高并发的架构中,受到fail-fast思路的影响,悲观锁使用的频率较低了。
在MySQL中使用悲观锁,必须关闭MySQL的自动提交,set autocommit=0,MySQL默认开启自动提交autocommit模式,即你执行一个更新操作,MySQL会自动将结果提交。
在MySQL中用悲观锁务必须确定走了索引,而不是全表扫描,否则将会将整个数据表锁住。
五、线程池知道吗,说说其中的参数,或者知道几个说几个。
线程池在博主之前的博客中写过:Java基础进阶——多线程与JUC(下)
线程池,本质上是一种对象池,用于管理线程资源。在任务执行前,需要从线程池中拿出线程来执行。在任务执行完成之后,需要把线程放回线程池。
通过线程的这种反复利用机制,可以有效地避免直接创建线程所带来的坏处。
- 线程池的好处
- 降低资源的消耗。线程本身是一种资源,创建和销毁线程会有CPU开销;创建的线程也会占用一定的内存。
- 提高任务执行的响应速度。任务执行时,可以不必等到线程创建完之后再执行。
- 提高线程的可管理性。线程不能无限制地创建,需要进行统一的分配、调优和监控。
一句话总结:线程复用,可以控制最大并发量,提高响应速度,方便管理。
- 线程池的缺点
- 频繁的线程创建和销毁会占用更多的CPU和内存。
- 频繁的线程创建和销毁会对GC产生比较大的压力。
- 线程太多,线程切换带来的开销将不可忽视。
- 线程太少,多核CPU得不到充分利用,是一种浪费。
- ThreadPoolExecutor
注:在阿里Java开发规范手册里要求,创建线程池不能使用Executors,必须使用ThreadPoolExecutor。
原因是源码中创建了无长度限制的队列,则队列最大容量可达,可能因为任务堆积过多导致,这是非常严重的bug。底层实际也是。
ThreadPoolExecutor中有7个参数,就是平常说的线程池调优时需要调整的参数。下面我们用构造函数来讲解下各个参数的含义:
- 拒绝策略
所谓拒绝策略,就是当线程达到了最大承载的时候,我们对多出来的线程采取的措施。jdk自带以下4种拒绝策略:
- ThreadPoolExecutor.AbortPolicy() //最大承载直接抛出异常。
- ThreadPoolExecutor.CallerRunsPolicy() // 在调用者线程执行。谁创建谁处理。
- ThreadPoolExecutor.DiscardPolicy // 任务直接丢弃,不做任何处理,不抛出异常。
- ThreadPoolExecutor.DiscardOldestPolicy() // 尝试去和最早的那个线程竞争,失败则不处理,不抛异常。
其中比较常用的是DiscardPolicy,但是他不记录信息。当不满足我们需求的时候,可以通过实现RejectedExecutionHandler接口的方式自定义拒绝策略。
更多具体内容请查看博主的原博内容。
六、说一说bean什么情况下注入失败。
我一开始没太懂问的方向,然后回答是:
现在Spring中bean一般都是用注解注入的,如果失败的话是实体类没有set/get、构造函数吗/p>
面试官说:一般就是实体类没有受spring管理,或者你要注入的类没有受spring管理,所以注入失败了。
我:嗯嗯,谢谢您的解答。
七、AOP知道吗,那你知道在同一个类中,某个方法调用了切面的方法,切面生效吗/h2>
不生效的。AOP增加注解时,实际是在注入的时候增加了一个代理增强类,在同一个类的方法中调用,并不会注入增强类。
原因是,由于 Spring AOP (包括动态代理和 CGLIB 的 AOP) 的限制导致的。 Spring AOP 并不是扩展了一个类(目标对象),而是使用了一个代理对象来包装目标对象,并拦截目标对象的方法调用。这样的实现带来的影响是,在目标对象中调用自己类内部实现的方法时,这些调用并不会转发到代理对象中,甚至代理对象都不知道有此调用的存在。
这个情况与this类似,在bean中不要使用this来调用被@Async、@Transactional、@Cacheable等注解标注的方法,this下注解是不生效的,这些注解都是通过动态代理实现的。
八、暂时问这么多吧,你有什么要问我的/h2>
…
文章知识点与官方知识档案匹配,可进一步学习相关知识Java技能树首页概览92908 人正在系统学习中
声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!