文章目录
-
-
-
-
- 1、类加载和实例化
- 2、Java是值传递还是引用传递
- 3、类加载的主要过程
- 4、什么是GC
- 5、简述垃圾回收过程
- 6、内存泄漏
- 7、导致内存泄漏的场景
- 8、Java中堆和栈的区别
- 9、ArrayList、LinkedList、Vector的区别
- 10、StringBuffer和StringBuilder的区别
- 11、HashMap、HashTable、TreeMap区别
- 12、synchronized 与 Lock 有什么异同
- 13、数据库事务隔离级别
- 14、事务的特性 acid
- 15、数据库三范式
- 16、union和unionAll的区别
- 17、redis 五种数据结构详解(string,list,set,zset,hash)
- 18、redis常用命令
- 19、redis中list set zset的区别
- 20、redis缓存击穿、雪崩、穿透
- 21、redis备份到磁盘的两个算法
- 22、kafka常见消息引擎泛型
- 23、项目中使用的rabbitMQ案例
- 24、E-R图 实体-联系图(Entity Relationship Diagram)
- 25、MyBatis和SpringDataJPA的区别
- 26、ORM框架映射的实体类中为什么尽量不适用基本数据类型
- 27、MyBatis中ResultMap和ResultType的区别
- 28、SpringCloud服务提供者 服务消费者
- 29、JPA动态sql查询支持
- 30、Netty使用场景
- 31、IO读写流程介绍
- 32、四种IO模型
- 33、阻塞IO和非阻塞IO的区别
- 34、同步IO和异步IO的区别
- 35、同步阻塞BIO
- 36、同步非阻塞NIO
- 37、多路复用IO(IO Multiplexing)
- 38、异步 IO(Asynchronous IO)
- 39、Linux设置单进程可以打开百万线程 默认单进程最多开1024个线程
- 40、Java中NIO的三个核心组件
- 41、开源ZooKeeper客户端Curator
- 42、ZooKeeper的四种节点类型
- 43、ZK分布式命名使用场景
- 44、ZK实现ID生成器满足哪些特性
- 45、Curator封装ZK分布式事件监听
- 46、Curator几个NodeCache节点缓存监听
- 47、分布式锁原理
- 48、ZK实现分布式锁步骤
- 49、分布式锁主流实现方案和选型
- 50、为什么要使用缓存
- 51、RedisTemplate封装的操作Redis方式
- 52、Spring缓存相关的注解
- 53、@CachePut和@Cacheable的区别
- 54、什么是分布式事务
- 55、MySql一般数据达到千万级的数据就得分库分表。
- 56、分布式事务CAP定理
- 57、CAP三者是否可以共有
- 58、BASE
- 59、是否真的需要分布式事务
- 60、通过消息队列实现分布式事务
- 61、为什么使用消息队列MQ
- 62、subString和split效率问题
- 63、守护线程和主线程声明周期关系
- 64、Reactor反应器模式
- 65、Connection Per Thread模式
- 66、ZooKeeper中Leader选举流程
- 67、设计模式
- 68、TCP三次握手 四次挥手
- 69、RabbitMQ消息队列五种队列
- 70、MQ使用时候的注意事项
- 71、HashMap的时间复杂度
- 72、Spring核心理念
- 73、SpringBoot的优点
- 74、Spring IOC
- 75、依赖注入Dependency Injection,DI
- 76、如果同一接口有多个实现类 该如何对该类型的子类进行依赖注入
- 77、SpringBoot中Bean的生命周期
- 78、AOP术语和流程
-
-
-
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的缺点:一般情况下,会为每个连接配备独立的线程,在并发量小的情况下,这样做没有问题。但是,在高并发的应用场景下,需要大量的线程来维护大量的网络连接,内存、线程切