Java面试过程中遇到的问题
介绍工作经验+项目
自我介绍+教育背景+工作经历
介绍项目+项目用了那些技术,以及为什么选用这个技术
报表服务怎么实现的
java框架
spring clound特性,组件有那些以及作用
springCloud是一套微服务组件, 常用的Eureka,Ribbon,Hystrix,Feign,Gateway,Config,Bus(消息总线)等等。
SpringBoot特性
创建独立的Spring项目
内置Tomcat和Jetty容器
提供一个starter POMs来简化Maven配置
完全没有代码生成和xml配置文件 使用注解
提供了一系列大型项目中常见的非功能性特性,如安全、指标,健康检测、外部配置等
SpringBoot和springClound的区别
Spring Boot和Spring Cloud的主要区别在于它们的设计目的、使用方式和集成性。
1、设计目的和使用方式:
Spring Boot 主要用于快速构建独立的、可部署的Spring应用程序,它简化了Spring应用程序的配置和部署过程,使得开发者能够更专注于业务逻辑。Spring Boot提供了自动配置机制,根据项目所使用的依赖自动配置应用程序,并提供了内置的容器,使得应用程序可以独立运行,不依赖于外部的Web容器。1
Spring Cloud 是一个基于Spring Boot的框架,用于构建分布式系统。它提供了一套完整的分布式系统解决方案,包括服务注册与发现、负载均衡、熔断器、配置管理等功能。Spring Cloud集成了所有的服务治理组件,如Eureka、Ribbon、Feign等,这些组件都可以与Spring Boot一起使用,但并不是必须的。Spring Cloud的目标是建立一个“有生态系统”的框架,这个框架涵盖了微服务的各个方面。
2、集成性和扩展性:
Spring Cloud集成了服务治理组件,这些组件提供了可扩展的API,允许开发者根据需要进行定制。这使得Spring Cloud非常适合用于管理同一项目中的各项微服务。
相比之下,Spring Boot可以独立使用,用于快速开发单个微服务。虽然Spring Boot没有集成特定的服务治理组件,但它提供了默认大于配置的理念,很多集成方案已经为开发者选择好了,能不配置就不配置。
总结来说,Spring Boot 是一个快速开发单个微服务的框架,而 Spring Cloud 是一个用于构建和管理分布式系统中微服务的综合管理框架。Spring Cloud基于Spring Boot实现,提供了更全面的服务治理和分布式系统管理功能。
SSM介绍一下
事务
事务的特性
事务的传播行为
事务注解哪些情况会失效
redis数据类型,常用场景,穿透、击穿 、雪崩概念
Redis支持五种数据类型:string(字符串),hash(哈希),list(列表),set(集合)及sorted set (有序集合)
redis穿透、击穿 、雪崩概念,怎么预防?
Redis击穿、穿透和雪崩是指在高并发条件下,Redis服务出现的性能问题。
1、穿透:指缓存穿透,是指某个不存在的Key被大量并发请求,导致请求穿透缓存直接打到数据库,造成数据库压力剧增。
预防方法:使用布隆过滤器或者缓存空值来避免不存在的Key请求穿透到数据库。
2、击穿:指缓存击穿,是指一个Key非常热点,在某一时刻缓存正好失效,导致大量请求直接打到数据库上,造成数据库压力剧增。
预防方法:设置合理的缓存过期时间,并对热点数据做永不过期或者随机过期来避免全部失效。
3、雪崩:指缓存雪崩,是指缓存服务器宕机或网络问题导致,所有缓存失效,引起大量请求打到数据库上。
预防方法:实现缓存高可用,如使用Redis集群;使用缓存数据预热;设置缓存的过期时间分散开,避免同一时刻大量缓存失效。
具体实现可能需要结合业务场景和技术栈选择合适的解决方案。
mq消息队列
mq的应用场景:系统解耦,异步调用,流量削峰。
mq怎么防止重复消费,实现消息的幂等性
1、唯一ID + 去重表/缓存(消息去重标识 乐观锁)
可以在消息的属性中添加一个全局唯一标识,例如UUID,确保每条消息都具有唯一性。消费者在消费消息时,可以通过检查全局唯一标识来判断消息是否已经被消费过。(在消费者消费消息前,可以将消息的唯一标识保存在数据库或缓存中。在消费者接收到消息后,先检查数据库或缓存中是否存在该消息的唯一标识,如果存在,则表示该消息已经被消费过,可以忽略;如果不存在,则表示该消息是新的,可以进行消费。)
2、设置消息的过期时间
可以为消息设置一个过期时间,在消费者消费消息时,先判断消息是否已经过期,如果已经过期,则不进行消费。
3、消息确认机制(消息状态检查)
消费者在成功处理消息后,及时向MQ发送确认basic.ack(),告知消息已被消费,MQ可删除或标记已消费的消息。
4、实现幂等性
消息幂等性处理:在消费者内部实现代码逻辑,确保即使收到重复消息,也只执行一次处理逻辑。比如根据id的删除、查询业务天生幂等;
基于业务本身的幂等性。新增、修改等业务可以考虑基于数据库id唯一性、或者乐观锁机制确保幂等。本质与消息表方案类似。
5、事务消息
对于支持事务消息的消息队列(如RabbitMQ的事务模式),可以通过事务确保消息的处理要么全做要么全不做。
6、并发控制
es
Dubbo用过吗?SpringCloud 和 Dubbo 有哪些区别
分布式的容器有哪些?
分布式理论和概念了解过吗?
大数据都了解那些,Hadoop了解过吗?
内存溢出的问题
java基础
jdk8的新特性有哪些?
Lambda表达式、stream流、接口的增强(默认方法和静态方法)、新的日期API(LocalDate)、Optional中避免NullPointerException检查、引入重复注解、新增base64加解密API、新增方法引用格式、hashmap添加红黑树、支持并行(parallel)数组、对并发类(Concurrency)的扩展。
stream流 应用场景
集合
list set区别(有序、唯一、实现类、复杂度、遍历)
Map、Set、List是否有序
首先我们应该清楚这个概念:这里的有序和无序不是指集合中的排序,而是是否按照元素添加的顺序来存储对象。
1、List是按照元素的添加顺序来存储对象的,因此是有序的。他的实现类ArrayList、LinkedList、Vector都是有序的。
2、Set是无序的,并且set中的元素不能重复。set的底层实现其实是Map,它是计算key的哈希值来确定元素在数组中的存放位置,所以是无序的,应为在Map中key的值不能重复,所以set中的元素不能重复。它的实现类有:haseSet、TreeSet。
其中LinkedHashSet是有序的,其中haseSet用来保证数据唯一,List用来保证插入的顺序和存储的顺序一致。
3、Map是无序的,它的存储结构是哈希表<key,value>键值对,map中插入元素是根据key计算出的哈希值来存储元素的,因此他不是按照元素的添加顺序来存储对象的,所以Map是无序的。它的实现类有:HashMap、TableMap和TreeMap。
其中LinkedHashMap是有序的,hashMap用来保证存储的值键值对,list用来保证插入的顺序和存储的顺序一致。
hashmap linkedhashmap区别(有序、底层实现)
hashmap底层实现(红黑树的特性)
arraylist底层实现 初始容量 扩容倍数
红黑树的特性
红黑树是一种自平衡的二叉查找树,它通过特定的操作保持树的平衡,从而获得较高的查找性能。红黑树的特性主要包括:
1 颜色特性:每个节点要么是红色,要么是黑色。
2 根节点颜色:根节点是黑色的。
3 叶子节点颜色:叶子节点(NIL或NULL)是黑色的。
4 红色节点的子节点颜色:如果一个节点是红色的,则它的子节点必须是黑色的。
5 黑节点数目:从一个节点到该节点的子孙节点的所有路径上包含相同数目的黑节点。
这些特性确保了红黑树在插入和删除操作时能够保持相对平衡,避免了某些路径过长的情况,从而保证了最坏情况下的时间复杂度为O(log n),其中n是树中元素的数目。红黑树的这些特性使其在实际应用中表现出色,特别是在需要高效查找、插入和删除操作的场景中。
4、for循环,break,return,continue区别
创建多线程的四种方法
1、继承Jave.lang包中的Thread类,重写Thread类中的run()方法,在run方法中编写实现多线程代码
2、实现Jave.lang.Runnable接口,在run方法中编写实现多线程代码
3、实现Java.util.concurrent.Callable接口,重写Call()方法并通过使用Future接口获取call()方法返回的结果
4、利用线程池创建多线程
接口和抽象类区别
接口和抽象类都是用来定义对象的公共行为的,但二者有以下 7 点不同:
1、定义的关键字不同。interface、abstract
2、子类继承或实现关键字不同。implements、extends
3、类型扩展不同:抽象类是单继承,而接口是多继承。
4、方法访问控制符:抽象类无限制,只是抽象类中的抽象方法不能被 private 修饰;而接口有限制,接口默认的是 public 控制符。
5、属性方法控制符:抽象类无限制,而接口有限制,接口默认的是 public 控制符。
6、方法实现不同:抽象类中的普通方法必须有实现,抽象方法必须没有实现;而接口中普通方法不能有实现,但在 JDK 8 中的 static 和 defualt 方法必须有实现。
7、静态代码块的使用不同:抽象类可以有静态代码块,而接口不能有。
MySQL用的多深,会写一些函数,存储过程,复杂sql,数据量多大,数据量过大,性能问题。
mysql里面的锁有哪几种类型,
乐观锁,悲观锁
this和super的区别
jre、jdk、jvm 之间关系,以及作用是什么?
Java中的IO流分为哪几种,常用的IO流,以及输入流、字节流的类名都是什么?
一、文件流
1.字节流
(1)文件字节输入流:FileInputStream(读取硬盘,写入内存)
(2)文件字节输出流:FileOutputStream(读取内存、写入硬盘)
2.字符流
(3)文件字符输入流:FileReader(读取硬盘,写入内存)
(4)文件字符输出流:FileWriter(读取内存、写入硬盘)
二、转换流(字节流转字符流)
1.输入:字节输入流转换字符输入流InputStreamReader
2.输出:字节输出流转换字符输出流OutStreamWriter
三、缓冲流
1.字节流
(1)缓冲字节输入流BufferedInputStream(读取硬盘,写入内存)
(2)缓冲字节输出流BufferedOutputStream(读取内存、写入硬盘)
2.字符流+转换流
(1)缓冲字符输入流BufferedReader(读取硬盘,写入内存)
(2)缓冲字符输出流BufferedWriter(读取内存、写入硬盘