Java教程

面试-技术点

本文主要是介绍面试-技术点,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

Java基础

1.请你说说Java的集合有哪几种?请你说说常用集合类的底层原理

2.抽象类与接口有什么区别?工作中你怎么使用的

3.谈谈设计模式,你工作中用到的设计模式有哪些?

Spring篇

4.浏览器请求一个url,整个流程发生什么?请你谈谈这个流程中DispatcherServlet的作用

5.请你谈谈堆AOP的理解?

6.在Spring中IOC(控制反转)的作用?

7.解释一下bean的生命周期?

8.Spring是怎么解决循环依赖的?为什么要三级缓存,二级可以吗?

img

9.说说事物的隔离级别?

10.@Transactionoal失效的场景?Spring 事务实现方式 ?

  • @transaction应用在非public修饰的方法上

  • @Transactional 注解属性 propagation 设置错误:

    • TransactionDefinition.PROPAGATION_SUPPORTS、
    • TransactionDefinition.PROPAGATION_NOT_SUPPORTED、
    • TransactionDefinition.PROPAGATION_NEVER
  • @Transactional 注解属性 rollbackFor 设置错误

  • 同一个类中方法调用,导致 @Transactional 失效

MyBatis与MyBatis Plus

11.MyBatis中,#{}和${}的区别是什么 ?

12.MyBatis Plus你用过吗?与MyBatis有什么不同

13.Xml映射文件你用过哪些标签?若查询指定多个id的数据需要使用什么标签,或批量插入数据时使用的标签

SpringBoot篇

14.请你说说Spring,SpringBoot,Spring Cloud的区别?

15.请你讲讲@SpringBootApplication核心注解

16.SpringBoot如何实现全局异常处理?

@ControllerAdvice + @ExceptionHandler

MySQL篇

17.MySQL数据库引擎有哪些?说说InnoDB与MyISAM的区别

18.数据库的四大特性?

19.请你讲讲MySQL索引的数据结构?为什么用B+树作为索引

20.讲讲索引的最左匹配原则?索引失效的情况

21.在系统中发现有慢sql,你应该从哪几些地方优化?

  • explain查看执行计划,是否正常走索引

  • 是不是表数据量过大,要不要进行表的拆分或分库

  • 是不是表的关联查询过多,一般最多三四个表做关联查询

22.sql优化的手段有哪些?

23.大表的分页查询你会怎么实现?

24.在设计时,什么情况下会使用索引?

JVM篇

25.请你讲讲JVM的内存模型?

26.什么时候会触发Major GC?

27.JVM中类的加载机制?有哪几类加载器?

类加载器包括:根加载器(BootStrap)、扩展加载器(Extension)、系统加载器(System)和用户自定义类加载器(java.lang.ClassLoader的子类)

28.JVM垃圾回收时,是怎么判断哪些对象需要回收的?

  • 引用计数:每个对象有一个引用计数属性,新增一个引用时计数加1,引用释放时计数减1,计数为0时可以回收。此方法简单,无法解决对象相互循环引用的问题。
  • 可达性分析(Reachability Analysis):从GC Roots开始向下搜索,搜索所走过的路径称为引用链。当一个对象到GC Roots没有任何引用链相连时,则证明此对象是不可用的,不可达对象。

29.你知道哪些垃圾收集算法?

标记 -清除算法、复制算法、标记-压缩算法

我们常用的垃圾回收器一般都采用分代收集算法:“分代收集”(Generational Collection)算法,把Java堆分为新生代和老年代,这样就可以根据各个年代的特点采用最适当的收集算法

30.JVM重用的调优工具有哪些?

jdk自带监控工具:jconsole和jvisualvm,第三方有:MAT(Memory Analyzer Tool)、GChisto

31.你知道哪些JVM性能调优参数?

[堆栈内存相关]

  • -Xms 设置初始堆的大小
  • -Xmx 设置最大堆的大小
  • -Xmn 设置年轻代大小,相当于同时配置-XX:NewSize和-XX:MaxNewSize为一样的值
  • -Xss 每个线程的堆栈大小
  • -XX:NewSize 设置年轻代大小(for 1.3/1.4)
  • -XX:MaxNewSize 年轻代最大值(for 1.3/1.4)
  • -XX:NewRatio 年轻代与年老代的比值(除去持久代)
  • -XX:SurvivorRatio Eden区与Survivor区的的比值
  • -XX:PretenureSizeThreshold 当创建的对象超过指定大小时,直接把对象分配在老年代。
  • -XX:MaxTenuringThreshold设定对象在Survivor复制的最大年龄阈值,超过阈值转移到老年代

[垃圾收集器相关]

  • -XX:+UseParallelGC:选择垃圾收集器为并行收集器。
  • -XX:ParallelGCThreads=20:配置并行收集器的线程数
  • -XX:+UseConcMarkSweepGC:设置年老代为并发收集。
  • -XX:CMSFullGCsBeforeCompaction=5 由于并发收集器不对内存空间进行压缩、整理,所以运行一段时间以后会产生“碎片”,使得运行效率降低。此值设置运行5次GC以后对内存空间进行压缩、整理。
  • -XX:+UseCMSCompactAtFullCollection:打开对年老代的压缩。可能会影响性能,但是可以消除碎片

[辅助信息相关]

  • -XX:+PrintGCDetails 打印GC详细信息
  • -XX:+HeapDumpOnOutOfMemoryError让JVM在发生内存溢出的时候自动生成内存快照,排查问题用
  • -XX:+DisableExplicitGC禁止系统System.gc(),防止手动误触发FGC造成问题.
  • -XX:+PrintTLAB 查看TLAB空间的使用情况

32.什么是逃逸分析? 对象一定分配在堆中吗?

不一定的,JVM通过「逃逸分析」,那些逃不出方法的对象会在栈上
分配。

逃逸分析的好处:

  • 栈上分配,可以降低垃圾收集器运行的频率。
  • 同步消除,如果发现某个对象只能从一个线程可访问,那么在这个对象上的操作可以不需要同步。
  • 标量替换,把对象分解成一个个基本类型,并且内存分配不再是分配在堆上,而是分配在栈上。这样的好处有,一、减少内存使用,因为不用生成对象头。二、程序内存回收效率高,并且GC频率也会减少

33.什么是STW?

34.说一说JVM有哪些垃圾收集器?

多线程&高并发

35.volatile关键字的作用?是怎么保证可见性、防止指令重排的

36.怎么保证多线程的原子性?

  • synchronized
  • JUC原子包装类AtomicInteger

37.原子包装类是怎么保证原子性的?

CAS -> Unsafe -> CAS底层思想 -> ABA -> 原子引用更新 -> 如何规避ABA问题->时间戳原子引用AtomicStampedReference

关键字:CAS:unsafe+内存偏移量offset

38.怎么保证多线程情况下单例模式是线程安全的?

  • 使用volatile+synchronized 双重检锁机制

39.ArrayList集合线程不安全问题的解决方案?

  • Vector:DK1.0比较古老,开发中比较少用
  • Collections:synchronizedList(List list)解决
  • CopyOnWriteArrayList:推荐,写时复制技术
    • 实现集合并发读-独立写功能
    • 向集合中写数据时支持独立写:复制一份集合写入新的内容,写完后合并或覆盖原集合

40.请你讲讲synchronized关键字与ReentrantLock的区别?

41.怎么实现线程间的通信?

  • 1.Object类的wait()、notify()/notifyAll()
  • 2.ReentrantLock的await()、signal()/signalAll()

42.创建线程有几种方式?Runable接口与Callable接口的区别,怎么使用Callable接口创建线程,在Thread构造方法中,有Runable参数,而没有Callable参数来创建线程?

关键字:Runable接口有实现类FutureTask(Callable callable)

43.为什么要用线程池?请你讲讲创建线程池ThreadPoolExecutor的7大参数,有几大拒绝策略?

44.请你讲讲JUC的辅助类?

  • 闭锁CountDownLatch
  • 循环栅栏CyclicBarrier
  • 信号量Semaphore

45.sleep()和wait()的区别?

sleep():Thread类,cpu阻塞

wait():Object类,失去cpu执行权

46.线程池中submit()和execute()方法的区别?

  • submit()方法可以返回持有计算结果的Future对象

47.请你讲讲对乐观锁与悲观锁的理解?并用在工作中遇到的锁进行举例

Redis篇

48.工作中你使用过Redis吗?为什么要用Redis,Redis有哪些优点?

49.Redis持久化方式有哪些?它们有什么区别?

RDB机制:数据集快照,某个时间点持久化

AOF机制:所有的命令行记录以 Redis 命令请求协议的格式完全持久化存储

50.Redis有哪5大数据类型?它们有哪些使用场景

51.讲讲缓存穿透、缓存雪崩、缓存击穿?以及怎么避免这些问题

52.在工作中,你是怎么实现分布式锁的?

分布式篇

53.你知道哪些分布式事务解决方案?

  • 1.两阶段提交(2PC)
  • 2.三阶段提交(3PC)
  • 3.补偿偿事务(TCC=Try-Confirm-Cancel)
  • 4.本地消息队列表(MQ)
  • 5.Sagas事务模型(最终一致性)

54.分布式ID生成有哪些方案?

网络篇

55.说说TCP/IP的网络模型

56.请你讲一讲TCP协议的三次握手与四次挥手?为什么要三次握手,两次不行吗?

57.TCP是如何保证可靠性的?

Linux篇

58.Linux你熟悉吗?你常用的命令有哪些?

Spring Cloud篇

59.Nacos、Eureka和zookeeper都可以提供服务注册与发现的功能,请说说三个的区别?

  • Zookeeper保证了CP(C:一致性,P:分区容错性),Eureka保证了AP(A:高可用)
  • Nacos默认采用AP模式,在1.0版本之后采用ap+cp模式混合实现注册中心

60.什么是服务熔断?什么是服务降级?

61.Sentinel怎么做流量控制?

MQ篇

62.为什么要使用MQ?Kafka、ActiveMQ、RabbitMQ、RocketMQ 都有什么区
别?

63.如何保证消息的可靠传输?如果消息丢了怎么办?

64.如何解决消息队列的延时以及过期失效问题?消息队列满了以后该怎么处理?有几百万消息持续积压几小时,说说怎么解决?

前端Vue.js

1.你用过Vue.js吗?请你简单说说它的MVVM思想

2.你了解Vue页面加载的大概的一个生命周期吗?

  • created:html加载完成之前执行。执行顺序:父组件-子组件
  • mounted:html加载完成后执行。执行顺序:子组件-父组件
  • methods:事件方法执行
  • watch:watch是去监听一个值的变化,然后执行相对应的函数
  • computed:computed是计算属性,也就是依赖其它的属性计算所得出最后的值
  • created():dom还未生成,仅仅触发一次;
  • mounted:dom渲染完毕,仅仅执行一次;
  • activated():在使用时keep-live主要目的是可以使用缓存,避免组件重新渲染;只要进入组件激活就会触发。

3.父子组件怎么传值?

4.怎么实现对象或数组的深拷贝?

5.让两个div按比例显示在同一行怎么实现?

6.怎么阻止点击事件向上冒泡?

7.v-if与v-show有什么区别?

8.vue中如何实现同步请求?

这篇关于面试-技术点的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!