个人评价
比较简单的面试题,不知道 nacos和gateway这块有没有深问,如果深问的话,那难度就升级了。一直对io的八股文不感冒,io这块的知识还得加强,该面经最后一问我是没有如何思路的,算是长知识了欸。
1.你说说对java集合的理解吧?
集合主要就是 List,Set,Map三种结构,List存储有序的集合,Set存储不重复的集合,map存储键值对。
2.在List中,你说说ArrayList和LinkedList的区别吧?
- 从结构方面,ArrayList使用动态数组,LikedList使用双向链表,ArrayList实现了RandomAccess接口是可以实现快速的随机访问。
- 从线程安全方面,ArrayList和LinkedList都是线程不安全的,可以使用SynchronziedList包装。
- 从使用方面,在插入时ArrayList的时间复杂度为O(n),如果在队尾的话就是O(n),但是插入涉及扩容的话时间复杂度就为O(n)。而LinekdList的时间复杂度为O(n),队尾和对头的话时间复杂度为O(1)。查询的二者的时间复杂度为O(n)。
- 基本上在开发的时候,推荐使用ArrayList。
3.在Set中,你说说HashMap和HashSet的区别吧?
HashSet底层就是使用HashMap实现的,硬要说区别的话,在数据的存储上HashSet存储不重复的数据,HashMap存储键值对。HashSet还实现了Set接口。
4.在Map中,你说说HashTable和HashMap的区别?
- 线程的安全方面,HashMap不是线程安全的,hashTable是线程安全的,其底层是使用Synchronzied实现的,所以效率上比HashMap低。
- 键值对的存储方面,HashMap支持key和vlaue为null的情况,但是Key的null只能存在一个。而HashTable的键值都不能为null。
- 底层结构方面,HashMap主要基于 hash表+链表+红黑树实现的,HashTable基于数组+单链表实现的。在解决Hash冲突的时候,当表大于等于64且链表节点大于等于8的时候HashMap就会将链表转为红黑树。而HashTable则是使用拉链法。在扩容时,HashMap会扩容为2的n次幂(2^n),HashTable会扩容为 2n+1。
5.StringBuffer和StringBuilder的区别?
主要就是线程安全的区别,StringBuffer是线程安全的,而StringBuilder,因为StringBuilder底层使用Synchronzied来实现的,所以在效率上StringBuilder会高很多。
6.接口和抽象类的区别?
- 抽象类是个基类,是可以不会被实现,只能被继承,而接口既可以被继承有可以被实现。并且一个类可以实现多个接口。
- 抽象类中可以存在非抽象方法,但是接口只能存在抽象方法。
- 抽象类中可以存在普通的变量,但是接口中的变量必须是静态的变量。
7.Spring的核心是什么?
- 主要就是 IOC和AOP。
- IOC就是控制反转,用户不再需要手动的创建实例,而是从IOC容器中直接获取时候,也保证了类创建的安全性。
- AOP就是面向切面,通过切面的方式进行方法的增强,不会修改原代码,保证了代码的封装性。
8.Spring常用的注入注解有哪些?
- 主要就是使用@AutoWired进行注入,通过ByClass的方式。
- 也可以通过@Qualifier进行注入,通过ByName的方式。
- 在被@Bean修饰的方法中,如果参数就一个的话,就会进行自动注入。
9.Nacosp配置中心有了解过吗?
Nacos既可以作为注册执行也可以作为配置中心,可以通过分组的方法进行模块化的配置,就可以通过编写bootstrap配置文件编写共享配置。
10.Gateway网关了解过吗?
在微服务项目中,请求会先进入网关中,进行校验后路由到对应的服务中。通过的配置进行限流,Gateway中最典型的就是令牌桶算法来限流。
11.说说你对令牌桶算法的理解?
请求访问服务需要携带令牌,从令牌桶中获取,令牌桶中的令牌生成的是速率是固定的。主要就是通过RequestRateLimiter进行配置的。
12.熟悉Linux哪些指令?
cd :进入
cat file 查康文件信息
vim file 修改文件信息
ll: 查看目录结构
top:查康进程
touch file 创建一个文件
等等
13.熟悉哪些设计模式?
在项目中主要就是使用到 工厂模式和策略模式。
在我的电影项目中,为了动态的控制Reddison通过不同的分布式锁和策略,就使用到了 自定义注解+AOP+工厂模式+策略模式实现的。
自定义注解其中的属性主要就是 锁的名字,锁的类型,锁的策略。
AOP使用环绕通知用来控制上锁和解锁的顺序。
工厂模式,工厂类主要就是一个enumMap属性,key为锁类型的枚举,value即使reddison通过的不同类型的锁实现,通过对应的锁类型的枚举来获取对应的锁。
策略模式,策略类中主要就是抽象策略方法,内部子类去重写该抽象方法,这些子类就是一个一个的策略,通过策略的枚举返回对应的策略方法。
14.JVM的内存模型?
- 主要就是堆和栈结构。
- 堆用来存储类的实例和数组,且是线程共享的。
- 栈主要即使存储局部变量和调用方法的内存,且是线程私有的。
- 在jdk8之前的时候还存在方法区,主要就是存储类的信息,常量等信息,在jdk8之后为了防止OOM,移除了方法区在本地内存中创建了元空间存储这些数据。
15.垃圾回收算法有哪些?
- 标记回收法,通过可达性分析算法也就是通过GC Root标记存活的对象,将其他对象进行回收。但是呢,缺点很明显,会导致空间碎片话,在极端条件小可能会导致无法创建长数组。
- 标记整理法,通过可达性分析算法,将标记的对象移动到内存的一端然后进行回收,缺点就是涉及到大量数据的移动,效率很低。
- 复制算法,将内存空间分为两个部分,将当前一侧存活的对象复制到另一侧中,将旧一侧对象进行回收,一此此规则进行垃圾回收,缺点就是空间利用率太低了。
16.垃圾回收器有哪些?
主要就是串行垃圾回收器,并行垃圾回收器,并发垃圾回收器,G1垃圾回收器,其中G1垃圾回收器是目前最主流的。
17.听你说到G1垃圾回收器,那你说说该垃圾回收器的理解吧?
- 其结构主要就是 新生代和老年代,其中新时代分为Eden区,to幸存者区和from幸存者区。
- 采用的垃圾回收算法就是复制算法。
- 回收流程主要就是 新时代的回收,并发标记那些需要被回收的老年代。混合回收主要就是将标记的老年代和可以晋升的新时代存储到新的老年代中,如果老年代中的对象过于庞大的话就会这些数据复制存储到巨型区(humongous)中。
18.有了解过线程的周期吗?(其实就是要问线程的状态有哪些)
- 在线程被创建的时候就是线程的新建状态。
- 在线程获取对象锁的时候就是线程的可执行状态。
- 在线程获取锁失败的时候线程就会进入堵塞状态。
- 在线程主动调用wait方法线程就会进入睡眠状态,此时需要被notify或notifyAll进行唤醒。
- 在线程主动调用sleep方法线程就会进入计时睡眠状态。
- 在线程运行完之后就会进入终止状态。
*19.java中的并发工具类有哪些?
- CountDownLatch:允许一个或多个线程等待其他线程执行完之后再执行。
- CyclicBarrier:允许一组线程相互等待,直到所有线程到达每隔屏障后继续执行。
- Semaphore:允许控制同时访问特定资源的线程数量,可以用来限制并发访问的数量。