2020后端Java面试题汇总

总结了一些相关的java面试题,虽然我是比较反感背面试题的,但是还是需要了解一些基础概念的,不然面试真的可能会很尴尬

1 java基础:

1 介绍一下Java中常见的容器

2 Iterator 和 ListIterator 有什么区别?

  Iterator可用来遍历Set和List集合,但是ListIterator只能用来遍历List。 

  Iterator对集合只能是前向遍历,ListIterator既可以前向也可以后向。 

  ListIterator实现了Iterator接口,并包含其他的功能,比如:增加元素,替换元素,获取前一个和后一个元素的索引,等等。

3 object类中的常用方法,作用是什么?

2 项目中一些基础知识的使用了解情况

1 项目中的范型怎么使用的,如何自定义异常,分布式事物的解决方案,接口中如何保证幂,定时任务的顺序执行

2 长链接和短链接的区别是什么,项目中哪里用到了

3 kafka的顺序读取是如何实现的

3 多线程

1 线程的几种状态:

  创建状态。在生成线程对象,并没有调用该对象的start方法,这是线程处于创建状态。

  就绪状态。当调用了线程对象的start方法之后,该线程就进入了就绪状态,但是此时线程   调度程序还没有把该线程设置为当前线程,此时处于就绪状态。在线程运行之后,从等待或者睡眠中回来之后,也会处于就绪状态。

  运行状态。线程调度程序将处于就绪状态的线程设置为当前线程,此时线程就进入了运行状态,开始运行run函数当中的代码。

  阻塞状态。线程正在运行的时候,被暂停,通常是为了等待某个时间的发生(比如说某项资源就绪)之后再继续运行。sleep,suspend,wait等方法都可以导致线程阻塞。

  死亡状态。如果一个线程的run方法执行结束或者调用stop方法后,该线程就会死亡。对于已经死亡的线程,无法再使用start方法令其进入就绪  

2 项目中线程池怎么使用的

3 多线程锁的集中状态及其描述

  无状态锁,偏向锁,轻量级锁和重量级锁状态,这几个状态会随着竞争情况逐渐升级。锁可以升级但不能降级

 4 ThreadLocal 是什么?有哪些使用场景?

   线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享。
   Java提供ThreadLocal类来支持线程局部变量,是一种实现线程安全的方式。
   但是在管理环境下(如 web 服务器)使用线程局部变量的时候要特别小心,
   在这种情况下,工作线程的生命周期比任何应用变量的生命周期都要长。
   任何线程局部变量一旦在工作完成后没有释放,Java 应用就存在内存泄露的风险。

 5 synchronized 和 volatile 的区别是什么?

   volatile本质是在告诉jvm当前变量在寄存器(工作内存)中的值是不确定的,需要从主存中读取; synchronized则是锁定当前变量,只有当前线程可以访问该变量,其他线程被阻塞住。

   volatile仅能使用在变量级别;synchronized则可以使用在变量、方法、和类级别的。

   volatile仅能实现变量的修改可见性,不能保证原子性;而synchronized则可以保证变量的修改可见性和原子性。

   volatile不会造成线程的阻塞;synchronized可能会造成线程的阻塞。

   volatile标记的变量不会被编译器优化;synchronized标记的变量可以被编译

4 数据库

 1 索引的实现原理,底层数据结构

 2 sql优化

 3 mysql的存储引擎myisam和innodb的区别

5 JVM

1 类加载分为以下 5 个步骤:

	加载:根据查找路径找到相应的 class 文件然后导入;

	检查:检查加载的 class 文件的正确性;

	准备:给类中的静态变量分配内存空间;

	解析:虚拟机将常量池中的符号引用替换成直接引用的过程。符号引用就理解为一个标示,而在直接引用直接指向内存中的地址;

	初始化:对静态变量和静态代码块执行初始化工作

  2 什么是双亲委派模型?

    在介绍双亲委派模型之前先说下类加载器。
    对于任意一个类,都需要由加载它的类加载器和这个类本身一同确立在 JVM 中的唯一性,每一个类加载器,
    都有一个独立的类名称空间。类加载器就是根据指定全限定名称将 class 文件加载到 JVM 内存,然后再转化为 class 对象。

	类加载器分类:

	启动类加载器(Bootstrap ClassLoader),是虚拟机自身的一部分,用来加载Java_HOME/lib/目录中的,或者被 -Xbootclasspath 参数所指定的路径中并且被虚拟机识别的类库;

	其他类加载器:

	扩展类加载器(Extension ClassLoader):负责加载<java_home style="box-sizing: border-box; -webkit-tap-highlight-color: transparent; text-size-adjust: none; -webkit-font-smoothing: antialiased; outline: 0px !important;">\lib\ext目录或Java. ext. dirs系统变量指定的路径中的所有类库;</java_home>

	应用程序类加载器(Application ClassLoader)。负责加载用户类路径(classpath)上的指定类库,我们可以直接使用这个类加载器。一般情况,如果我们没有自定义类加载器默认就是用这个加载器。

6 设计模式

    动态代理:

	当想要给实现了某个接口的类中的方法,加一些额外的处理。比如说加日志,加事务等。
	可以给这个类创建一个代理,故名思议就是创建一个新的类,这个类不仅包含原来类方法的功能,
	而且还在原来的基础上添加了额外处理的新类。这个代理类并不是定义好的,是动态生成的。具有解耦意义,灵活,扩展性强。

	动态代理的应用:

	Spring的AOP

	加事务

	加权限

	加日志

7 中间件

1 kafka如何保证消息不丢失不被重复消费

	消息的发送机制
	消息的接受机制
	消息的重复消费如何解决
	kafka如何保证消息不丢失不被重复消费
	在解决这个问题之前,我们首先梳理一下kafka消息的发送和消费机制。

2 kafka消息的发送机制:kafka的消息发送机制分为同步和异步机制。
可以通过producer.type属性进行配置。

使用同步模式的时候,有三种状态来保证消息的安全生产。可以通过配置request.required.acks属性。三个属性分别如下
0—表示不进行消息接收是否成功的确认;
1—表示当Leader接收成功时确认;
-1—表示Leader和Follower都接收成功时确认;
当acks = 0的时候,不和Kafka集群进行消息接收确认,则当网络异常、缓冲区满了等情况时,消息可能丢失;
当acks=1的时候,只保证leader写入成功。当leader partition挂了的时候,数据就有可能发生丢失。
另外还有一种情况,使用异步模式的时候,当缓冲区满了,
acks=0的时候,不需要进行消息接受是否成功的确认,所以会自动清空缓冲池里的消息。

同步模式下只需要将确认机制设置为-1,让消息写入leader和所有的副本,就可以保证消息安全生产。

异步模式下,则需要在配置文件中,将阻塞超时的时间设置为不限制。这样生产端会一直阻塞。可以保证数据不丢失。

我们需要设置block.on.buffer.full = true。 这样producer将一直等待缓冲区直至其变为可用。缓冲区满了就阻塞

acks=all。所有的follwoer都响应了消息就认为消息提交成功。

retries=MAX。无限重试。

max.in.flight.requests.per.connnection = 1
限制客户端在单个连接上能够发送的未响应的请求的个数。
设置为1表示kafka broker在响应请求之前client不能再向broker发送请求了。通过此举可以保证消息的顺序性。

3 kafka消息的接受机制:

消息的接受端保证消息不丢失的情形就比较简单了。
kafka的consumer模式是自动提交位移的。我们只需要在代码逻辑中保证位移提交前消息被处理就行。
我们可以关闭自动提交位移,设置enable.auto.commit为false。自己手动处理消息后提交位移。

4 kafka消息的重复消费如何解决:

重复消费的问题,一方面需要消息中间件来进行保证。
另一方面需要自己的处理逻辑来保证消息的幂等性。
极有可能代码消费了消息,但服务器突然宕机,未来得及提交offset。
所以我们可以在代码保证消息消费的幂等性。至于方法可以通过redis的原子性来保证,也可以通过数据库的唯一id来保证。

推荐链接: https://zhuanlan.zhihu.com/p/64147696

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值