1. 有没有有顺序的Map实现类,如果有,他们是怎么保证有序的?
TreeMap和LinkedHashmap都是有序的。(TreeMap默认是key升序(字典排序)),LinkedHashmap默认是数据插入顺序)
TreeMap是基于比较器Comparator来实现有序的(内部结构为红黑树)。
LinkedHashmap是基于链表来实现数据插入有序的。
2. HashMap什么时候扩容,每次扩容多少,为什么?
扩容时机:容量达到当前最大容器 * 负载因子(初始默认容量16,负载因子0.75)
扩容大小:每次扩容一倍
为什么扩容一倍:1.容量为2的n次方时,可以减少hash碰撞 2.计算位置时通过位运算,而不是取模可以使效率提高,源码如下:
e.hash & (newCap - 1)
3.JAVA8的ConcurrentHashMap为什么放弃了分段锁,有什么问题吗?JAVA8怎么处理的?
问题:
1.加入多个分段锁浪费内存空间
2.生产环境中, map 在放入时竞争同一个锁的概率非常小,分段锁反而会造成更新等操作的长时间等待。
3.为了提高 GC 的效率
java8处理:
采用CAS+volatile 来代替锁保证原子性,不过其中部分代码段还是加上了Synchronized(说明Synchroniezd的效率已经高于Lock锁了)。
4.IO模型有哪些,讲讲你理解的nio ,他和bio,aio的区别是啥,谈谈reactor模型。
JAVA BIO:同步并阻塞,服务器实现模式为一个连接一个线程,即客户端有连接请求时服务器端就需要启动一个线程并处理,如果这个连接不做任何事情会造成不必要的开销,当然可以通过线程池机制改善。
JAVA NIO:同步非阻塞,服务器实现模式为一个请求一个线程,即客户端发送的连接请求都会注册到多路复用器上,多路复用器轮询到连接有IO请求时才启动一个线程进行处理。
JAVA AIO(NIO2):异步非阻塞,服务器实现模式为一个有效请求一个线程,客户端的I/O请求都是由OS先完成了再通知服务器应用去启动线程进行处理。
reactor模型自行百度。
5.反射的原理,反射创建类实例的三种方式是什么
反射机制指的是程序在运行时能够动态获取自身的信息。在java中,只要给定类的名字, 那么就可以通过反射机制来获得类的所有信息。
反射机制获取class的方法:
1使用 Class.forName :Class1=Class.forName("user")
2.使用类的 .class 方法:Class2=User.class //每个类型都有class属性
3.使用类对象的 getClass() 方法:User user=new User(); Class3=user.getClass() //每个Java对象都有getClass方法。
反射创建对象的两种方式:
1.调用默认构造函数(无参):
Class<?> forName=Class.forName("com.test.entity.user");
Object newInstance=forName.newInstance();
2.调用有带参数的构造函数的类,先获取到其构造对象,再通过该构造方法类获取实例:
Class<?> forName=Class.forName("com.test.entity.user");
Constructor<?> constructor=forName.getConstructor(String.class,String.class); ///获取构造函数类的对象
User user=(User)constructor.newInstance("test","test");
6.多线程方面
怎么创建线程---继承Thread 实现Runnable 或者Callable ,线程池
线程池的流程,核心参数(几乎必问)---为什么使用newCachedThreadPool这些线程池创建线程会发生内存溢出?
怎么关闭线程池:
shutdown()调用后,不可以再 submit 新的 task,已经 submit 的将继续执行
shutdownNow()调用后,试图停止当前正在执行的 task,并返回尚未执行的 task 的 list
ThreadLocal的原理分析(几乎必问)-- 注意不使用时需要remove,不然会造成内存泄漏
Synchronized的底层实现原理以及锁的升级 参考这篇文章(真的不错 ):
volatile的作用:保证线程见的可见性,禁止重排序(实现原理--直接读写主内存)
CAS的实现原理,如何解决ABA问题
线程死锁的解决方式 : 长时间获取不到锁,放弃操作并且释放自己占有的锁;一次性申请所需的锁资源,按一定顺序申请锁资 源。
原子类的实现原理 --CAS
countdowlatch和cyclicbarrier的内部原理和用法,以及相互之间的差别:countdownlatch表示线程到达一个点把一个变量减一,子线程并不会阻塞,继续运行,主要就是countDown和await两个方法,调用await方法的线程被阻塞直到变量减到0,cyclibarrier表示线程到达一个点后,阻塞当前线程直到这组线程的其他线程也到达这个点。
countdowlatch 不能重复使用,一次可以唤醒多个线程 ; cyclibarrier可以重复使用,一次只能唤醒一个线程。
7.spring框架相关问题
一个接口被多个类实现,怎么注入:@Resource @Qualifier+@Autowired
springmvc的处理流程
AOP概念,实现原理: 动态代理(@Aspect注解实现,了解其中的通知类型--前置通知,环绕通知,后置通知,异常通知, 最终通知)
spring事务的传播机(七种),数据库隔离级别(4种)
spring事务@transactional失效的原因:
1.数据库引擎是否支持事务(Mysql的MyIsam引擎就不支持事务)
2.注解所在的类是否注入spring容器中
3.注解所在方法是否为public修饰
4.所用数据源是否加载了事务管理器
5.是否发生了方法的自调用(同一个类中的A方法调用B方法)
6.当方法发生异常时,使用try catch捕获了异常,并且catch中没有抛出异常或者手动回滚。