【美团】面试真题: 
1、Spring AOP 底层原理 ?

一、AOP概念:
  AOP(Aspect Oriented Programming),即面向切面编程,可以说是OOP(Object Oriented Programming,面向对象编程)的补充和完善。OOP引入封装、继承、多态等概念来建立一种对象层次结构,用于模拟公共行为的一个集合。不过OOP允许开发者定义纵向的关系,但并不适合定义横向的关系,例如日志功能。日志代码往往横向地散布在所有对象层次中,而与它对应的对象的核心功能毫无关系对于其他类型的代码,如安全性、异常处理和透明的持续性也都是如此,这种散布在各处的无关的代码被称为横切(cross cutting),在OOP设计中,它导致了大量代码的重复,而不利于各个模块的重用。

  AOP技术恰恰相反,它利用一种称为"横切"的技术,剖解开封装的对象内部,并将那些影响了多个类的公共行为封装到一个可重用模块,并将其命名为"Aspect",即切面。所谓"切面",简单说就是那些与业务无关,却为业务模块所共同调用的逻辑或责任封装起来,便于减少系统的重复代码,降低模块之间的耦合度,并有利于未来的可操作性和可维护性。

  使用"横切"技术,AOP把软件系统分为两个部分:核心关注点和横切关注点。业务处理的主要流程是核心关注点,与之关系不大的部分是横切关注点。横切关注点的一个特点是,他们经常发生在核心关注点的多处,而各处基本相似,比如权限认证、日志、事物。AOP的作用在于分离系统中的各种关注点,将核心关注点和横切关注点分离开来。

二、AOP核心概念

(2.1)横切关注点

   对哪些方法进行拦截,拦截后怎么处理,这些关注点称之为横切关注点

(2.2)切面(aspect)

  类是对物体特征的抽象,切面就是对横切关注点的抽象

(2.3)连接点(joinpoint)

  被拦截到的点,因为Spring只支持方法类型的连接点,所以在Spring中连接点指的就是被拦截到的方法,实际上连接点还可以是字段或者构造器

(2.4)切入点(pointcut)

  对连接点进行拦截的定义

(2.5)通知(advice)

  所谓通知指的就是指拦截到连接点之后要执行的代码,通知分为前置、后置、异常、最终、环绕通知五类

(2.6)目标对象

   代理的目标对象

(2.7)织入(weave)

  将切面应用到目标对象并导致代理对象创建的过程

(2.8)引入(introduction)

  在不修改代码的前提下,引入可以在运行期为类动态地添加一些方法或字段

java的AOP的面试题_开发语言

2HASHMAP 的底层数据结构是怎样的

JDK1.7及之前:数组+链表

JDK1.8:数组+链表+红黑树

 

java的AOP的面试题_开发语言_02

JDK1.8 之前:

  1. JDK1.8 之前 HashMap 底层是 数组和链表 结合在一起使用也就是 链表散列。
  2. HashMap 通过 key 的 hashCode 经过扰动函数处理过后得到 hash 值,然后通过 (n - 1) & hash 判断当前元素存放的位置(这里的 n 指的是数组的长度),如果当前位置存在元素的话,就判断该元素与要存入的元素的 hash 值以及 key 是否相同,如果相同的话,直接覆盖,不相同就通过拉链法解决冲突。
  3. 所谓扰动函数指的就是 HashMap 的 hash 方法。使用 hash 方法也就是扰动函数是为了防止一些实现比较差的 hashCode() 方法 换句话说使用扰动函数之后可以减少碰撞。

java的AOP的面试题_后端_03

JDK1.8 之后: 

  当链表长度大于阈值(默认为 8)时,会首先调用 treeifyBin()方法。这个方法会根据 HashMap 数组来决定是否转换为红黑树。只有当数组长度大于或者等于 64 的情况下,才会执行转换红黑树操作,以减少搜索时间。否则,就是只是执行 resize() 方法对数组扩容。

java的AOP的面试题_java的AOP的面试题_04

更多内容,微信搜一搜:后端开发面试题

3、HASHMAP 的扩容机制是怎样的?

  一般情况下,当元素数量超过阈值时便会触发扩容。每次扩容的容量都是之前容量的2倍。HashMap的容量是有上限的,必须小于1<<30,即1073741824。如果容量超出了这个数,则不再增长,且阈值会被设置为Integer.MAX_VALUE。

JDK7中的扩容机制 :

  空参数的构造函数:以默认容量、默认负载因子、默认阈值初始化数组。内部数组是空数组。 

  有参构造函数:根据参数确定容量、负载因子、阈值等。 

  第一次put时会初始化数组,其容量变为不小于指定容量的2的幂数,然后根据负载因子确定阈值。 
  如果不是第一次扩容,则 新容量=旧容量 x 2 ,新阈值=新容量 x 负载因子 。

JDK8的扩容机制 :

  空参数的构造函数:实例化的HashMap默认内部数组是null,即没有实例化。第一次调用put方法时,则会开始第一次初始化扩容,长度为16。 

  有参构造函数:用于指定容量。会根据指定的正整数找到不小于指定容量的2的幂数,将这个数设置赋值给阈值(threshold)。

  第一次调用put方法时,会将阈值赋值给容量,然后让 阈值 = 容量 x 负载因子。 如果不是第一次扩容,则容量变为原来的2倍,阈值也变为原来的2倍。(容量和阈值都变为原来的2倍时,负载因子还是不变)。

此外还有几个细节需要注意: 

  首次put时,先会触发扩容(算是初始化),然后存入数据,然后判断是否需要扩容; 
  不是首次put,则不再初始化,直接存入数据,然后判断是否需要扩容;

更多内容,微信搜一搜:后端开发面试题

4、ConcurrentHashMap 的存储结构是怎样的?

Java7

  ConcurrnetHashMap 使用的分段锁,也就是每一个 Segment 上同时只有一个线程可以操作,每一个 Segment 都是一个类似 HashMap 数组的结构,它可以扩容,它的冲突会转化为链表。但是 Segment 的个数一但初始化就不能改变,默认 Segment 的个数是 16 个。 

java的AOP的面试题_开发语言_05

Java8

  ConcurrnetHashMap 使用的 Synchronized 锁加 CAS 的机制。结构也由 Java7 中的 Segment 数组 + HashEntry 数组 + 链表 进化成了 Node 数组 + 链表 / 红黑树,Node 是类似于一个 HashEntry 的结构。它的冲突再达到一定大小时会转化成红黑树,在冲突小于一定数量时又退回链表。

java的AOP的面试题_面试_06

更多内容,微信搜一搜:后端开发面试题

5、线程池大小如何设置?

CPU 密集型任务(N+1) 这种任务消耗的主要是 CPU 资源,可以将线程数设置为 N(CPU 核心数)+1,比 CPU 核心数多出来的一个线程是为了防止线程偶发的缺页中断,或者其它原因导致的任务暂停而带来的影响。一旦任务暂停,CPU 就会处于空闲状态,而在这种情况下多出来的一个线程就可以充分利用 CPU 的空闲时间。

I/O 密集型任务(2N) 这种任务应用起来,系统会用大部分的时间来处理 I/O 交互,而线程在处理 I/O 的时间段内不会占用 CPU 来处理,这时就可以将 CPU 交出给其它线程使用。因此在 I/O 密集型任务的应用中,我们可以多配置一些线程,具体的计算方法是 2N。

如何判断是 CPU 密集任务还是 IO 密集任务?

CPU 密集型简单理解就是利用 CPU 计算能力的任务比如你在内存中对大量数据进行排序。单凡涉及到网络读取,文件读取这类都是 IO 密集型,这类任务的特点是 CPU 计算耗费时间相比于等待 IO 操作完成的时间来说很少,大部分时间都花在了等待 IO 操作完成上。

从如下角度分析如何合理配置线程池大小:

任务的性质:CPU密集型任务、IO密集型任务、混合型任务。

任务的优先级:高、中、低。

任务的执行时间:长、中、短。

任务的依赖性:是否依赖其他系统资源,如数据库连接等。

性质不同的任务可以交给不同规模的线程池执行。

估算合理值的公式:

最佳线程数目 = ((线程等待时间+线程CPU时间)/线程CPU时间 )* CPU数目

简化:

最佳线程数目 = (线程等待时间与线程CPU时间之比 + 1)* CPU数目

结论:

线程等待时间所占比例越高,需要越多线程。线程CPU时间所占比例越高,需要越少线程。

更多内容,微信搜一搜:后端开发面试题

6、IO 密集=NCPU*2 是怎么计算出来?
7、G1 收集器有哪些特点?
8、你有哪些手段来排查 OOM 的问题? 
9、请你谈谈 MYSQL 事务隔离级别,MYSQL 的默认隔离级别是什么? 
10、可重复读解决了哪些问题? 
11、对 SQL 慢查询会考虑哪些优化 ? 
12、谈一谈缓存穿透、缓存击穿和缓存雪崩,以及解决办法? 
13、LRU 是什么?如何实现?
14、什么是堆内存?参数如何设置? 
15、栈和队列,举个使用场景例子? 
16、MYSQL 为什么 INNODB 是默认引擎? 
17、MYSQL 索引底层结构为什么使用 B+树? 
18、B+ 树的叶子节点链表是单向还是双向? 
19、MVCC 是什么?它的底层原理是什么? 
20、UNDO LOG 具体怎么回滚事务 ? 
21、如何查询慢 SQL 产生的原因 
22、索引失效的情况有哪些?.
23、一个 REDIS 实例最多能存放多少的 KEYS?LIST、SET、SORTED SET 他们最多能存放多少元素?
24、REDIS 数据结构 压缩列表和跳跃表的区别
25、为什么数据量小的时候用压缩列表 ?
26、REDIS 主从同步是怎么实现的? 
27、REDIS 持久化 RDB 和 AOF 优缺点
28、谈谈自己对于 SPRING AOP 的了解? 
29、 SPRING BEAN 容器的生命周期是什么样的?
30、RABBITMQ 如何保证消息不丢失 ?

更多内容,微信搜一搜:后端开发面试题
【阿里】面试真题:
1、TCP 和 UDP 区别?

1. TCP 基于连接,UDP基于无连接。
2. TCP 要求系统资源较多,UDP较少。
3. UDP 程序结构较简单。
4. TCP 保证数据正确性,UDP可能丢包。
5. TCP 保证数据顺序,UDP不保证。

  TCP/IP协议族为运输层指明了两个协议:TCP和UDP,它们都是作为应同程序和网络操作的中介物。

✱ TCP协议全称是传输控制协议是一种面向连接的、可靠的、基于字节流的传输层通信协议,由IETF的RFC793定义。TCP是面向连接的、可靠的流协议。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。

✱ UDP协议全称是用户数据报协议,在网络中它与TCP协议一样用于处理数据包,是一种无连接的协议。在OSI模型中,在第四层——传输层,处于IP协议的上一层。UDP有不提供数据包分组、组装和不能对数据包进行排序的缺点。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。

java的AOP的面试题_后端_07

更多内容,微信搜一搜:后端开发面试题

2、TCP/IP 协议涉及哪几层架构? 
3、描述下 TCP 连接4次挥手的过程?为什么要4次挥手? 
4、计算机插上电源操作系统做了什么?
5、LINUX 操作系统设备文件有哪些?.
6、多线程同步有哪些方法?
7、一个对象的两个方法加 SYNCHRONIZED,一个线程进去 SLEEP,另一个线程可以进入到另一个方法吗?
8、什么是可重入锁(REENTRANTLOCK)?
9、创建线程的三个方法是什么?
10、JAVA 怎么获取多线程的返回值?
11、线程池有哪几种创建方式?
12、线程池参数有哪些?
13、线程池拒绝策略有哪些?
14、你认为对线程池的核心参数实现自定义可配置,三个核心参数是?
15、THREADPOOLEXECUTOR 线程池,COREPOOLSIZE=5, MAXIMUMPOOLSIZE=10,QUEUECAPACITY=10,有20个耗时任务 交给这个线程池执行,线程池会如何执行这20个任务?
16、给用户发消息任务超出队列,你用哪个拒绝策略?有其他方法吗 ?
17、JAVA8 新特性有哪些了解?
18、什么时候用多线程、为什么要设计多线程? 
19、多线程越多效率越高吗?
20、多线程会产生哪些并发问题 ?
21、MYBATIS 如何将对象转换成 SQL? 
22、虚拟内存是什么,虚拟内存的原理是什么? 
23、栈会溢出吗?什么时候溢出?方法区会溢出吗? 
24、JVM 如何加载类的?
25、自己写过 STRING 类能加载吗,之前的 STRING 是什么时候加载进去的? 
26、描述 THREADLOCAL(线程本地变量)的底层实现原理及常用场景? 
27、什么是微服务架构? 
28、微服务有哪些特点? 
29、LAMBDA 表达式是啥?优缺点?
30、讲一下 LAMBDA 的表达式作用域(LAMBDA SCOPES)。 
31、MYSQL 事务的特性有什么,说一下分别是什么意思?

更多内容,微信搜一搜:后端开发面试题
【京东】面试真题:
1、哪些情况下的对象会被垃圾回收机制处理掉?

利用可达性分析算法,虚拟机会将一些对象定义为GCRoots,从GCRoots出发沿着引用链 向下寻找,如果某个对象不能通过GCRoots寻找到,虚拟机就认为该对象可以被回收掉。

哪些对象可以被看做是GCRoots呢?

1)虚拟机栈(栈帧中的本地变量表)中引用的对象;

2)方法区中的类静态属性引用的对象,常量引用的对象;

3)本地方法栈中JNI(Native方法)引用的对象;

对象不可达,一定会被垃圾收集器回收么?

即使不可达,对象也不一定会被垃圾收集器回收,
1)先判断对象是否有必要执行finalize()方法,对象必须重写finalize()方法且没有被运行过。
2)若有必要执行,会把对象放到一个 队列中,JVM会开一个线程去回收它们,这是对象最后一次可以逃逸清理的机会。

2、讲一下常见编码方式?

一、什么是编码:

编码是从一种形式或格式转换为另一种形式的过程也称为计算机编程语言的代码简称编码。计算机中存储信息的最小单元是一个字节,即8个bit。

二、编码的意义 
计算机中存储的最小单元是一个字节即8bit,所能表示的字符范围是255个, 而人类要表示的符号太多,无法用一个字节来完全表示,固需要将符号编码,将各种语言翻 译成计算机能懂的语言。 

三、常见编码方式

ASCII码:总共128个,用一个字节的低7位表示,0〜31控制字符如换回车删除等;32~126是打印字符,可通过键盘输入并显示出来;

ISO-8859-1用来扩展ASCII编码,256个字符,涵盖了大多数西欧语言字符。

GB2312: 双字节编码,总编码范围是A1-A7,A1-A9是符号区,包含682个字符,B0-B7是 汉字区,包含6763个汉字;

GBK 为了扩展GB2312,加入了更多的汉字,编码范围是8140~FEFE,有23940个码位,能 表示21003个汉字。

UTF-16: ISO试图想创建一个全新的超语言字典,世界上所有语言都可通过这本字典Unicode来相互翻译,而UTF-16定义了Unicode字符在计算机中存取方法,用两个字节来表 示Unicode转化格式。不论什么字符都可用两字节表示,即16bit,固叫UTF-16。

UTF-8UTF-16统一采用两字节表示一个字符,但有些字符只用一个字节就可表示,浪 费存储空间,而UTF-8采用一种变长技术,每个编码区域有不同的字码长度。 不同类型的 字 符 可 以 由1~6个字节组成。

更多内容,微信搜一搜:后端开发面试题

3、UTF-8 编码中的中文占几个字节;INT 型几个字节? 
4、静态代理和动态代理的区别,什么场景使用? 
5、简述下 JAVA 的异常体系。
6、谈谈你对解析与分派的认识。
7、修改对象 A 的 EQUALS 方法的签名,那么使用 HASHMAP 存放这个对象实例的时候,会用哪个 EQUALS 方法?
8、JAVA 中实现多态的机制是什么?
9、如何将一个 JAVA 对象序列化到文件里?
10、说说你对 JAVA 反射的理解。
11、说说你对 JAVA 注解的理解。
12、说一下泛型原理,并举例说明。 
13、谈谈你对 JAVA 中 STRING 的了解。
14、STRING 为什么要设计成不可变的? 
15、REDIS 常见的几种数据结构说一下?各自的使用场景? 
16、谈一谈缓存穿透、缓存击穿和缓存雪崩,以及各自的解决方案? 
17、讲下 KAFKA、RABBITMQ、ROCKETMQ 之间的区别是什么? 
18、KAFKA 的架构说一下? 
19、KAFKA 怎么保证消息是有序的?
20、KAFKA 怎么保证消息不丢失?
21、KAFKA 怎么解决重复消费?
22、介绍下 MYSQL 聚簇索引与非聚簇索引的区别(INNODB 与 MYISAM 引擎)?
23、然后给一个联合索引(A,B)和一个语句,SELECT * FROM TABLE WHERE B = 'XXX',判断是否能命中索引?为什么?
24、JAVA 多线程有哪几种实现方式?
25、用过 CONCURRENTHASHMAP,讲一下他和 HASHTABLE 的不同之处?
26、JAVA 怎么实现线程安全?
27、描述 THREADLOCAL(线程本地变量)的底层实现原理及常用场景。
28、介绍下 SPRING BEAN 都有哪些作用域 ?
29、注解 @AUTOWIRED 和 @RESOURCE 有什么区别?
30、RPC 的实现基础?
31、CMS,G1 垃圾回收器中的三色标记了解吗?

更多内容,微信搜一搜:后端开发面试题
【腾讯】面试真题:
1、KAFKA 是什么?主要应用场景有哪些?

Kafka 是一个分布式流式处理平台。 流平台具有三个关键功能:

1、消息队列:发布和订阅消息流,这个功能类似于消息队列,这也是 Kafka 也被归类为消息队列的原因。

2、容错的持久方式存储记录消息流: Kafka 会把消息持久化到磁盘,有效避免了消息丢失的风险。

3、流式处理平台: 在消息发布的时候进行处理,Kafka 提供了一个完整的流式处理类库。

Kafka 主要有两大应用场景:
 ✱ 消息队列 :建立实时流数据管道,以可靠地在系统或应用程序之间获取数据。
 ✱ 数据处理: 构建实时的流数据处理程序来转换或处理数据流。

java的AOP的面试题_后端_08

更多内容,微信搜一搜:后端开发面试题
2、KAFKA 为什么有 TOPIC 还要用 PATITION?
3、客户端和服务器之间最多能建立多少个连接 ?
4、HASHMAP 结构,线程不安全举个例子?
5、MYSQL 索引分类?
6、了解线程 & 进程的区别吗?
7、JAVA 进程间的几种通信方式?
8、多台服务器同时对一个数据定时任务,怎么处理 ?
9、常见分布式锁的几种实现方式?
10、REDIS 分布式锁实现原理?
11、REDIS 的数据类型及它们的使用场景?
12、信号量与信号的区别?
13、SELECT 和 EPOLL 的底层结构是什么原理
14、场景题:1 亿个数据取出最大前100个有什么方法?
15、KAFKA 如何保证消息可靠?
16、消息队列的使用场景?
17、乐观锁和悲观锁的理解及如何实现,有哪些实现方式?
18、ARRAYLIST 和 LINKEDLIST 的区别在哪里?
19、谈谈你对 SQL 注入式攻击的理解?
20、数据库事务的特性?
21、REDIS 如何做内存优化?
22、缓存穿透,缓存击穿,缓存雪崩都是咋回事?解决办法?
23、数组和链表的区别?当数组内存过大时会出现什么问题?链表增删过多会出现的什么问题? 
24、常见排序算法和分别的复杂度?
25、JDK 1.8的 JVM 内存划分模型 ,堆和栈的区别
26、简单描述 MYSQL 中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)?
27、I/O 模型有哪几种?
28、当你用浏览器打开一个链接的时候,计算机做了哪些工作步骤? 
29、虚拟 DOM 的优劣如何?
30、幻读是什么,用什么隔离级别可以防止幻读?

【百度】面试真题:
1、SPINGBOOT 也有定时任务?是什么注解?

在 SpringBoot 中使用定时任务主要有两种不同的方式:
 ✱ Spring 中的 @Scheduled注解;
 ✱ 第三方框架 Quartz;

使用 Spring 中的 @Scheduled的方式主要通过 @Scheduled注解来实现。

使用 Quartz ,则按照 Quartz 的方式,定义 Job 和 Trigger 即可。

更多内容,微信搜一搜:后端开发面试题
2、请描述线程的生命周期,它们之间如何切换?
3、什么情况线程会进入 WAITING 状态?
4、简述多进程开发中 JOIN 和 DEAMON 的区别?
5、异步和同步、阻塞和非阻塞之间的区别?
6、为什么要分内核态和用户态?
7、说下类加载器与类加载?加载的类信息放在哪个区域?
8、UDP 协议和 TCP 协议的区别?
9、LIMIT 1000000 加载很慢的话,你是怎么解决的呢?
10、MYSQL 的索引分类是什么?
11、什么是散列表? SELECT * 和SELECT 1?
12、MYSQL 的主从复制了解吗?
13、SPRING 框架事务注解用什么注解?使用该注解的失效场景?
14、FINAL、FINALLY、FINALLIZE?FINALLY 是在 RETURN 之前执行还是之后?FINALLY 块里的代码一定会执行吗?
15、I/O 多路复用实现方式有哪些?
16、SELECT、POLL、EPOLL 区别有哪些?
17、哈希算法解决哈希冲突方式有哪些?
18、如何保证 REDIS 中的数据不丢失?
19、如何保证 REDIS 中的数据都是热点数据?
20、REDIS 持久化机制是如何做的?
21、REDIS 为什么在使用 RDB 进行快照时会通过子进程的方式进行实现?
22、介绍下 MYSQL 的主从复制原理?产生主从延迟的原因?
23、父进程如果宕掉,子进程会怎样?
24、孤儿进程和僵尸进程有什么区别?
25、MYSQL 中有哪几种锁?
26、互斥锁(MUTEX)和自旋锁(SPINLOCK)分别在什么场景使用?
27、描述 SYNCHRONIZED、REENTRANTLOCK 的区别 ?
28、HASHMAP 扩容操作是怎么实现的?
29、CONCURRENTHASHMAP 1.7与1.8区别?
30、如何使用 JAVA 的反射?

 【华为】面试真题:
1、JAVA 常用集合及特点?

1. List:
 ✱ ArrayList、LinkedList、Vector、Stack
 ✱ Set:LinkedSet、HashSet、TreeSet
 ✱ Queue->Deque->LinkedList。

2. Map:
 ✱ HashMap、LinkedHashMap、TreeMap
 ✱ Dictionary->HashTable->Properties。

Vector 底层数据结构是数组,查询快,增删慢,线程安全,效率低,默认长度为10,超过会100%延长,变成20,浪费空间。

ArrayList 基于数组,便于按 index 访问,超过数组需要扩容,扩容成本较高。

LinkedList使用链表实现,无需扩容。

HashSet底层数据结构是哈希表(无序,唯一),通过hashcode()和equals()保证元素唯一。

LinkedHashSet 底层数据结构是链表和哈希表(FIFO插入有序,唯一),由链表保证元素有序,由哈希表保证元素唯一。

TreeSet底层数据结构是红黑树(唯一,有序),通过自然排序和比较器排序保证元素有序,根据比较返回值是否是0来保证元素唯一性。

TreeMap是有序的。

HashMap 空间换时间,哈希冲突不大的情况下查找数据性能很高。

LinkedHashMap 基本特点:继承自 HashMap,对 Entry 集合添加了一个双向链表。

java的AOP的面试题_面试_09

更多内容,微信搜一搜:后端开发面试题
2、开启一个线程的方法?
3、JAVA 面向对象包括哪些特性,怎么理解的?
4、JAVA 如何保证线程安全?
5、介绍 SPRING MVC 的工作流程 ?
6、SPRING 框架中用到了哪些设计模式?
7、REDIS 的特点是什么?
8、为什么使用 REDIS,有什么好处?
9、REDIS 雪崩和击穿了解吗?
10、什么是面向对象,谈谈你的理解?
11、访问数据库除了 JDBC 还有什么?
12、你知道有哪些设计原则?
13、在生产环境 LINUX服务器上,发现某台运行JAVA服务的服务器的CPU100%,不借助任何可视化工具,怎么进行问题的定位?
14、JDK 里面带的工具你知道哪些?
15、基本数据类型 BIT 长度?
16、CHAR 能不能存中文? .....
17、谈谈你对泛型的理解?
18、JAVA 程序是怎样运行的?
19、GC ROOT 有哪些?
20、栈帧的大小什么时候确定?
21、静态 FILED 声明和构造器哪个先执行?
22、线程创建方式是什么?
23、传统 I/O 跟 NIO 的区别?
24、消息队列的在各种场景下如何选型?
25、JAVA 的安全性体现在哪里?
26、STATIC 方法怎么访问非 STATIC 变量?
27、讲下你理解的 JAVA 多继承?
28、JAVA 基本类型有哪些?
29、线程池如果满了会怎么样?
30、什么是双亲委派机制,它有什么作用?

✱ 双亲委派机制的意思是除了顶层的启动类加载器以外,其余的类加载器,在加载之前,都会委派给它的父加载器进行加载。这样一层层向上传递,直到祖先们都无法胜任,它才会真正的加载。

✱ 通过带有优先级的层级关可以避免类的重复加载; 保证 Java 程序安全稳定运行,Java 核心 API 定义类型不会被随意替换。

一、双亲委派机制 Parent Delegation Model,又称为父级委托模型。其实是当某个类加载器需要加载某个.class文件的时候,它首先会把这个任务委托给他的上级类加载器,去递归这个操作,如果说上级的类加载器没有去加载,自己才会去加载这个类的。

java的AOP的面试题_面试_10

二、类加载器

✱ BootstrapClassLoader(启动类加载器): c++编写,加载java核心库 java.*,构造ExtClassLoader和AppClassLoader。由于引导类加载器涉及到虚拟机本地实现细节,开发者无法直接获取到启动类加载器的引用,所以不允许直接通过引用进行操作。

✱ ExtClassLoader (标准扩展类加载器): java编写,加载扩展库,如classpath中的jre ,javax.*或者java.ext.dir 指定位置中的类,开发者可以直接使用标准扩展类加载器。

✱ AppClassLoader(系统类加载器): java编写,加载程序所在的目录,如user.dir所在的位置的class

✱ CustomClassLoader(用户自定义类加载器): java编写,用户自定义的类加载器,可加载指定路径的class文件

三、双亲委派机制的作用:

✱ 保证安全性,层级关系代表优先级,也就是所有类的加载,优先给启动类加载器,这样就保证了核心类库类。

✱ 避免重复,如果父类加载器加载过了,子类加载器就没有必要再去加载了。