Java常见的7个面试总结

知了小姐姐2020-01-211068

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中没有抛出异常或者手动回滚。

 

  • 培训费用

  • 上课方式

  • 开班时间

  • 就业情况