目录
- 第一章、技术栈
- 1.0)集合框架等基础
- 1、arraylist ,linkedlist的区别,为啥集合有的快有的慢
- 2、字符串倒叙输出
- 3、讲一下Java的集合框架
- 4、×定义一下线程安全的map,有哪些方法
- 5、equals比较问题
- 6、hashtable和hashmap的区别
- 7、
- 8、
- 9、
- 10、
- 11、
- 12、
- 13、
- 14、
- 15、
- 16、
- 1.1)JVM
- 1、平常有了解JVM吗,说一下jvm
- 2、JVM 内存区域
- 3、垃圾回收算法
- 4、垃圾收集器
- 5、常用 JVM 调优手段
- 6、类的加载
- 7、
- 8、
- 9、
- 1.2)数据库的隔离级别、事务、索引原理, 优化 SQL ;
- 1、隔离级别
- 2、事务的特性
- 3、数据库批处理有了解吗
- 4、explain 执行计划,数据库优化从哪几点入手
- 5、数据库分库分表
- 6、什么是索引,索引有几种,索引原理
- 7、索引失效的原因
- 8、聚集索引和非聚集索引的区别
- 9、什么字段不能做索引
- 10、什么情况下使用索引
- 11、MySQL数据库limit分页的使用
- 12、说一下怎么做数据库的事务,除注解外如何使用事务
- 13、事务的七种传播行为
- 14、
- 15、缓存和数据库同步
- 16、项目如何保证数据安全
- 16、
- 1.3)多线程
- 1、线程生命周期
- 2、synchronized关键字
- 3、volatile关键字
- 4、ThreadLocal
- 5、 线程池
- 6、 AQS
- 7、异步是线程池的还是spring自带的
- 8、说一下线程池的几个参数
- 9、怎么创建一个多线程,有哪些方法实现,优劣是什么
- 10、新建一个线程,线程有哪些状态
- 11、
- 12、
- 13、
- 14、
- 15、
- 16、
- 1.4)Redis ,Linux服务器
- 1、redis默认几个库,redus默认端口号多少
- 2、redis用在项目哪里
- 3、Redis 分布式缓存框架
- 4、缓存雪崩,如何解决缓存雪崩
- 5、缓存穿透与缓存击
- 6、持久化机制
- 7、缓存淘汰策略
- 8、redis有哪些数据类型
- 9、工作中使用redis,最常用什么功能
- 10、讲一下Linux服务器部署项目
- 11、缓存和数据库同步
- 12、Linux常用命令
- 13、redis主从同步用在什么地方
- 14、redis多线程还是单线程
- 15、
- 16、
- 1.5)SpringCloud ,熟悉 Eureka、Nacos、Gateway、 OpenFeign、Nginx
- 1、SpringCloud 微服务框架,用过哪些组件
- 2、服务降级和服务熔断
- 3、熟悉 Eureka
- 4、熟练使用nginx,能讲一下nginx嘛Nacos
- 5、Gateway
- 6、OpenFeign
- 7、Nginx
- 8、dubbo运行起来需要什么组件,是怎么协作的
- 9、zookeeper注册中心有什么可以替换的吗
- 10、
- 11、
- 12、
- 13、
- 14、
- 15、
- 16、
- 1.6)RabbitMQ消息队列
- <font color=red >1、熟悉RabbitMQ消息队列
- 2、幂等性问题的思考和总结,防重、幂等
- 3、重复消费问题
- 4、消息不丢失
- 5、高可用解决方案
- 6、
- 7、
- 8、
- 9、
- 10、
- 11、
- 12、
- 13、
- 14、
- 15、
- 16、
- 1.7)XXL-JOB,MongoDB,Docker
- 1、XXL-JOB介绍
- 2、MongoDB介绍
- 3、Docker介绍
- 4、
- 5、
- 6、
- 7、
- 8、
- 9、
- 1.8)spring ,springMVC,mybatis, springboot
- 1、mybatis里xml文件返回数据类型
- 2 、springboot常用注解
- 3、 springboot 定时任务
- 4、mybatis里面怎么实现分页
- 5、springboot自动装配原理
- 6、springbean的生命周期
- 7、mybatis防止SQL注入
- 8、spring的AOP功能怎么用呢
- 9、spring的设计模式
- 10、
- 11、
- 12、
- 13、
- 14、
- 15、
- 16、
- 第二章、其他问题
- 2.1)其他问题
- 1、会不会写单元测试
- 2、Java8有哪些新特性
- 3、有没有让你感到技术有困难最后攻克的难题
- 4、在基金项目里做了哪些事情
- 5、自我介绍一下
- 6、介绍一下最近的一个项目,项目的经历,具体参与项目的过程
- 7、项目中对接了哪几个接口呢,这些功能是直接分给你功能,还是说已经设计好了让你实现
- 8、你们接口是怎么交互的呢?,几个接口来实现这个功能?
- 9、做项目的时候参与什么任务
- 10、上线以后出问题怎么办
- 11、
- 12、
- 13、
- 14、
- 15、
- 16、
- 2.2)
- 2.3)
友情提醒:
先看文章目录,大致了解文章知识点结构,点击文章目录可直接跳转到文章指定位置。
第一章、技术栈
1.0)集合框架等基础
1、arraylist ,linkedlist的区别,为啥集合有的快有的慢
集合有的快有的慢,主要是因为它们的底层实现不同。
①ArrayList:底层是基于数组的数据结构实现的,内存地址空间是连续的,通过index下标直接定位元素,所以查询快,在增删时,会进行扩容判断和拷贝,所以增删较慢。
②LinkedList:底层是基于双向链表实现的。由于内存地址空间不连续,所以每次查询都需要循环遍历,所以查询慢、在增删时只需要链接新的元素,而不必修改列表中剩余的元素,所以增删快。
2、字符串倒叙输出
①使用StringBuilder类,StringBuilder类是一个可变的字符串缓冲区。它提供了reverse()方法,可以将字符串进行倒序操作。
②使用char数组。将字符串转换为char数组。使用循环和一个临时变量,将char数组中的字符进行倒序交换。将交换后的char数组转换为字符串,并输出结果。
3、讲一下Java的集合框架
单列集合顶层接口位collection下面有set和list两个接口,双列集合顶层接口 map
列表list(集合有序可重复,可有null元素) | 集set(元素是无序不可重复的) | map(顶层接口,存储的是键值对,键是唯一的。) |
---|---|---|
Vector:底层数据结构是数组数据结构.特点是查询和增删速度都很慢。 集合长度。线程安全。 | HashSet:底层数据结构是哈希表、存取速度快、元素唯一、线程不安全。 | HashMap:底层是哈希表数据结构;允许使用null键和null值;线程不安全,效率高; |
ArrayList:底层的数据结构是数组数据结构,特点是查询速度快(因为带下标),但是增删速度稍慢,因为当元素多时,增删一个元素则所有元素的下标都得改变,线程不安全。默认长度是10,当超过长度时,按1.5倍延长集合长度。 | TreeSet:底层数据结构式二叉树。可以对Set集合中的元素进行排序。元素有序、线程不安全。 | HashTable: 底层是哈希表数据结构;不可以使用null键和null值线程安全效率低,因为它里面的方法都是用了 synchronized关键字修饰。 |
LinkedList:底层数据结构式双向链表数据结构(即后面一个元素记录前一个),特点:查询速度慢,因为每个元素只知道前面一个元素,但增删速度快,因为元素再多,增删一个只要让其前后 的元素 重新相连即可,线程不安全。 | ①特点:有序的,保证元素不可重复的前提下,维护了一层添加顺序,判断是否重复的依据:hashCode、equals | TreeMap:底层是二叉树结构;允许使用null键和null值;线程不安全; |
4、×定义一下线程安全的map,有哪些方法
在多线程环境下保证同一时刻只有一个线程可以访问Map:
①线程安全的Map通过在每个方法上添加synchronized关键字或者使用Collections.synchronizedMap等方法来保证线程安全。线程安全的Map实现通常会使用锁或者其他的同步机制来。
②使用ConcurrentHashMap。采用了分段锁的机制,将整个Map分成多个Segment,在每个Segment上都加锁,不同的线程可以同时访问不同的Segment,从而提高了并发访问的效率。
5、equals比较问题
①==:如果比较的对象是基本数据类型,则比较的是数值是否相等;如果比较的是引用数据类型,则比较的是对象的地址值是否相等。
②equals():用来比较方法两个对象的内容是否相等。equals方法不能用于基本数据类型的变量,如果没有对equals方法进行重写,则比较的是对象的内存地址。
6、hashtable和hashmap的区别
区别 | 存储 | 底层 | 如何选择 | key是否允许null | 是否线程同步 |
---|---|---|---|---|---|
HashMap | 存储无序 | 哈希表 | 不需要排序 | 允许 | 非线程安全 |
HashTable | 存储无序 | 哈希表 | 需要线程安全 | 不允许 | 线程安全 |
TreeMap | 存储有序 | 红黑树 | 需要排序 | 不允许 | 非线程安全 |
LinkedHashMap | 存储有序 | 链表和哈希表 | 需要存储有序 | 允许 | 非线程安全 |
7、
8、
9、
10、
11、
12、
13、
14、
15、
16、
1.1)JVM
1、平常有了解JVM吗,说一下jvm
①JVM是Java虚拟机,是一个虚构出来的计算机,是通过在实际的计算机上仿真模拟各种计算机功能来实现的。
②Java语言非常重要的特点跨平台性就是通过jvm实现,Java虚拟机在执行字节码时,把字节码解释成具体平台上的机器指令执行。
整个JVM 框架由加载器加载文件,然后执行器在内存中处理数据,需要与异构系统交互是可以通过本地接口进行
③JVM包括
1、Class Loader 类加载器。类加载器的作用是加载类文件到内存
2、Execution Engine 执行器。执行引擎执行引擎也叫做解释器,负责解释命令,提交操作系统执行。
3、Native Interface 本地接口。作用是融合不同的编程语言为Java 所用
4、Runtime data area 运行数据区包括方法区、堆、虚拟机栈、本地方法栈以及程序计数器五个部分。我们所有写的程序都被加载到这里,之后才开始运行。
2、JVM 内存区域
1.栈是运行时的单位 , 方法调用的数据需要通过栈进行传递,每一次方法调用都会有一个对应的栈帧被压入栈中,每一个方法调用结束后,都会有一个栈帧被弹出。
2.堆解决的是数据存储的问题,此内存区域的唯一目的就是存放对象实例,堆是所有线程共享的。几乎所有的对象实例以及数组都在这里分配内存。里面包含字符串常量池。
3.堆在 JVM 启动的时候即被创建,是最大一块内存空间且大小是可以调节的,Java 堆是垃圾收集器管理的主要区域,因此也被称作 GC 堆。其中划分为新生代内存,老年代内存,永久代
4.Method Area 方法区
方法区是被所有线程共享,该区域保存所有字段和方法字节码,以及一些特殊方法如构造函数,接口代码也在此定义。JDK1.8 最大的变化就是方法区的位置从Java程序的进程空间分离出去,转移到了本地内存中称为元空间。并且PermGen(永久代) 也被 Metaspace(元空间) 取代。
5、PC Register 程序计数器
每个线程都有一个程序计数器,就是一个指针,指向方法区中的方法字节码,由执行引擎读取下一条指令。
6、本地方法栈(Native Method Stacks)
虚拟机栈为虚拟机执行Java方法(也就是字节码)服务,而本地方法栈为JVM调用native方法时服务,一个Native方法就是一个java调用非java代码的接口。
3、垃圾回收算法
①分代收集算法
不同的对象的生命周期是不一样的。分代回收把不同生命周期的对象 放在不同代上,在新生代中,有大量对象死去和少量对象存活,所以采用复制算法,老年代中因为对象的存活率极高,所以采用标记清理或者标记整理算法进行回收。
②标记清除算法
标记阶段,标记所有的可访问对象。
收集阶段,垃圾收集算法扫描堆并回收所有的未标记对象。
③增量垃圾回收
简单地说,它的存在是为了解决标记清除的长停顿问题。增量收集器把堆栈分为多个域,每次仅从一个域收集垃圾。这会造成较小的应用程序中断。
④复制算法
将内存按照容量大小分为大小相等的两块,每次只使用一块,当一块使用完了,就将还存活的对象移到另一块上,然后在把使用过的内存空间移除。特点:不会产生空间碎片;内存使用率极低
4、垃圾收集器
垃圾回收器通常是作为一个单独的低级别的线程运行,在不可预知的情况下对内存堆中已经死亡的或者长时间没有使用的对象进行清除和回收,程序员不能实时的调用垃圾回收器对某个对象或所有对象进行垃圾回收。
垃圾回收器不可以马上回收内存,程序员可以手动执行System.gc(),通知GC运行, 但是Java语言规范并不保证GC一定会执行。
5、常用 JVM 调优手段
1、内存分配:根据应用程序的需求调整JVM的内存分配。如果应用程序需要处理大量数据,则可以增加JVM的堆内存和非堆内存。
2、垃圾回收:JVM的垃圾回收是一项重要的任务,它可以释放无用的对象并回收内存。通过选择不同的垃圾回收器、调整垃圾回收器的参数和设置合适的内存阈值等,可以提高垃圾回收的效率。
3、线程管理:JVM中的线程是Java应用程序的核心组成部分。通过调整线程的数量、设置线程的优先级和使用线程池等方式,可以提高Java应用程序的并发性能。
4、类加载:Java应用程序需要在运行时动态加载类。通过优化类的加载过程,可以提高应用程序的启动速度和响应性能。
5、编译优化:JIT编译器可以将Java代码编译为本机代码,从而提高应用程序的执行速度。通过设置JIT编译器的参数和选择适当的编译器,可以提高编译器的性能和效率。
6、I/O优化:I/O操作是Java应用程序中常见的性能瓶颈之一。通过使用缓冲区、选择合适的I/O库、减少I/O操作次数等方式,可以提高I/O操作的效率。
6、类的加载
JVM中类的装载是由类加载器和它的子类来实现的,Java中的类加载器它负责在运行时查找和装入类文件中的类。经过编译的Java源程序并不是一个可执行程序,而是一个或多个类文件。当Java程序需要使用某个类时,JVM会确保这个类已经被加载、连接(验证、准备和解析)和初始化。
1)如果类存在直接的父类并且这个类还没有被初始化,那么就先初始化父类;
2)如果类中存在初始化语句,就依次执行这些初始化语句。
7、
8、
9、
1.2)数据库的隔离级别、事务、索引原理, 优化 SQL ;
1、隔离级别
①读未提交 : 可以看到其他事务没有提交的结果。等于没有任何隔离性。
②读已提交 :只能看到其他事务已经提交的改变。这种隔离级别会引起不可重复读。
③可重复读: 它保证了可重复读取同样的数据,即同一个事务多次读取操作数据会看到同样的数据。解决了不可重复读但可能造成幻读。
④可串行化 : 通过强制事务排序,解决了幻读的问题。它在每个读的数据行上面加上共享锁。(实际中基本不使用)
2、事务的特性
①原子性
事务要么全部提交成功,要么全部失败回滚,不能分割执行其中的操作。
②一致性
事务的执行不会破坏数据关系的完整性和业务逻辑的完整性。
③隔离性
一个事务不会被另一个事务影响,第一个事务执行完成后再执行另一个事务,但处于性能上的考虑,一般都需要事务并发执行,所以隔离程度有区别。
④持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3、数据库批处理有了解吗
4、explain 执行计划,数据库优化从哪几点入手
使用explain关键字可以知道MySQL是如何处理你的SQL语句的,
分析你的查询语句或是表结构的性能瓶颈。使用方法,在select语句前加上EXPLAIN就可以了。
1.#{}防止sql注入
2.使用索引,并且避免索引失效
3.有外键约束会影响插入和删除性能,如果程序能够保证数据的完整性,那在设计数据库时就去掉外键。在大型电商中尽量使用单表
4.表中允许适当冗余,利用空间换时间,提高查询效率
5.将常用数据从表中独立出来。比如 在登录业务中只需要查询用户名和密码。
5、数据库分库分表
6、什么是索引,索引有几种,索引原理
7、索引失效的原因
1.列上有运算
2.列上有函数
3.like查询是以%开头
4.使用了select*
5.使用or关键字
6.order by的坑
7.不满足最左原则
8.列对比
9.not in 和 notexists
8、聚集索引和非聚集索引的区别
9、什么字段不能做索引
10、什么情况下使用索引
11、MySQL数据库limit分页的使用
12、说一下怎么做数据库的事务,除注解外如何使用事务
13、事务的七种传播行为
什么是事务的传播行为:事务传播行为用来描述由某一个事务传播行为修饰的方法被嵌套进另一个方法时,事务如何传播。
必须具有事务的上下文 | 不需具有事务上下文 |
---|---|
PROPAGATION REQUIRED 在具有事务的上下文中运行,有事务在进行,那么被调用端将在该事务中运行否则的话重新开启一个事务 | PROPAGATION SUPPORTS不需具有事务但如果有一个事务的话,它也可以在这个事务中运行 |
PROPAGATION MANDATORY 必须在一个事务中运行,如果没有事务,将抛出异常表示 | PROPAGATION NOT SUPPORTED 总是不需具有事务,并挂起任何存在的事务。 |
PROPAGATION REQUIRES NEW 没有事务就开启一个新的事务。如果事务已经存在,则将这个存在的事务挂起。 | PROPAGATION NEVER 总是不需具有事务地,如果存在事务,抛出异常 |
PROPAGATION NESTED有事务在运行中,则嵌套在事务中运行,外层事务抛出异常回滚,那么内层事务必须回滚,但是内层事务不影响外层事务。如果封装事务不存在,则同propagation.required的一样 |
14、
15、缓存和数据库同步
16、项目如何保证数据安全
16、
1.3)多线程
1、线程生命周期
2、synchronized关键字
3、volatile关键字
4、ThreadLocal
5、 线程池
6、 AQS
7、异步是线程池的还是spring自带的
8、说一下线程池的几个参数
9、怎么创建一个多线程,有哪些方法实现,优劣是什么
10、新建一个线程,线程有哪些状态
11、
12、
13、
14、
15、
16、
1.4)Redis ,Linux服务器
1、redis默认几个库,redus默认端口号多少
2、redis用在项目哪里
3、Redis 分布式缓存框架
4、缓存雪崩,如何解决缓存雪崩
5、缓存穿透与缓存击
6、持久化机制
7、缓存淘汰策略
8、redis有哪些数据类型
9、工作中使用redis,最常用什么功能
10、讲一下Linux服务器部署项目
11、缓存和数据库同步
12、Linux常用命令
13、redis主从同步用在什么地方
14、redis多线程还是单线程
15、
16、
1.5)SpringCloud ,熟悉 Eureka、Nacos、Gateway、 OpenFeign、Nginx
1、SpringCloud 微服务框架,用过哪些组件
2、服务降级和服务熔断
3、熟悉 Eureka
4、熟练使用nginx,能讲一下nginx嘛Nacos
5、Gateway
6、OpenFeign
7、Nginx
8、dubbo运行起来需要什么组件,是怎么协作的
9、zookeeper注册中心有什么可以替换的吗
10、
11、
12、
13、
14、
15、
16、
1.6)RabbitMQ消息队列
1、熟悉RabbitMQ消息队列
2、幂等性问题的思考和总结,防重、幂等
幂等性问题的思考和总结,防重、幂等
3、重复消费问题
4、消息不丢失
5、高可用解决方案
6、
7、
8、
9、
10、
11、
12、
13、
14、
15、
16、
1.7)XXL-JOB,MongoDB,Docker
:
1、XXL-JOB介绍
2、MongoDB介绍
3、Docker介绍
4、
5、
6、
7、
8、
9、
1.8)spring ,springMVC,mybatis, springboot
1、mybatis里xml文件返回数据类型
mybatis里xml文件想返回list〈map〉数据类型/或者list〈bean〉,select标签里需要怎么写
2 、springboot常用注解
3、 springboot 定时任务
4、mybatis里面怎么实现分页
5、springboot自动装配原理
6、springbean的生命周期
7、mybatis防止SQL注入
8、spring的AOP功能怎么用呢
9、spring的设计模式
10、
11、
12、
13、
14、
15、
16、
第二章、其他问题
2.1)其他问题
1、会不会写单元测试
2、Java8有哪些新特性
3、有没有让你感到技术有困难最后攻克的难题
4、在基金项目里做了哪些事情
5、自我介绍一下
6、介绍一下最近的一个项目,项目的经历,具体参与项目的过程
7、项目中对接了哪几个接口呢,这些功能是直接分给你功能,还是说已经设计好了让你实现
实名认证这个功能,你刚拿到这个功能,具体需要做什么,具体的落地上是怎么实现的,做了以后和设计上有什么偏差,具体说一下和周边系统是怎么交互的