java开发 美团面经

## 一面

String类型是不是基本类型,

Integer类型,Integer与Integer的判等。

hashmap的底层实现。

如何在一个链表中实现排序。如果内部是Integer,String类型的话,Arrays.sort,Collections.sort方法。

对于一个**static变量,他的操作是不是线程安全的。**


```
1、静态变量:线程非安全。

静态变量即类变量,位于方法区,为所有对象共享,共享一份内存,一旦静态变量被修改,其他对象均对修改可见,故线程非安全。

2、实例变量:单例模式(只有一个对象实例存在)线程非安全,非单例线程安全。

实例变量为对象实例私有,在虚拟机的堆中分配,若在系统中只存在一个此对象的实例,在多线程环境下,“犹如”静态变量那样,被某个线程修改后,其他线程对修改均可见,故线程非安全;如果每个线程执行都是在不同的对象中,那对象与对象之间的实例变量的修改将互不影响,故线程安全。

3、局部变量:线程安全。

每个线程执行时将会把局部变量放在各自栈帧的工作内存中,线程间不共享,故不存在线程安全问题。
```

```
静态方法中如果没有使用静态变量,则没有线程安全的问题;
静态方法内的变量,每个线程调用时,都会新创建一份,不会公用一个存储单元,故不存在线程冲突的问题。
```


tcp和udp的区别

http的get和post,**get能不能改变一个值**


```
get 和post都是http协议的一个请求头中的字段,http协议的底层是tcp协议,所以不管是get还是post,底层都是一样的tcp协议,所以post可以做的事情get也可以做,get也可以用来传送数据,改变数据的值。

从协议方面来说,GET 是可以带 body 的,但是不赞成这么做,所以好多工具并没有去提供支持。基本上也不要用 GET 来携带 body 数据。
```


创建线程的方法。直接调用run方法和start()有什么区别。

如何终止一个正在运行的线程。比如如何终止一个死循环打印。使用某个全局变量判断true,false的方法,会不会线程不安全。(说到了stop,interrupt)

ThreadLocal底层实现

**RabbitMQ如何保证可以取到那个数据**。

```
数据库-->主从同步章节
```


项目中是否用到了事务。用的事务隔离级别是什么。

Spring的IOC 的用处。**AOP的使用场景**,除了日志。


```
Authentication 权限
Caching 缓存
Context passing 内容传递
Error handling 错误处理
Lazy loading 懒加载
Debugging  调试
logging, tracing, profiling and monitoring 记录跟踪 优化 校准
Performance optimization 性能优化
Persistence  持久化
Resource pooling 资源池
Synchronization 同步
Transactions 事务

```
==Spring事务==
```
编程式事务管理使用TransactionTemplate或者直接使用底层的PlatformTransactionManager。对于编程式事务管理,spring推荐使用TransactionTemplate。

声明式事务管理建立在AOP之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务最大的优点就是不需要通过编程的方式管理事务,这样就不需要在业务逻辑代码中掺杂事务管理的代码,只需在配置文件中做相关的事务规则声明(或通过基于@Transactional注解的方式),便可以将事务规则应用到业务逻辑中

声明式事务管理也有两种常用的方式,一种是基于tx和aop名字空间的xml配置文件,另一种就是基于@Transactional注解。显然基于注解的方式更简单易用,更清爽

```


**注解的底层实现是什么**
使用java反射机制实现。



设计模式:讲一下策略模式,策略模式的用处是什么。

哪些线程池,线程池的参数。

接口的方法是不是可以实现,抽象类呢?

volatile可见性怎么做的,禁止指令重排序。

Synchronized底层实现,使用的什么锁。是可重入锁吗?可重入锁的概念。

递归方法怎么结束?

**一个递归的方法,内部使用synchronized,是否会出现死锁**,synchronized锁住对象实例和类的区别是什么。

```
synchronized是可重入锁,同一个对象的锁可重入。

synchronized拥有强制原子性的内部锁机制,是一个可重入锁。因此,在一个线程使用synchronized方法时调用该对象另一个synchronized方法,即一个线程得到一个对象锁后再次请求该对象锁,是永远可以拿到锁的。

Spring用过吗?google的小工具用过吗?

@Controller 和@RestController的区别

Spring是单例的吗?如何用多例的?Spring单例的话如何保证线程安全性?(ThreadLocal)

如何实现一个本地缓存(LinkedHashMap),缓存的淘汰策略有哪些?

redis的集群***机制。

JDK1.8的工作流了解吗?

linux,如何查看日志的最后几行?tail,tac。

Spring源码看过吗?

如何学习新知识。(看源码,看博客)

## 二面
问秒杀项目,问异步队列是干什么用的。redis是怎么保证数据一致性的

如果redis预减库存成功,但是数据库减库存失败怎么办?

java JVM是干什么用的。java的内存结构。为什么已加载的类存在方法区中。java的类加载机制(忘了)

java并发,java创建线程的方法。为什么callable可以返回值。

java线程池的参数和拒绝策略。

TCP的滑动窗口。TCP的三次握手四次挥手。

数据库用的哪个?数据库的索引有哪些。索引的底层结构是什么样子的。hash索引为什么不可以范围查找。

写快排。

## 后面不给面了,让转岗,拒绝了
#美团##Java工程师##面经##校招#
全部评论
要转哪个岗位呢
点赞 回复
分享
发布于 2019-10-11 15:17

相关推荐

头像
点赞 评论 收藏
转发
1 49 评论
分享
牛客网
牛客企业服务