java后端面试题总结

该博客围绕Java开发展开,涵盖Java基础、数据库(Oracle、Redis、Mysql)、Spring框架、注解、多线程、设计模式等知识,还涉及HTTP、Maven、异常处理、单元测试、Docker等内容,同时分享了项目经验,如短信发送实现方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

日志框架

slf4j 日志门面 统一的接口

logback 日志框架 springboot自带的

使用 类上加上@slf4注解,打印信息log.info(“”,“”) 可以用{}占位符代替+

处理异常

1.自定义异常(状态码和信息)

2.全局aop处理异常 (controlleradvice+ExceptionHandler)

Java基础

抽象类和接口的区别:

  1. 抽象类可以有构造方法,接口中不能有构造方法。
  2. 接口中除了 static、final 变量,不能有其他变量,而抽象类中则不一定。
  3. 接口的方法默认是 public,所有方法在接口中不能有实现(Java 8 开始接口方法可以有默认实现),而抽象类可以有非抽象的方法。
  4. 接口方法默认修饰符是 public,抽象方法可以有 public、protected 和 default 这些修饰符(抽象方法就是为了被重写所以不能使用 private 关键字修饰!)。
  5. 一个类可以实现多个接口,但只能继承一个抽象类。
  6. 从设计层面来说,抽象是对类的抽象,是一种模板设计,而接口是对行为的抽象,是一种行为的规范。
  7. 应用 抽象类能不能有方法体

== 与 equals的区别

  • 如果两个引用类型变量使用==运算符,那么比较的是地址,它们分别指向的是否是同一地址的对象。结果一定是false,因为两个对象不可能存放在同一地址处。
  • 要求是两个对象都不是能空值,与空值比较返回false。不能实现比较对象的值是否相同。所有对象都有equals方法,默认是Object类的equals,其结果与一样。如果希望比较对象的值相同,必须重写equals方法

为什么重写 equals 还要重写 hashcode?

维护hashCode方法的常规约定:值相同的对象必须有相同的hashCode。

如果重写了equals而未重写hashcode方法,可能就会出现两个没有关系的对象equals相同的(因为equal都是根据对象的特征进行重写的),但hashcode确实不相同的。

哪些集合是线程安全的

haspmap的原理

重定向和转发的区别

ArrayList 扩容机制分析

无参构造方法 默认容量是0 第一次扩展时10 以后每次扩展是1.5倍左右 10+10/2=15

数据库

oracle常用函数

Redis

1.Redis支持多种数据结构,包括字符串、哈希表、链表、集合、有序集合、位图、Hyperloglogs等。

redis项目里用的

redis面试题

五大value存储类型
序列化方式:

1.JDK

2.String

3.JSON

4.xml

常用的序列化方式

1.key的序列化和反序列化(String)

2.value的序列化和反序列化(Json)

技术的应用场景

Mysql

MySql执行计划(关键词 EXPLAIN)

EXPLAIN SELECT * FROM users WHERE id IN (SELECT userID FROMuser_address WHERE address = “湖南长沙麓谷”) ;

执行计划的各个显示内容。
id select_type table type(访问类型,SQL 查询优化中一个很重要的指标,结果值从好到坏依次是:system > const > eq_ref > ref > range > index > ALL) possible_keys key rows filtered Extra
explain 结果中的 type 字段,表示(广义)连接类型,它描述了找到所需数据使用的扫描方式;

system 最快:不进行磁盘 IO
const:PK 或者 unique 上的等值查询
eq_ref:PK 或者 unique 上的 join 查询,等值匹配,对于前表的每一行,后表只有一行命中
ref:非唯一索引,等值匹配,可能有多行命中
range:索引上的范围扫描,例如:between、in、>
index:索引上的全集扫描,例如:InnoDB 的 count
ALL 最慢:全表扫描
建立正确的索引,非常重要;
使用 explain 了解并优化执行计划,非常重要;

索引怎么用 数据量大不大 分库分表

慢查询

MySQL慢查询就是在日志中记录运行比较慢的SQL语句
myini文件中 主要是慢查询的定义时间(超过2秒就是慢查询),以及慢查询log日志记录
long_query_time=2 slow_query_log = on

分析慢查询日志
EXPLAIN

Spring

事务

Spring的事务管理机制实现的原理,就是通过这样一个动态代理对所有需要事务管理的Bean进行加载,并根据配置在invoke方法中对当前调用的 方法名进行判定,并在method.invoke方法前后为其加上合适的事务管理代码,这样就实现了Spring式的事务管理。Spring中的AOP实 现更为复杂和灵活,不过基本原理是一致的。

springboot扫描包的原理和顺序

springboot参数的校验

@Valid 通过给参数加一系列的参数进行校验 @NotNull(非空) @NotBlank(字符串非空) @NotEmpty(字符串不是0和集合不是0)

2.创建基类请求类,父类方法验证参数,子类去继承父类

常见面试题

1.Spring如何解决循环依赖的问题 https://my.oschina.net/zhangxufeng/blog/3096394

2.IOC和AOP
https://mp.weixin.qq.com/s?__biz=Mzg2OTA0Njk0OA==&mid=2247486938&idx=1&sn=c99ef0233f39a5ffc1b98c81e02dfcd4&chksm=cea24211f9d5cb07fa901183ba4d96187820713a72387788408040822ffb2ed575d28e953ce7&token=1666190828&lang=zh_CN#rd

注解

Spring常用的注解

  1. @Autowired

  2. @Component

  3. @Controller @RestController

  4. @Service

  5. @Repository @

  6. @GetMapping @PostMapping 等价于@RequestMapping

  7. @RequestParam @RequestBody

  8. @Valid @NotNull(非空),@NotBlank(字符串非空),@NotEmpty(字符串不0和集合不0))

  9. @CrossOrigin

  10. 读取配置信息 @value

  11. @Import

  12. @ConfigurationProperties @EnableConfigurationProperties @Configuration

  13. @EnableScheduling(开启定时任务) @EnableAsync(开启多线程)

    Mybatis常用的注解

  14. @Mapper

  15. @Select @Insert

Java常用的注解

  1. @PostConstruct

##hibernate常用的注解:
1.@Length(min=, max=) 验证字符串长度是否在给定的范围之内

微服务常用的注解:

  1. @FeignClient(value = “服务名”)

处理常见的 HTTP 请求类型

@ControllerAdvice

多线程并发编程

##Java中Volatile关键字详解
Java中Volatile关键字详解

aop和oop的区别

面向切面编程(aop)是对面向对象编程(oop)的补充,
面向对象编程将程序分解成各个层次的对象,面向切面编程将程序运行过程分解成各个切面。
AOP从程序运行角度考虑程序的结构,提取业务处理过程的切面,oop是静态的抽象,aop是动态的抽象,
是对应用执行过程中的步骤进行抽象,,从而获得步骤之间的逻辑划分。

在应用上的区别:
接口更多的是在系统架构设计方法发挥作用,主要用于定义模块之间的通信契约。而抽象类在代码实现方面发挥作用,可以实现代码的重用,例如,模板方法设计模式是抽象类的一个典型应用,假设某个项目的所有Servlet类都要用相同的方式进行权限判断、记录访问日志和处理异常,那么就可以定义一个抽象的基类,让所有的Servlet都继承这个抽象基类,在抽象基类的service方法中完成权限判断、记录访问日志和处理异常的代码,在各个子类中只是完成各自的业务逻辑代码,公共的controller 实现createby等功能

设计模式

常见的设计模式:

  • 工厂模式 :

    1)简单工厂模式(静态工厂模式) 虽然某种程度不符合设计原则,但实际使用最多。

    2)工厂方法模式 不修改已有类的前提下,通过增加新的工厂类实现扩展。

    3)抽象工厂模式 不可以增加产品,可以增加产品族

    应用场景:

    1)JDK中Calendar的getInstance方法(静态工厂模式);

    2)JDBC中Connection对象的获取;

    3)Hibernate中SessionFactory创建Session;

    4)Spring中IOC容器创建管理bean对象

    5)XML解析时的DocumentBuilderFactory创建解析器对象;

    6)反射中Class对象的newInstance()。

  • 策略 观察者

spring主要用了哪几种设计模式

工厂设计模式

aop

3.aop
面向切面编程(AOP)完善spring的依赖注入(DI),面向切面编程在spring中主要表现为两个方面
1.面向切面编程提供声明式事务管理
2.spring支持用户自定义的切面

aop框架具有的两个特征:
1.各个步骤之间的良好隔离性
2.源代码无关性

编码习惯:

AOP ResultBean

###1.索引失效的7种情况
https://www.cnblogs.com/liehen2046/p/11052666.html

接口性能提升

1.使用@Async异步处理提高响应速度 https://blog.youkuaiyun.com/weixin_34186931/article/details/89564480

HTTP

http介绍

https://mp.weixin.qq.com/s/IArRC3Qf5MWq0uVGrsgzxw

加密方式:1.对称加密 2.非对称加密 3.混合加密 4.摘要

HTTP面试题汇总

  • Get和Post区别
  • HTTP与HTTPS区别
  • HTTP通信过程
  • 游览器输入一个地址。到页面展示中间经历了哪些步骤?
  • cookies机制和session机制的区别:
  • HTTP请求报文与响应报文格式
  • 一次完整的HTTP请求所经历的7个步骤
  • HTTP优化方案
  • HTTP优点缺点
  • URI和URL的区别
  • 如何判断是否为http
  • HTTP 1.1引入分块传输编码提供了以下几点好处
  • 长连接与短连接的区别,以及应用场景
  • 常见web攻击
  • 站内跳转和外部重定向有何区别
  • HTTP的keep-alive是干什么的?
  • 关于Http 2.0 你知道多少?
  • 讲讲304缓存的原理
  • HTTP与RPC异同
  • 从传输协议来说

maven

指令

1.maven上传snapshot指令

mvn -X deploy:deploy-file -DgroupId=permission-api -DartifactId=permission-api -Dversion=1.0-SNAPSHOT -Dpackaging=jar -Dfile=C:\Users\11398\Desktop\permission-api-1.0-SNAPSHOT.jar -Durl=http://47.105.181.65:23004/nexus/content/repositories/snapshots/ -DrepositoryId=Snapshots

maven打包

1.非springboot项目

https://blog.youkuaiyun.com/branwel/article/details/102528659

异常处理

1.建立统一返回类,定义错误码,定义成功和异常的返回格式

2.建立统一异常处理类继承RuntimeException,自定义业务异常

3.service层统一抛出异常,controller层统一返回异常信息

最近在做什么项目 简单说说

单元测试

docker

引入swagger不需要引入swagger静态页面和相关css,js

前端怎么写 浏览器的请求内容 postman测试内容 后台怎么写

@requestbody application/json 前端json postman json

@requestparam 一般用于简单参数!,二维数组这种不好用 form-data、x-www-form-urlencoded 前端用qs 浏览器中 formdata

功能模块

短信发送实现方式

单发短信

1.校验调用系统是否在sms中注册

2.单发短信 ( 腾讯云单发短信)  调的腾讯云的SDK

3.记录入库

4.保存发送日志


群发相同短信内容
 

1.校验调用系统是否在sms中注册

2.群发短信 ( 腾讯云发短信)  调的腾讯云的SDK

3.遍历记录入库

4.保存发送日志

设置可见/不可见字段:

  • 语法:

alter table 表名 modify (字段 [ invisible | visible ]);-- 可见:visible , 不可见:invisible

注意:只有在Oracle12c后的版本才有。可在创建表,设置类型的时候,加上可见/不可以设置。

如果设置不可见状态的列,在执行"desc 表名"和"select * from 表名"语句时是看不见设置的列,可以查看"user_tab_columns"表,查看某表的所有列(包括已设置不可见列)。以及在执行操作语句也会忽略被设置不可见列,如"insert into A表 values (值1,值2……)"被设置不可见列是无法插入数据。

复制对象 --huttols 的方法。

RUN_YEAR 因库中时间是0点00分00秒 所以开始时间是 如库中时间是2021-1-1 那开始时间就是2020-12-31 23:59:59

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值