2020美团java面试题一面一般需要大概一个小时左右,面试大概分为个人介绍、数据库优化、spring和多线程相关问题。
1、个人介绍
自我介绍,并说说你的项目
谈谈Hashmap,为什么要用红黑树,hashmap是线程安全的吗?
在哈希表中进行添加,删除,查找等操作,性能十分之高,不考虑哈希冲突的情况下(后面会探讨下哈希冲突的情况),仅需一次定位即可完成,时间复杂度为O(1)。
模板方法模式?
模板方法模式(Template Method) 定义一个操作中算法的骨架,而将一些步骤延迟到子类中。模板方法可以不改变一个算法的结构即可重新定义该算法的某些特定步骤。
手写观察者模式
观察者模式的定义:定义对象间一种一对多的依赖关系,使得每当一个对象改变状态,则所有依赖于它的对象都会得到通知并被自动更新。
有没有有实际价值的项目?
有什么觉得后端技术特别出众的地方
2、数据库
数据库隔离级别
数据库事务的隔离级别有4个,由低到高依次为Read uncommitted、Read committed、Repeatable read、Serializable,这四个级别可以逐个解决脏读、不可重复读、幻读这几类问题。
可重复级能解释下吗?
可重复读(REPEATABLE READ):所有被Select获取的数据都不能被修改,这样就可以避免一个事务前后读取数据不一致的情况。但是却没有办法控制幻读,因为这个时候其他事务不能更改所选的数据,但是可以增加数据,因为前一个事务没有范围锁。
当前端请求特别慢的时候如何优化?
数据库查询非常慢时,如何优化?
自己的实际的数据库优化场景(加索引、limit)
查询多个数据库字段时,是不是每个字段都要加索引,比如性别这个字段要不要加索引
3、Spring
SpringMVC request请求过程
有没有用过微服务
知不知道NIO
4、多线程
多线程了解吗?
线程的几种状态
Java中线程的状态分为6种。
1.初始(NEW):新创建了一个线程对象,但还没有调用start()方法。
2.运行(RUNNABLE):Java线程中将就绪(ready)和运行中(running)两种状态笼统的称为“运行”。
线程对象创建后,其他线程(比如main线程)调用了该对象的start()方法。该状态的线程位于可运行线程池中,等待被线程调度选中,获取CPU的使用权,此时处于就绪状态(ready)。就绪状态的线程在获得CPU时间片后变为运行中状态(running)。
3.阻塞(BLOCKED):表示线程阻塞于锁。
4.等待(WAITING):进入该状态的线程需要等待其他线程做出一些特定动作(通知或中断)。
5.超时等待(TIMED_WAITING):该状态不同于WAITING,它可以在指定的时间后自行返回。
6.终止(TERMINATED):表示该线程已经执行完毕。
线程之间的转化
什么情况下会发生阻塞?
阻塞的情况分三种:
(1)、等待阻塞:运行的线程执行wait()方法,该线程会释放占用的所有资源,JVM会把该线程放入“等待池”中。进入这个状态后,是不能自动唤醒的,必须依靠其他线程调用notify()或notifyAll()方法才能被唤醒,
(2)、同步阻塞:运行的线程在获取对象的同步锁时,若该同步锁被别的线程占用,则JVM会把该线程放入“锁池”中。
(3)、其他阻塞:运行的线程执行sleep()或join()方法,或者发出了I/O请求时,JVM会把该线程置为阻塞状态。当sleep()状态超时、join()等待线程终止或者超时、或者I/O处理完毕时,线程重新转入就绪状态。
wait和sleep的区别
说说乐观锁和悲观锁吧
乐观锁是不是一定不加锁的?
说说volatile吧
synchronized不会发生阻塞吧?(会)为什么?
了解CAS吗?
说说死锁吧
死锁的四个条件
怎么避免死锁
JVM了解吗?
更多java面试题。