屡败屡战的大数据秋招之Java知识点总结
回答的不好的地方麻烦大家指正,谢谢!
1. 给我说一下接口(interface)和抽象类(abstract class)的区别
- 接口只能有方法的定义(definition),不能够有方法的实现(implementation)。抽象类中可以有方法的实现
- implements可以一个或者多个接口,extends只能一个抽象类
- 接口强调(emphasize)特定功能的实现,抽象类强调所属关系
- 接口变量默认都是public static final不可变的,抽象类的变量可以在子类中进行修改
2. 说一下HashMap 的底层实现
3. 说一下Java 的锁机制。
- 分为三种锁:一互斥锁(Mutex lock:synchronized,reentranLock)二读写锁(readwriteLock)三信号量机制(semaphore)
4. 说一下synchronized 的底层原理
- 修饰语句块(modify statement block):实际采用monitorenter指向同步语句块的开始位置,monitorexit指向同步语句块的结束位置。执行me指令的适合线程视图获取对象监视器monitor的持有权 ex指令释放monitor所有权
- 修饰方法(modify methods):使用ACC_SYNCHRONIZED标识。两者本质都是对对象监视器(object monitor)的获取
5. 说一下readwritelock 的底层原理
- 使用AQS(AbstractQueuedSynchronizer)实现,将四字节int 类型的state 拆分为两部分,高16位和低16位,高16位表示读锁状态,低16位表示写锁状态。设置读锁成功时就将高16位加一,释放读锁就将高16位减一。设置写锁成功的时候就将低16位加一,释放写锁就将低16位减一。
6. 说一下可重入锁reentrantLock 的底层实现原理
7. 用过Java 多线程吗?怎么实现?
- 继承Thread类,实现Runnable接口,使用ThreadPoolExecutor创建线程池
8. 说一下Java 提供了哪些默认线程池创建策略
- FixedThreadPool 线程池线程数量固定 corePoolSize和maximumPoolSize数量相同
- SingleThreadPool 单个线程的线程池
- CachedThreadPool 核心线程初始数量为0,最大线程数量是Integer.MAX_VALUE,空闲的线程会在到达存活时间后释放线程资源
9. ThreadPoolExecutor 参数解释一下
- corePoolSize,maximumPoolSize,BlockingQueue
- corePoolSize 核心线程数量,核心线程不会被回收,即使没有任务执行,也会保持空闲状态。maximumPoolSize,当线程数量达到corePoolSize,且BlockingQueue塞满任务时,继续创建线程,超过maximumPoolSize会触发拒绝策略。
10.线程池拒绝策略有哪几种说一下
- AbortPolicy 直接抛异常 DiscardPolicy 直接丢弃不处理
- DiscardOldest 放弃等待队列中最久的未处理任务,然后将被拒绝的任务添加到BlockingQueue中
- CallerRunsPolicy 由主线程(调用者)执行任务的run方法。会降低新任务提交的速度。
11. 说一下反射在Java 中是干啥的?
12. CAS(Compare And Swap) 会出现什么问题,如何解决?
- ABA问题:X线程和Y线程获取到oldValue,Y线程将oldValue 改为newValue 之后又改为oldValue。X线程察觉不到这个问题,执行compareAndSet(expect,newValue)还是执行成功的。
- 通过AtomicStampedReference 类进行解决。他的compareAndSet 方法可以先检查当前引用是否等于预期引用,并且当前标志是否等于预期标志。如果全部相等的话讲该引用和该标志的值设定为给定的更新值。
13. SpringBoot 拦截器和过滤器的区别是什么?
14. SpringBoot AOP 讲一讲?
15. ConcurrentHashMap 的原理说一下?
16. HashMap 为了加快扩容速度采取了哪些措施?
17. 负载因子为什么设置为0.75?
18. HashMap 扩容为什么会造成死锁?
19. char 在Java 中为什么是两个字节?
20. 讲一下JVM垃圾回收机制(Garbage Collection Machinism)
- 垃圾回收主要针对于堆。目前JVM 采用分代垃圾回收(Generational Gaebage Collection Algorithms)算法,根据对象存活的生命周期将内存划分为新生代和老年代。
- 新生代的特点是每次垃圾回收都有大量的对象需要被回收,老年代的特点是每次垃圾收集只有少量对象需要回收。
- 新生代选用的是复制算法(Copy Algorithm),内存区域按照8:1:1的比例进行划分。大部分对象在Eden 区域生成,回收时先将对象放到survivor0中,当survivor0满了,就将eden和survivor0的对象复制到survivor1。之后清空Eden和survivor0,将survivor0和survivor1进行交换。
- 老年代对象生命周期比较长,采用的是标记-整理算法。(Mark and Compact)
21. 为什么新生代比例是8:1:1?
22. GC Roots 有哪些?
- 虚拟机栈中引用的对象
- 方法区中静态属性引用的对象
- 方法区中常量引用的对象
- 本地方法栈中Native 方法引用的对象
23. 触发垃圾回收的时机?
- 年老代被写满
- 持久代被写满
- System.gc() 被调用
24. 有哪些常用的异常?😅😅 撕题的时候异常情况要抛异常,别return -1.会被面试官怼死
25. 双亲委派模型,加载器的加载顺序
(parents delegation model)
26. Java 垃圾回收器的演进过程。垃圾回收器停顿和并发的指标
27 Java 浅拷贝和深拷贝
浅拷贝是会将对象的每个属性进行依次复制,但是当对象的属性值是引用类型时,实质复制的是其引用,当引用指向的值改变时也会跟着变化。 深拷贝复制变量值,对于引用数据,则递归至基本类型后,再复制。 深拷贝后的对象与原来的对象是完全隔离的,互不影响,对一个对象的修改并不会影响另一个对象。
28. ThreaLocal 原理
29. SpringBoot 过滤器和拦截器的区别
- 过滤器Filter是在请求进入容器后,但在进入servlet之前进行预处理,请求结束是在servlet处理完以后。
- 拦截器 Interceptor 是在请求进入servlet后,在进入Controller之前进行预处理的,Controller 中渲染了对应的视图之后请求结束。
30. SpringBoot IOC AOP原理?
31. SpringBoot 对象默认单例模式,如何修改为多例模式?
32. 线程间通信方式?
- 锁机制:互斥锁synchronized关键字,ReentrantLock,CountDownLatch,读写锁ReadWriteLock
- 信号量机制 Semaphore
33. 双亲委派机制,何时需要打破双亲委派机制?
34. Synchronized和Lock的区别?说一下公平锁和非公平锁?
- Lock 需要手动释放,Synchronized不需要
- Synchronized 非公平,Lock 可以实现公平锁
35. countLatch的await方法是否安全,怎么改造?
36. clone接口和serializable 接口的区别,继续说一下深克隆和浅克隆的区别?
- clone方法只能复制基本类型,对于引用类型它只是浅拷贝。
- 序列化和反序列化,则是彻底的深拷贝。
37. JSON 和 hessian序列化的区别?
- JSON是一种标准化的数据交换格式。将对象序列化为JSON对象。hessian 序列化会将对象序列化为二进制文件。
38. 深拷贝和浅拷贝的区别?
- 浅拷贝:浅拷贝会在堆上创建一个新的对象(区别于引用拷贝的一点),不过,如果原对象内部的属性是引用类型的话,浅拷贝会直接复制内部对象的引用地址,也就是说拷贝对象和原对象共用同一个内部对象。
- 深拷贝 :深拷贝会完全复制整个对象,包括这个对象所包含的内部对象。
39. Java 内存区域,特定类型会放入哪个区域?
- 线程私有:程序计数器,虚拟机栈,本地方法栈。 线程共享:堆(年轻代+年老代)和方法区
- 很长的字符串和和数组会放入老年代。长期存活的对象会被放入老年代。
- 类信息、常量和静态变量会被放入方法区。
40. 垃圾回收机制,minor jc 和 full gc 发生的时机。参数控制?
- Minor GC触发条件:当Eden区满时,触发Minor GC。
- Full GC触发条件:
(2)老年代空间不足
(3)方法区空间不足
(4)通过Minor GC后进入老年代的平均大小大于老年代的可用内存
41. 什么时候会出现OOM,OOM会造成什么结果?发生OOM了如何排查?有什么参数?