2020年 Java面试题整理 最新Java面试题2020

文章目录

1、类加载和实例化

程序开启的时候 jvm只会把需要的类进行加载 其他的类都是在实例化的时候被隐式加载的
试用class.forName()可以显示加载类

2、Java是值传递还是引用传递

基本数据类型和String类型的数据 都是值传递
引用数据类型都是引用传递 方法中修改值后 真实的值也会发生变化

3、类加载的主要过程

a:装载 导入class文件
b:链接 检查:检查class文件的正确性 准备:为静态变量分配控件 解析:将符号引用转换为直接引用
c:初始化 对静态变量和静态代码块执行初始化操作

4、什么是GC

Java的垃圾回收机制

5、简述垃圾回收过程

对象被创建后 如果被其他方法或者对象调用 引用计数会增加1 GC会根据一定的算法去回收引用计数为0的对象 完成垃圾回收

6、内存泄漏

无法被GC回收 又没有被任何对象所引用的一块内存区域

7、导致内存泄漏的场景

a:静态集合类 HashMap和Vector 生命周期和程序一样久 不恰当的使用会导致
b:各种数据库连接 网络连接以及io连接 忘记close
c:各种监听器 使用后没有删除
d:变量不合理的作用域

8、Java中堆和栈的区别

堆和栈都是内存中存放数据的地方
栈:基础数据类型和对象的引用变量
堆:对象真实的内容
常量池:存放常量的地方

9、ArrayList、LinkedList、Vector的区别

都是list数据类型
ArrayList和Vector底层都是数组实现 不同是Vector线程安全 由于占用连续的存储空间 查询比较快 增删比较慢
LinkedList底层实现为双向链表结构 查询慢 增删比较快 不需要动态扩容 均匀的分散在内存中

10、StringBuffer和StringBuilder的区别

StringBuffer中的所有方法都是synchronized修饰的

11、HashMap、HashTable、TreeMap区别

HashMap允许key为null HashTable不允许key值为null HashTable线程安全
TreeMap是有序的map

12、synchronized 与 Lock 有什么异同

synchronized是托管给jvm去执行的 lock是代码中去控制的 使用lock时候 一定要记得unlock 防止死锁

13、数据库事务隔离级别

none read_uncommit read_commit repeatedable_read serializable

14、事务的特性 acid

原子性:所有操作要么都成功 要么都失败
一致性:A向B转账 必须保证事务之前前后 AB的总余额保持一致
隔离性:每个事务都有自己的操作空间 相护不影响
持久性:事务执行完成后的数据 会被永久保存到数据库中

15、数据库三范式
16、union和unionAll的区别

union是合表后去重 unionAll是简单的合表 并不去重

17、redis 五种数据结构详解(string,list,set,zset,hash)
18、redis常用命令

setEx:设置秒级过期时间
setNx:键必须不存在才能设置成功 分布式锁实现的一个思路
setXx:与nx完全相反 键必须存在 才能设置成功

19、redis中list set zset的区别
20、redis缓存击穿、雪崩、穿透

为什么要避免上述问题:每次都会查询数据库 导致缓存失效 失去了缓存的意义
击穿:热点数据 缓存失效后 大量请求直接进入数据库 导致数据库宕机 解决办法:缓存失效 更新缓存的时候 加锁更新 其他进程等待更新完成后再去读取
雪崩:同一时间 多个缓存同时失效 导致大面积的请求进到数据库中
穿透:查询了一个缓存和数据库中都没有的数据 比如id为-1的一条数据 解决方案:每次更新缓存的时候 如果没有从数据库获取到值 也要设置一个缓存

21、redis备份到磁盘的两个算法

RDB:bgsave命令 后台进行备份 生成一个rdb文件 不可实时备份
AOF:append only file 可以进行实时备份 往一个文件中实时追加命令 重启后 再次执行命令即可 开启方式:appendonly yes 默认关闭

22、kafka常见消息引擎泛型

a:消息队列模型 多用于处理进程/线程间的通信 生产者(producer)往队列发消息 消费者(consumer)从队列中获取消息 多个消费者监听同一个topic时候 一条消息只能被同一个消费者消费 负载均衡模式
b:发布/订阅模型 发布者(publisher)将消息发送到对应的topic中 所有的订阅者(subscriber)都可以接收到当前消息

23、项目中使用的rabbitMQ案例

a:通过消息队列每5分钟上报一次当前服务的ip和端口到统一的解析平台
b:通过消息队列实现微信支付预约成功后 推送成功消息到门店大堂叫号机去更新叫号列表

24、E-R图 实体-联系图(Entity Relationship Diagram)

矩形:表示一个实体 一张表 一个Java类
椭圆形:表示实体拥有的属性
菱形:表示多个实体之间的关系

25、MyBatis和SpringDataJPA的区别

a:自动建表
b:动态sql语句
c:对多种不同数据库的兼容性

26、ORM框架映射的实体类中为什么尽量不适用基本数据类型

使用int时候 由于基本数据类型有默认值 int默认为0 如果表中有为null的数据将无法映射 所以 尽量使用Integer等包装类型

27、MyBatis中ResultMap和ResultType的区别

返回结果为一个bean的时候 使用ResultMap进行映射
返回结果为List的时候 使用ResultType进行映射

28、SpringCloud服务提供者 服务消费者
29、JPA动态sql查询支持

QueryByExampleExecutor:简单的动态查询支持
JpaSpecificationExecutor:复杂的动态查询支持

30、Netty使用场景

IM即时消息
推送

31、IO读写流程介绍

进程缓冲区→内核缓冲区→磁盘
read/write并不是直接对磁盘进行操作,而是先将修改写到进程所在的进程缓冲区,然后进程缓冲区再和内核缓冲区交互,再到磁盘进行持久化

32、四种IO模型

同步阻塞IO(Blocking IO)
同步非阻塞IO(Non-Blocking IO)
多路复用IO(IO Multiplexing)
异步 IO(Asynchronous IO)

33、阻塞IO和非阻塞IO的区别

阻塞IO,指的是需要内核IO操作彻底完成后,才返回到用户空间执行用户的操作。阻塞指的是用户空间程序的执行状态。传统的IO模型都是同步阻塞IO。再Java中,默认创建的socket都是阻塞的。
非阻塞IO,指的是用户空间的程序不需要等待内核IO操作彻底完成,可以立即返回用户空间执行用户操作,即处于非阻塞的状态,与此同时内核会立即返回给用户一个状态值。
简单来说:阻塞是指用户空间(调用线程)一直在等待,而不能干别的事情;非阻塞是指用户空间(调用线程)拿到内核返回的状态值就返回自己的空间,IO操作可以干就干,不可以干,就去干别的事情。

34、同步IO和异步IO的区别

同步IO,是一种用户空间和内核空间的IO发起方式。同步是指用户空间的线程是主动发起IO请求的一方,内核空间是被动接受方。异步IO则反过来,是指系统内核是主动发起IO请求的一方,用户空间的线程是被动接受方。
异步IO,指的是用户空间与内核空间的调用方式反过来。用户空间的线程变成被动接受者,而内核空间成了主动调用者。这有点类似于Java中比较典型的回调模式,用户空间的线程向内核空间注册了各种IO事件的回调函数,由内核去主动调用。

35、同步阻塞BIO

阻塞io的特点:在内核进行IO执行的两个阶段,用户线程都是被阻塞了。
阻塞IO的优点:应用的程序开发非常简单;在阻塞等待数据期间,用户线程挂起。在阻塞期间,用户线程基本不会占用cpu资源。
阻塞IO的缺点:一般情况下,会为每个连接配备独立的线程,在并发量小的情况下,这样做没有问题。但是,在高并发的应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切

  • 9
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值