经历了两周的面试,终于收到了几个满意的offer。换工做的过程是痛苦的,除了一天快马加鞭地跑好几家公司面试,剩下的时间基本就是背面试题了。想找到一份适合本身的面试题并不简单,好比我找的是高级Java开发的职位。出于以前公司系统架构的设计,须要准备Java、spring、springboot、mysql、mybatis、mycat、zookeeper、dubbo、kafka、redis、网络等面试题。我结合以前面试的20多家公司,以及从CSDN/简书/掘金/公众号等相关渠道搜集到的面试题,从中整理出一些高频的面试题库,帮助你们更加省力从容的应付面试。更全的整理题库,能够经过搜索微信小程序【Java职场范儿】或扫描最下方小程序二维码。轻轻松松地刷题。html
1、Java获取Class文件的几种方式?java
//1.经过Object类中的getClass()方法的。 public static void getClassObject_1() { Person p = new Person(); Class clazz = p.getClass(); }
//2.任何数据类型都具有一个静态的属性.class来获取其对应的Class对象 public static void getClassObject_1() { Class clazz = Person.class; }
//3.只要经过给定的类的字符串名称就能够获取该类 public static void getClassObject_1() { String className = "Person"; Class clazz = Class.forName(className); }
2、如何获取Class中的私有方法?mysql
Method method = e.getClass().getDeclaredMethod("私有方法名",String.class);
1、 HashMap和ConcurrentHashMap的原理(并发必问)程序员
HashMap:
1.7版本,使用一个Entry数组来存储数据,用key的hashcode取模来决定key会被放到数组里的位置,若是hashcode相同,或者hashcode取模后的结果相同(hash collision),那么这些key会被定位到Entry数组的同一个格子里,这些key会造成一个链表。在hashcode特别差的状况下,比方说全部key的hashcode都相同,这个链表可能会很长,那么put/get操做均可能须要遍历这个链表。也就是说时间复杂度在最差状况下会退化到O(n)
1.8版本,使用一个Node数组来存储数据,但这个Node多是链表结构,也多是红黑树结构,若是插入的key的hashcode相同,那么这些key也会被定位到Node数组的同一个格子里。若是同一个格子里的key不超过8个,使用链表结构存储。若是超过了8个,那么会调用treeifyBin函数,将链表转换为红黑树。那么即便hashcode彻底相同,因为红黑树的特色,查找某个特定元素,也只须要O(log n)的开销。也就是说put/get的操做的时间复杂度最差只有O(log n)。
ConcurrentHashMap:
在多线程环境下,使用HashMap进行put操做时存在丢失数据的状况,为了不这种bug的隐患,强烈建议使用ConcurrentHashMap代替HashMap。
1.7版本,使用Segment + HashEntry方式进行实现。
1.8版本,1.8中放弃了Segment臃肿的设计,取而代之的是采用Node + CAS + Synchronized来保证并发安全进行实现,结构以下:面试
更详细的内容请参考《Java7/8 中的 HashMap 和 ConcurrentHashMap 全解析》redis
2、 常见的线程池及应用场景算法
3、 阻塞队列spring
linkedblockingdeque:双向阻塞sql
4、 线程池的处理流程小程序
5、Lock与synchronized 的区别
synchronized:
在资源竞争不是很激烈的状况下,偶尔会有同步的情形下,synchronized是很合适的。缘由在于,编译程序一般会尽量的进行优化synchronize,另外可读性很是好,无论用没用过5.0多线程包的程序员都能理解。
ReentrantLock:
ReentrantLock提供了多样化的同步,好比有时间限制的同步,能够被Interrupt的同步(synchronized的同步是不能Interrupt的)等。在资源竞争不激烈的情形下,性能稍微比synchronized差点点。可是当同步很是激烈的时候,synchronized的性能一会儿能降低好几十倍。而ReentrantLock确还能维持常态。
1、 JVM内存分哪几个区,每一个区的做用是什么
Java虚拟机主要分为如下一个区:
方法区:
虚拟机栈:
本地方法栈
堆
2、java中垃圾收集的方法有哪些?
3、java内存分配与回收策率以及Minor GC和Major GC