1 |
基础知识 |
HashMap和TreeMap区别 |
HashMap:①数组加链表方式存储key/value, ②线程非安全,③允许null作为key和value,④key不可以重复,value允许重复,⑤不保证元素迭代顺序是按照插入时的顺序; TreeMap:①基于红黑树,②线程非安全,③不允许null作为key,④key不可以重复,value允许重复,⑤存入TreeMap的元素应当实现Comparable接口或者实现Comparator接口才能按照排序后的顺序遍历元素 |
A.精通:分别说出HashMap和TreeMap的①②③④⑤,且在此基础上知道在什么情况下hashMap扩容(元素个数>阈值 乘以 加载因子) B.熟练:分别说出HashMap和TreeMap的①②③④⑤ C.了解:分别说出HashMap和TreeMap的①②⑤ D.仅听说过,①②回答不上来,没用过 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
2 |
基础知识 |
HashSet有什么功能,基于哪个类实现? |
①有去重的功能,也就是元素不重复;②基于HashMap实现 |
A.精通:①②,且在此基础上知道在什么情况下HashSet扩容(元素个数>阈值16 乘以 加载因子0.75) B.熟练:①② C.了解:① D.未涉及:仅听说过,①②回答不上来,没用过 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
3 |
基础知识 |
ConcurrentHashMap并发能力为什么好于Hashtable |
①Hashtable是通过对hash表整体进行锁定,是阻塞式的,当一个线程占有这个锁时,其他线程必须阻塞等待其释放锁 而ConcurrentHashMap是如下实现: ②jdk1.6的实现:ConcurrentHashMap是采用Segment分段锁的方式,它并没有对整个数据结构进行锁定,而是局部锁定, ③jdk1.8的实现: 采用一种乐观锁CAS算法来实现同步问题,但其底层还是“数组+链表->红黑树”的实现 |
A.精通:①②③,且在此基础上知道获取数据时不加锁,通过volatile实现 B.熟练:任意2个及以上 C.了解:① D.未涉及:①②③回答不上来,没用过 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
4 |
基础知识 |
Java中 元注解有哪些,并分别说一下作用 |
元注解是指注解的注解,Java中有: ① @Retention: 定义注解的保留策略 ② @Target:定义注解的作用目标 ③ @Document:说明该注解将被包含在javadoc中 ④ @Inherited:说明子类可以继承父类中的该注解 |
A.精通:①②③④,每项文字描述部分大意相同,且使用过 B.熟练:任意2个及以上,且文字描述部分大意相同 C.了解:任意1个 D.未涉及:不知道元注解的概念(元注解是指注解的注解) |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
5 |
基础知识 |
JDK动态代理的用法是什么? |
使用Proxy和InvocationHandler两个类,并实现invoke方法 |
A.精通:必须回答出Proxy和InvocationHandler两个类和实现invoke方法 B.熟练:必须回答出Proxy和InvocationHandler两个类 C.了解:任意1个类 D.未涉及:两个类都回答不上来 |
C.了解:能够明确阐述部分知识点,少许内容细节上略有模糊 |
6 |
IO/NIO |
IO与NIO的主要区别是什么 |
① IO是面向流的,NIO是面向缓冲区的 ② IO是阻塞的,NIO是非阻塞的 ③ IO无Selector,NIO需要Selector |
A.精通:①②③ B:熟练:任意2个 C:了解:任意1个 D:未涉及:不了解NIO |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
7 |
多线程 |
什么是用户线程和守护线程,两者有什么区别?举例说出一个jvm中守护线程的例子 |
① 用户线程即运行在前台的线程,而守护线程是运行在后台的线程。 ②守护线程作用是为其他前台线程的运行提供便利服务,而且仅在普通、非守护线程仍然运行时才需要,③比如垃圾回收线程就是一个守护线程 |
A.精通:①②③ B:熟练:(①或②)和③ C:了解:任意1个 D:未涉及:不了解其概念 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
8 |
多线程 |
分别说一下JDK线程池的参数意思 |
参数如下: ① corePoolSize,线程池里最小线程数 ② maximumPoolSize,线程池里最大线程数量,超过最大线程时候会使用RejectedExecutionHandler ③ keepAliveTime,线程最大的存活时间 ④ workerQueue,缓存异步任务的队列 ⑤ threadFactory,用来构造线程池里的worker线程 |
A.精通:①②③④⑤ B:熟练:任意3个及以上 C:了解:任意2个 D:未涉及:1个以下 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
9 |
多线程 |
java有哪些可重入锁 |
概念:同一线程可多次获取在同一对象上的锁 ①ReentrantLock ②Synchronized |
A.精通:能回答出概念和①②,且在此基础上知道ReentrantLock是基于AQS实现的,分为公平锁和非公平锁,Synchronized是非公平锁 B:熟练:能回答出概念和①② C:了解:任意1个 D:未涉及:回答不出来①②,也不知道重入锁的概念(同一线程可多次获取在同一对象上的锁) |
C.了解:能够明确阐述部分知识点,少许内容细节上略有模糊 |
10 |
多线程 |
什么是CAS操作? |
①CAS是英文单词CompareAndSwap的缩写,中文意思是:比较并替换。②CAS指令执行时,当且仅当旧值与预期值A相等时,才可以把值修改为B,否则就什么都不做。②整个比较并替换的操作是一个原子操作,通过硬件指令支持 |
A.精通:①②③ B:熟练:(①或③)和② C:了解:除②以外 D:未涉及:不知道概念(第①个) |
C.了解:能够明确阐述部分知识点,少许内容细节上略有模糊 |
11 |
多线程 |
volatile具有什么特性以及是否具有原子性? |
volatile具有①可见性、②有序性(禁止指令重排),③ 但不具备原子性 |
A.精通:①②③,且在此基础上如果提到“内存屏障”或Load、Store指令 B:熟练:①②③ C:了解:除②以外 D:未涉及:不知道概念(第①个) |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
12 |
JVM |
什么是双亲委派,有什么好处? |
①向上委托给父类加载,父类加载不了,再自己加载。②好处是避免重复加载和篡改核心API。 例子:java.lang.string |
A.精通:①②,且在此基础上知道应用程序类加载器Application ClassLoader、扩展类加载器Extension ClassLoader、启动类加载器Bootstrap ClassLoader间按顺序逐级委托 B:熟练:①② C:了解:任意1个 D:未涉及:不知道概念(第①个) |
C.了解:能够明确阐述部分知识点,少许内容细节上略有模糊 |
13 |
Spring框架 |
基于xml配置的spring bean,如果要使用@Autowired注解,需要在xml配置中写上什么标签? |
①context:annotation-config/或②context:component-scan/ |
A.精通:①② B:熟练:任意1个 C:了解:无 D:未涉及:无 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
14 |
Spring框架 |
基于xml配置的spring bean,如果要使用@Controller注解,需要在xml配置写上什么标签? |
mvc:annotation-driven/ |
A.精通:能回答上来 B:熟练:能回答上来 C:了解:无 D:未涉及:无 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
15 |
Spring框架 |
如何强制Spring AOP使用CGLIB实现? |
①添加cglib库,如果是基于xml配置spring,在spring配置文件中加入;②如果是基于Springboot,则使用EnableAspectJAutoProxy(ProxyTargetClass=true) |
A.精通:①② B:熟练:任意1个 C:了解:无 D:未涉及:无 |
A.精通:全面覆盖知识点,不仅阐述技术概念、作用,且熟知原理、细节,基于考点有扩展和外延的表述 |
16 |
Spring框架 |
用什么注解能控制Spring中2个bean的初始化顺序 |
① @DependOn;② @Order |
A.精通:①② B:熟练:至少能答出② C:了解:任意一个 D:未涉及:无 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
17 |
mybatis框架 |
#{}和${}的区别是什么? |
① #{}:是预编译处理。 ② ${}:是字符串替换。 ③ 使用#{}可以有效的防止SQL注入,提高系统的安全性 |
A.精通:①②③,且在此基础上答出#{}是利用JDBC的PreparedStatement 进行预编译处理 B:熟练:①②③ C:了解:任意一个 D:未涉及:无 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
18 |
Dubbo |
Dubbo中zookeeper做注册中心,如果注册中心集群都挂掉,服务之间还能通信么? |
可以的,启动dubbo时,消费者会从zk拉取注册的服务地址接口等数据,缓存在本地。每次调用时,按照本地存储的地址进行调用 |
A.精通:能够回答出左侧内容,且知道服务有变更时无法同步,会产生错误,知道至少3个zk服务可以组成一个集群 B:熟练:能够回答出,大体意思相同 C:了解:知道在本地有缓存,服务间能通信 D:未涉及:没用过 |
C.了解:能够明确阐述部分知识点,少许内容细节上略有模糊 |
19 |
缓存 |
Redis有哪些数据类型 |
① string ② list ③ set ④ sorted set ⑤ hash 使用场景参考如下: string,用作计数器,统计在线人数等等,可以存储二进制数据如使用它来存储图片等。 hash,存放键值对,一般可以用来存某个对象的基本属性信息,例如,用户信息,商品信息等 list,列表类型,可以用于实现消息队列,也可以使用它提供的range命令,做分页查询功能。 set,可以用作去重功能,例如用户名不能重复等,另外,还可以对集合进行交集,并集操作,来查找某些元素的共同点 |
A.精通:①②③④⑤,且在此基础上知道每种类型的应用场景和每种类型都是基于c++数据结构的redisObject 结构体来描述的 B:熟练:①②③④⑤,且在此基础上知道两种数据结构的使用场景,比如list能用于消息队列、分页查询;string用于计数统计、缓存session C:了解:任意2个 D:未涉及:无 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
20 |
缓存 |
使用过哪些消息队列? |
①Kafka ②RocketMQ ③RabbitMQ ④ActiveMQ |
A.精通:①②③④ B:熟练:任意3个 C:了解:任意一个 D:未涉及:没用过 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
21 |
分布式 |
分布式锁的常用解决方案有哪些? |
常见实现方案有: 1,基于Redis实现; 2,基于ZooKeeper实现,; 3,基于数据库实现 |
A.精通:①②③ B:熟练:①② C:了解:任意一个 D:未涉及:无 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
22 |
分布式 |
什么是幂等性? |
幂等性是指同一个操作无论请求多少次,其结果都相同 解决方案参考如下(DB代表数据库): ① DB唯一索引,防止新增脏数据 ② DB 查询操作 ③ DB 删除操作 ④ DB 悲观锁④⑤ ⑤ DB 乐观锁 ⑥ 缓存token机制,防止页面重复提交 ⑦ 分布式锁 |
A.精通:能说出概念及5种以上解决方案 B:熟练:能说出概念及2种以上解决方案, C:了解:能说出概念 D:未涉及:不知道概念 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
23 |
Mysql数据库 Spring中的隔离级别: |
事物的4种隔离级别 Spring中的隔离级别: |
① 读未提交(RU) ② 读已提交(RC) ③ 可重复读(RR) ④ 串行化(Serializable) |
A.精通:①②③④,且在此基础上能说出Mysql事务隔离是通过mvcc(多版本控制)来实现的,Mysql可重复读也能避免幻读 B:熟练:①②③④ C:了解:任意2个 D:未涉及:不了解 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
24 |
Mysql数据库 |
举例说明什么是最左前缀原则 |
当创建(a,b,c)复合索引时,想要索引生效的话,只能使用 a 和 a,b 和 a,b,c三种组合 |
A.精通:无 B:熟练:大意相同即可 C:了解:无 D:未涉及:不知道概念 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
25 |
Mysql数据库 |
什么是覆盖索引 |
select的数据列仅从索引中就能够取得并且不必从数据表中读取,换句话说查询列要被所使用的索引覆盖。 例子:如以country表a(表示城市)、b(表示省)两列做复合索引,select a from country where b=’浙江省’ |
A.精通:大意相同且能举例说明 B:熟练:大意相同即可 C:了解:无 D:未涉及:不知道概念 |
B.熟练:达到预期覆盖度,阐述技术概念、作用,有运用经验 |
26 |
Spring注解 |
@Autowired |
当使用@Autowied、@Resource时注解是会自动查找Bean,并装配给该对象的属性,再使用@Autowired时, 首先在容器中查询对应的Bean, 如查到一个就将该Bean装配给autowired指定的数据 如查到多个那么@Autowired会根据名称来查找; 如没有查到,那么会抛出异常。解决方法时,使用required=false。 |
@Autowired可用于:构造函数、成员变量、Setter方法 |
|
Spring注解 |
@Autowired和@Resource之间的区别 |
(1) 、Autowired 是spring提供的 Resource是jdk提供的 (2)、@Autowired默认是按照类型装配注入的,默认情况下它要求依赖对象必须存在(可以设置它required属性为false)查找不到再根据名称查找。 先byType 再byName @Resource默认是按照名称来装配注入的,只有当找不到与名称匹配的bean才会按照类型来装配注入。先byName再byType |
|
|
|
jdk |
JVM、JRE、JDK之间的关系 三者的关系 JDK=JRE+其他 JRE=JVM+其他 |
JDK(java development kit)JDK是Java开发工具包,是整个Java的核心,包括了Java运行环境JRE、Java工具和Java基础类库。JRE(java runtime environment)JRE是Java的运行环境,包括JVM标准实现及Java核心类库。JVM(java virtual machine)JVM是java虚拟机,是整个java实现跨平台的最核心的部分,能够运行以Java语言写作的软件程序。 |
jdk是JAVA程序开发时用的开发工具包,其内部也有JRE运行环境JRE。JRE是JAVA程序运行时需要的运行环境,就是说如果你光是运行JAVA程序而不是去搞开发的话,只安装JRE就能运行已经存在的JAVA程序了。JDk、JRE内部都包含JAVA虚拟机JVM,JAVA虚拟机内部包含许多应用程序的类的解释器和类加载器等等。 |
|
|
jvm |
jvm主要包括什么 |
1、类加载库 2、执行引擎 3、内存区 4、本地库接口 |
|
|
|
Spring |
在Spring框架xml配置中共有5种自动装配: |
(1)no:默认的方式是不进行自动装配的,通过手工设置ref属性来进行装配bean。 (2)byName:通过bean的名称进行自动装配,如果一个bean的 property 与另一bean 的name 相同,就进行自动装配。 (3)byType:通过参数的数据类型进行自动装配。 (4)constructor:利用构造函数进行装配,并且构造函数的参数通过byType进行装配。 (5)autodetect:自动探测,如果有构造方法,通过 construct的方式自动装配,否则使用 byType的方式自动装配。 |
1、默认不自动装配,可以手动通过ref属性来进行装配 2、通过名称 3、通过类型 4、通过构造器 5、自动探测 |
|
|
Spring |
Spring 框架中都用到了哪些设计模式 |
(1)工厂模式:BeanFactory就是简单工厂模式的体现,用来创建对象的实例; (2)单例模式:Bean默认为单例模式。 (3)代理模式:Spring的AOP功能用到了JDK的动态代理和CGLIB字节码生成技术; (4)模板方法:用来解决代码重复的问题。比如. RestTemplate, JmsTemplate, JpaTemplate。 (5)观察者模式:定义对象键一种一对多的依赖关系,当一个对象的状态发生改变时,所有依赖于它的对象都会得到通知被制动更新,如Spring中listener的实现–ApplicationListener。 |
(1)工厂模式 (2)单例模式 (3)代理模式 (4)模板方法 (5)观察者模式 |
|
|
Spring |
Spring事务的实现方式和实现原理: |
Spring事务的本质其实就是数据库对事务的支持,没有数据库的事务支持,spring是无法提供事务功能的。真正的数据库层的事务提交和回滚是通过binlog或者redo log实现的。 |
|
|
|
Spring事务的种类 |
spring支持编程式事务管理和声明式事务管理两种方式: |
①编程式事务管理使用TransactionTemplate。 ②声明式事务管理建立在AOP之上的。其本质是通过AOP功能,对方法前后进行拦截,将事务处理的功能编织到拦截的方法中,也就是在目标方法开始之前加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。 @Transactional |
1、声明式事务最大的优点就是不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明或通过@Transactional注解的方式,便可以将事务规则应用到业务逻辑中。 2、声明式事务管理要优于编程式事务管理,这正是spring倡导的非侵入式的开发方式,使业务代码不受污染,只要加上注解就可以获得完全的事务支持。唯一不足地方是,最细粒度只能作用到方法级别,无法做到像编程式事务那样可以作用到代码块级别。 |
|
|
Spring |
解释Spring支持的几种bean的作用域 |
(1)singleton:默认,每个容器中只有一个bean的实例,单例的模式由BeanFactory自身来维护。 (2)prototype:为每一个bean请求提供一个实例。 (3)request:为每一个网络请求创建一个实例,在请求完成以后,bean会失效并被垃圾回收器回收。 (4)session:与request范围类似,确保每个session中有一个bean的实例,在session过期后,bean会随之失效。 (5)global-session:全局作用域,global-session和Portlet应用相关。当你的应用部署在Portlet容器中工作时,它包含很多portlet。如果你想要声明让所有的portlet共用全局的存储变量的话,那么这全局变量需要存储在global-session中。全局作用域与Servlet中的session作用域效果相同。 |
(1)singleton:默认 (2)prototype (3)request (4)session (5)global-session: |
|
|
Spring |
Spring框架中的单例Beans是线程安全的么 |
Spring框架并没有对单例bean进行任何多线程的封装处理。关于单例bean的线程安全和并发问题需要开发者自行去搞定。但实际上,大部分的Spring bean并没有可变的状态(比如Serview类和DAO类),所以在某种程度上说Spring的单例bean是线程安全的。如果你的bean有多种状态的话(比如 View Model 对象),就需要自行保证线程安全。最浅显的解决办法就是将多态bean的作用域由“singleton”变更为“prototype”。 |
|
|
|
Spring |
Spring如何处理线程并发问题 |
在一般情况下,只有无状态的Bean才可以在多线程环境下共享,在Spring中,绝大部分Bean都可以声明为singleton作用域,因为Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。 ThreadLocal和线程同步机制都是为了解决多线程中相同变量的访问冲突问题。同步机制采用了“时间换空间”的方式,仅提供一份变量,不同的线程在访问前需要获取锁,没获得锁的线程则需要排队。而ThreadLocal采用了“空间换时间”的方式。 ThreadLocal会为每一个线程提供一个独立的变量副本,从而隔离了多个线程对数据的访问冲突。因为每一个线程都拥有自己的变量副本,从而也就没有必要对该变量进行同步了。ThreadLocal提供了线程安全的共享对象,在编写多线程代码时,可以把不安全的变量封装进ThreadLocal |
Spring对一些Bean中非线程安全状态采用ThreadLocal进行处理,解决线程安全问题。 |
|
|
Spring |
Spring基于xml注入bean的几种方式 |
(1)Set方法注入; (2)构造器注入:①通过index设置参数的位置;②通过type设置参数类型; (3)静态工厂注入; (4)实例工厂; |
(1)Set方法注入; (2)构造器注入:①通过index设置参数的位置;②通过type设置参数类型; (3)工厂注入; |
|
|
Spring 事务传播行为 |
事务传播行为(propagation behavior)指的就是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行。 例如:methodA事务方法调用methodB事务方法时,methodB是继续在调用者methodA的事务中运行呢,还是为自己开启一个新事务运行,这就是由methodB的事务传播行为决定的。 |
支持当前事务的情况:TransactionDefinition.PROPAGATION_REQUIRED: 如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。 TransactionDefinition.PROPAGATION_SUPPORTS: 如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。 TransactionDefinition.PROPAGATION_MANDATORY: 如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。(mandatory:强制性)不支持当前事务的情况:TransactionDefinition.PROPAGATION_REQUIRES_NEW: 创建一个新的事务,如果当前存在事务,则把当前事务挂起。 TransactionDefinition.PROPAGATION_NOT_SUPPORTED: 以非事务方式运行,如果当前存在事务,则把当前事务挂起。 TransactionDefinition.PROPAGATION_NEVER: 以非事务方式运行,如果当前存在事务,则抛出异常。其他情况:TransactionDefinition.PROPAGATION_NESTED: 如果当前存在事务,则创建一个事务作为当前事务的嵌套事务来运行;如果当前没有事务,则该取值等价于TransactionDefinition.PROPAGATION_REQUIRED。 |
1、Require:支持当前事务,如果没有事务,就建一个新的,这是最常见的; 2、Supports:支持当前事务,如果当前没有事务,就以非事务方式执行; 3、Mandatory:支持当前事务,如果当前没有事务,就抛出异常; 4、RequiresNew:新建事务,如果当前存在事务,把当前事务挂起; 5、NotSupported:以非事务方式执行操作,如果当前存在事务,就把事务挂起; 6、Never:以非事务方式执行,如果当前存在事务,则抛出异常。 7、Nested:新建事务,如果当前存在事务,把当前事务挂起。与RequireNew的区别是与父事务相关,且有一个savepoint。 |
|
|
StringBuffer与StringBuilder的区别 |
StringBuffer与StringBuilder的不同之处 |
1、在单线程程序下,StringBuilder效率更快,因为它不需要加锁,不具备多线程安全,StringBuilder 没有被synchronized 修饰 2、StringBuilder:线程非安全的,StringBuffer:线程安全的 1、在单线程程序下,StringBuffer 则每次都需要判断锁答,效率相对更低。 synchronized 关键字进行修饰 2、StringBuffer:线程安全的 共同点: StringBuffer与StringBuilder,他们是字符串变量,是可改变的对象,String是被final修饰的,是常量字符串 |
1.如果要操作少量的数据用 = String 2.单线程操作字符串缓冲区 下操作大量数据 = StringBuilder 3.多线程操作字符串缓冲区 下操作大量数据 = StringBuffer |
|
|
redis |
redis两个核心aof和rdb |
1、aof文件比rdb更新频率高,优先使用aof还原数据(还原) 2、aof比rdb更安全也更大 3、rdb性能比aof好 4、如果两个都配了优先加载AOF(还原数据) 5、持久化RDB是Redis默认的持久化方式。 按照一定的时间周期策略把内存的数据以快照的形式保存到硬盘的二进制文件 |
|
|
|