这篇文章记录在准备Java后端面试复习过程中网上常见的考题,同时也会标明题目出现频率,方便大家参考。有缺少、错误的部分欢迎大家补充纠正。–持续更新
图片来源:牛客网面经
数据类型
Java中的八大类型及其包装类型(占用字节数)
Java面向对象
常见
Java 接口\抽象类?
重载和重写?
Java List
高频
ArrayList和LinkedList的区别?分别用在什么场景?
①ArrayList和LinkedList可想从名字分析,它们一个是Array(动态数组)的数据结构,一个是Link(链表)的数据结构,此外,它们两个都是对List接口的实现。
前者是数组队列,相当于动态数组;后者为双向链表结构,也可当作堆栈、队列、双端队列
②当随机访问List时(get和set操作),ArrayList比LinkedList的效率更高,因为LinkedList是线性的数据存储方式,所以需要移动指针从前往后依次查找。
③当对数据进行增加和删除的操作时(add和remove操作),LinkedList比ArrayList的效率更高,因为ArrayList是数组,所以在其中进行增删操作时,会对操作点之后所有数据的下标索引造成影响,需要进行数据的移动。
④从利用效率来看,ArrayList自由性较低,因为它需要手动的设置固定大小的容量,但是它的使用比较方便,只需要创建,然后添加数据,通过调用下标进行使用;而LinkedList自由性较高,能够动态的随数据量的变化而变化,但是它不便于使用。
⑤ArrayList主要控件开销在于需要在lList列表预留一定空间;而LinkList主要控件开销在于需要存储结点信息以及结点指针信息。
场景:
链表,插入删除快,查找修改慢。 适用于频繁增删的场景。
数组,查找快,插入删除慢。 适用于频繁查找和修改的场景。
常见
少见
Java Set
常见
Set是有序的,这句话对吗?
Java Map
高频
hashtable和hashmap的区别及实现原理,
hashmap会问到数组索引,hash碰撞怎么解决?
请你说明HashMap和Hashtable的区别?
HashMap和Hashtable都实现了Map接口,因此很多特性非常相似。但是,他们有以下不同点:
HashMap允许键和值是null,而Hashtable不允许键或者值是null。
Hashtable是同步的,而HashMap不是。因此,HashMap更适合于单线程环境,而Hashtable适合于多线程环境。
HashMap提供了可供应用迭代的键的集合,因此,HashMap是快速失败的。另一方面,Hashtable提供了对键的列举(Enumeration)。
一般认为Hashtable是一个遗留的类。
HashMap 和 ConcurrentHashMap?
如何使HashMap变得安全?
ConcurrentHashMap如何保证线程安全的?
常见
请说明Collection 和 Collections的区别?
Collection是集合类的上级接口,继承与他的接口主要有Set 和List.
Collections是针对集合类的一个帮助类,他提供一系列静态方法实现对各种集合的搜索、排序、线程安全化等操作
synchronized?
HashMap底层实现?
hash冲突了解哪些?
少见
equals 和 hashCode ?
volatile?
Collection集合接口和Map接口有什么关系?
没有直接关系,但是一些子类会有依赖,Collection是最基本的集合接口,声明了适用于JAVA集合(只包括Set和List)的通用方法。Map接口并不是Collection接口的子接口,但是它仍然被看作是Collection框架的一部分。
Map的各种实现类,它们有什么区别
JVM
高频
JVM 的内存结构?
垃圾回收(器),各自的优缺点?
分代?
类的实例化顺序?
比如父类静态数据,构造函数,字段,子类静态数据,构造函数,字段,他们的执行顺序?
java的.class加载机制,java到class到二进制字节码文件的转化过程?
常见
JVM 调优?
栈、堆和方法区的介绍?
Java中的内存溢出?
内存泄漏?内存泄漏会导致什么?
少见
CGLib
jvm 栈空间分配?
jvm的作用?
Java 并发编程
线程池原理、ThreadLocal?
悲观锁与乐观锁?
常见
synchronized?
底层实现:
进入时,执行 monitorenter,将计数器 +1,释放锁monitorexit 时,计数器-1;
当一个线程判断到计数器为 0 时,则当前锁空闲,可以占用;反之,当前线程进入等待状态。
含义:(monitor 机制)
Synchronized 是在加锁,加对象锁。对象锁是一种重量锁(monitor),synchronized 的锁机制会根据线程竞争情况在运行时会有偏向锁(单一线程)、轻量锁(多个线程访问 synchronized 区域)、对象锁(重量锁,多个线程存在竞争的情况)、自旋锁等。
该关键字是一个几种锁的封装。
volatile?
答:该关键字可以保证可见性不保证原子性。
功能:
- 主内存和工作内存,直接与主内存产生交互,进行读写操作,保证可见性;
- 禁止 JVM 进行的指令重排序。