Java面试知识点复习​_kaic

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: Java面试知识点复习​_kaic

一、后端基础

1.Java基础、集合、线程、异常(自定义异常)流

2.mysql、redis、mongodb(为什么使用)

3.ssm、springboot、springcloud、mybatis-plus

1.接口和抽象类的区别

二、前端基础

1.事件

三、实习和项目

1.博客项目的日志配置(切面)

四、408

1.数据机构与算法

2.计算机网络

2.1 osi七层模型和tcp五层模型

2.2 udp和tcp的区别

2.3 udp和tcp分别对应那些协议

2.4 三次握手和四次挥手

2.5 udp和tcp的区别

2.6 什么是http协议?http和https的区别?https的过程

2.7 URI和URL的区别?

2.8 put和post的区别?

2.9 常见的http返回码有哪些?

2.10 http请求报文和响应报文的组成?

2.11 ip地址的分类

2.12 浏览器输入ip地址后的执行过程

2.13 ip和子网掩码

五、尚易通

**知识点

1.nacos

2.ngixs

3.gateway

1.除了统一多个服务的入口,并分发请求之外

2.解决跨域问题(域名不同或域名相同但端口号不一样),跨域问题是浏览器的限制不是服务之间的额限制,当一个端口的前端调用另一个端口号的前端时就会发生跨域。

3.

4.fegin

这里是引用

5.ribbonMQ

1.消息的概念

2.消息队列的概念

3.消息队列的三个作用

4.springboot集成ribbitmq的步骤

6.在远程外部系统时的调用方法

7.jwt token

1.环境搭建

采用maven来构建和管理项目,其由一个顶级父模块管理一些公共的依赖版本,在顶级父模块下创建common公共model,用来创建一些工具等,还有业务模块专门用来创建与医院连接相关接口、平台管理相关接口,还有其他模块(支付、用户)

2.医院设置

头部url

@RequestMapping("/admin/hosp/hospitalSet")

1

2.1 医院设置信息插入接口

@PostMapping("saveHospitalSet")

1

1.设置医院状态为可用(1表示可用 0 表示不可)

2.自动生成秘钥并采用md5加密后赋值给实体对象

3.将实体对象进行插入

4.根据插入返回状态码

2.2 统一的返回类构造

2.3 医院设置分页条件查询

@PostMapping("findPageHospSet/{current}/{limit}")

1

1.通过current和limit构造Page类,Page<HospitalSet> page = new Page<>(current,limit);

2.构造querywarpper,

3.获取条件对象中属性(hosname,hoscode)进行判空if (!StringUtils.isEmpty(hosname)){

4.通过mq中Iservice接口提供的page方法传入参数hospitalSetService.page(page, queryWrapper);查询,返回一个page对象

5.通过统一返回类返回数据return Result.ok(page1);

2.4 医院设置更新接口

@PostMapping("updateHospitalSet")

1

1.调用方法直接更新 hospitalSetService.updateById(hospitalSet);

2.根据返回值boolean类型返回

2.5 医院设置删除接口

@DeleteMapping("{id}")

1

1.根据传入的编号直接调用删除hospitalSetService.removeById(id);

2.6 医院设置批量查询

@DeleteMapping("batchRemoveHospitalSet")

1

1.根据请求体list直接调用hospitalSetService.removeByIds(list);

接收方式(@RequestBody List<Long> list)

2.7 医院设置根据id查询

@GetMapping("getHospitalSet/{id}")

1

1.根据id直接调用hospitalSetService.getById(id);

3.数据字典

3.1 用途

在管理系统中,会用到大量的频繁使用、比较固定的数据比如省市区三级联动数据还有职业分类数据,通常会创建数据字典来管理和查询这些数据

3.2 数据的导入

使用EsayExecl来读写execl文件

3.3 数据的导出

这里是引用

3.1 数据的分级显现

@GetMapping("findByDictCode/{dictCode}")

1

1.根据dictCode查出该数据对应的id,

2.让该id作为parent_id查询二级数据,

4.monogobd

4.1使用原因

由于monogobd是非关系系数据库(NoSql),对海量数据的访问和读写是非常高效的,适合高并发的情况。

4.1

5.医院上传接口

6.医院管理

6.1

7.排班管理和网关和手机登录

7.1排班管理

7.2网关

Gateway网关统一多个服务作为入口,然后分发接口

7.3手机登录

1.从请求对象中接收手机号和验证码参数

2.对参数判空

3.校验验证码是否正确

4.如果正确,根据手机号判断是否为第一次登录(如果是:将该数据存入数据库中,不是:直接进行接下来的验证)

5.校验用户是否为可用的状态

6.设置返回信息(jwt生成token)

8.oss、用户认证、就诊人管理

8.1oss

8.1.1概念

由于在用户认证的过程中需要上传图片等文件,所以需要集成文件服务,oss是阿里的一个分布式的文件服务系统。

在访问时 :需要把连接阿里的id和秘钥放在配置文件中

8.2用户认证

8.2.1后台管理

(1)用户的锁定

使用restful风格来传递参数;以下为在service层的判断逻辑

前提:1表示锁定 0表示解锁

1.判断传递的状态值为0或1方可继续

2.根据用户id查询出用户信息赋给对象

3.通过对象更改状态码

4.把对象扔进方法中baseMapper.updateById(userInfo);

(2)显示用户详情

通过HttpServletRequest 获取到用户id

2.在service层进行两部分的查询(根据用户id查询出用户的认证信息,然后根据用户id查询出与用户关联的就诊人信息),存放到map中返回前端

(3)用户审核通过或不通过

此种传参方法没有使用请求体的方式,所以需要查一次,更一次

1.从HttpServletRequest 中获取用户id

2.根据id查出信息赋值给对象,

3.设置对象的状态

4.做更新

这里是引用

8.2.2前台管理

(1)用户的认证信息上传

@ApiOperation("用户认证")

   @PostMapping("auth/userAuth")

   public Result userAuth(@RequestBody UserAuthVo userAuthVo, HttpServletRequest request) {

       //传递两个参数,第一个参数用户id,第二个参数认证数据vo对象

       userInfoService.userAuth(AuthContextHolder.getUserId(request),userAuthVo);

       return Result.ok();

   }

   

   //service层

   //用户认证

   @Override

   public void userAuth(Long userId, UserAuthVo userAuthVo) {

       //根据用户id查询用户信息

       UserInfo userInfo = baseMapper.selectById(userId);

       //设置认证信息

       //认证人姓名

       userInfo.setName(userAuthVo.getName());

       //其他认证信息

       userInfo.setCertificatesType(userAuthVo.getCertificatesType());

       userInfo.setCertificatesNo(userAuthVo.getCertificatesNo());

       userInfo.setCertificatesUrl(userAuthVo.getCertificatesUrl());

       userInfo.setAuthStatus(AuthStatusEnum.AUTH_RUN.getStatus());

       //进行信息更新

       baseMapper.updateById(userInfo);

   }

在这里插入代码片

1

(2)认证通过的显示

直接通过用户id查询,用户id是通过HttpServletRequest获取,所有的登录后访问的接口都需要此方式获取用户id

 

8.3就诊人管理

8.3.1就诊人的添加

这里是引用

8.3.2获取就诊人信息

1.根据就诊人id查询出就诊人信息,此时查出的信息中(省市区,证件类型都是以code编号存在),所以要通过fegin远程调用数据字典服务

//Patient对象里面其他参数封装

   private Patient packPatient(Patient patient) {

       //根据证件类型编码,获取证件类型具体指

       String certificatesTypeString =

               dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(), patient.getCertificatesType());//联系人证件

       //联系人证件类型

       String contactsCertificatesTypeString =

               dictFeignClient.getName(DictEnum.CERTIFICATES_TYPE.getDictCode(),patient.getContactsCertificatesType());

       //省

       String provinceString = dictFeignClient.getName(patient.getProvinceCode());

       //市

       String cityString = dictFeignClient.getName(patient.getCityCode());

       //区

       String districtString = dictFeignClient.getName(patient.getDistrictCode());

       patient.getParam().put("certificatesTypeString", certificatesTypeString);

       patient.getParam().put("contactsCertificatesTypeString", contactsCertificatesTypeString);

       patient.getParam().put("provinceString", provinceString);

       patient.getParam().put("cityString", cityString);

       patient.getParam().put("districtString", districtString);

       patient.getParam().put("fullAddress", provinceString + cityString + districtString + patient.getAddress());

       return patient;

   }

8.3.3后台管理

这里是引用

9.预约下单

9.1查询可预约排版数据

这里是引用

9.2查询排版数据

9.3下单

1.通过远程调用获取到:

根据就诊人id就诊人信息

根据排版id获取到排班信息

2.判断当前时间是否在预约时间范围内(时间判断)

3.通过远程调用“根据医院code获取签名秘钥”

4.生成一个订单交易号

5.将以上数据封装到订单对象中

6.将此订单数据插入到数据库中

7.将数据以封装到map中向医院发起远程调用

8.如果医院返回值为200:将医院返回值(//预约记录唯一标识//预约序号//取号时间//取号地址//更新订单)封装到订单对象中,更新本地数据

9.从医院返回值中:

将“排版可预约数”和“排版剩余预约数”封装到OrderMqVo对象中

然后将就诊人电话和短信模板等内容封装到MsmVo中

最后在将MsmVo封装到OrderMqVo中

10,将封装好的OrderMqVo扔到消息队列中

rabbitService.sendMessage(MqConst.EXCHANGE_DIRECT_ORDER, MqConst.ROUTING_ORDER, orderMqVo); 让其消息队列监听器监听后,完成排班预约数的更新和短息发送

9.4查询订单列表

1.根据page和limit构造一个page对象Page<OrderInfo> pageParam = new Page<>(page,limit);

2.构造条件并判空(//医院名称//就诊人名称//订单状态//安排时间)

QueryWrapper<OrderInfo> wrapper = new QueryWrapper<>(); if(!StringUtils.isEmpty(name)) { wrapper.like("hosname",name); }

3.调用方法查询baseMapper.selectPage(pageParam, wrapper);

10.微信支付

11.取消订单

12.定时任务与统计

六、面试总结

1.你对分布式是怎么理解的?

2.你的这个分布式项目中大概用了那些服务?

3.springcloud中用到了那些组件?

1.nacos

注册中心;

在微服务中,有服务的消费者,有服务的提供者

继承步骤:

(1)引入依赖

(2)在服务的配置文件中设置nacos的地址

(3)在服务的启动类上添加@EnableDiscoveryClient该注解的作用是“让注册中心发现,并扫描该服务”

2.feign

属于rpc的远程盗用,使用的是tcp/ip协议

集成步骤:

(1)导入依赖

(1)在调用者的启动类上加上注解:@EnableFeignClients (该注解的作用是客户端(允许客户端使用feign调用,扫描被@EnableFeign标注的interface接口)

@FeignClient(value = "service-cmn")//指明调用的那个服务

@Repository

public interface DictFeignClient {

   //根据dictcode和value查询

   @GetMapping("/admin/cmn/dict/getName/{dictCode}/{value}")

   public String getName(@PathVariable("dictCode") String dictCode, @PathVariable("value") String value);

   //根据value查询

   @GetMapping("/admin/cmn/dict/getName/{value}")

   public String getName(@PathVariable("value") String value);

}

3.gateway

网关,统一客户端的请求,然后分发请求

集成步骤:

(1)导入依赖

(2)添加跨域插件

(3)设置配置文件(设置服务的服务名和路由)

4.消息队列:详情

4.说下你对spring的理解?

4.1 什么是IOC?底层实现原理?有几种依赖注入的方式?

什么是IOC?

控制反转:把创建和调用bean的工作交给spring管理

目的是:降低耦合性

底层实现原理?

xml解析 工厂模式 反射

有几种依赖注入(注入属性)的方式?

1.通过set

2.通过构造器的方式

4.2 @Resourse和@Autowried的区别 参考文章

1.@Resourse是java提供的 @Autowried是spring提供

2.@Resourse的采用的是ByNname注入,而@Autowried采用的是ByType注入

3.ByName是通过set方法名小写与ioc中的BeanId去匹配,ByType是根据set方法中参数(接口)的实现类的类名的小写去与IOc中的BeanId去匹配,

4.当接口有多个实现类的时候使用@Qualifier(“helloWorldEnglishImpl”)注解进行标识

(1)spring创建对象的作用域?

有五种,常用的有两种

1.当创建对象时,scope=“singleton” (单例模式),既然是单例模式,每次创建的对象都是同一个,具有全局唯一性,在整个作用域中只有一个。

2.scope=“prototype”(原型模式),每次创建的对象都不一样

(2)spring创建对象是单例的,如果在类中定义全局变量的话会产生严重的线程安全问题*****

(3)ioc和aop(底层实现原理)详情

5.jdk动态代理

8.mybatis

8.1orm框架Mybatis中的#和$区别

8.2mybatis中常用的标签

1.<sql id="xxxx">用来存放字段的标签

2.<select > <insert> ,<update> <delete>

3.<resutMap> 查询结构和实体对象的映射

4.<include ref="xxx"> 在增删改查中引入<sql>中的字段标签

8.3mybatis中的接口是如何与xml中的sql绑定的

在mapper映射文件中通过namespace属性定义接口全路径,然后在增删改查的标签中通过id属性与接口中方法进行绑定。

8.4 如何做多表联查

1.编写联查sql语句

2.通过resultMap标签映射

3.在resultMap中如果有对象中对象的属性,通过<assocation property="user" >将关联的对象属性进行映射

10.嵌套结构和嵌套查询的区别:详情

11.mybatis中插入数据的时候如何获取主键

在mapper的映射文件中,插入标签<insert useGeneratedKeys=‘’“ture” Keyproperity="id">

12.hashmap的底层实现

13.cookie与session的区别(cookie和session的关系)

1.由于http请求时无状态的,所以在访问服务器的时候创建一个session,把sessionid返回给浏览器作为cook储存,这样以来就会浏览器就会识别到客户端的身份了。

14.如果浏览器把cookie禁用后还能使用session吗?(url重写)

cookie禁用后,每次访问session的时候会缺少sessionid,所以服务器就不能正确的识别客户端了。

但是通过重写url地址,将sessionid作为请求参数去访问服务器,也可以正常使用

15.mysql的隔离级别(在使用的过程中有没有改变过)

(1)默认的隔离级别?

1.读取未提交内容

2.读取已提交内容

3.可重复读

4.序列化

(2)什么是脏读、幻读和不可重复读?详情

1.脏读:事务A读取事务B修改未提交的数据

2.不可重复读:事务a读取事务b修改提交的数据

3.幻读:事务a读取事务b增加或删除后提交的数据

幻读和不可重读的区别是:不可重读侧重”修改“ 而幻读侧重于”增删“

(4)数据库的三大范式?详情

1.第一范式:保证每列的原子性,每列不可分割,例如地址中需要把省市区详细说明

2.第二范式:保证每列数据属性都要和主键有直接的关系,例如:在商品订单表中,商品的单价和数量和订单没有直接的关系,

3.避免在属性中出现传递依赖的关系。

(5)事务的四大特性

1.原子性:在操作数据的过程中,要么全成功,要么全不成功

2持久性:在一个事务提交后对于数据的改变是永久性的

3.隔离性:多个事务之间互不影响

4.一致性:同一个事务中,多次读取同一个数据的内容是一致的

15.平常的工作中是怎么使用redis的?(尚易通举例)

redis必问击穿、穿透、雪崩、单线程、双写一致性、日志、数据底层结构实现、分布式锁

(1)如何保证缓存与数据库的双写一致性?

(2)redis的几种类型和应用场景?

(3)redis的持久化策略?(那个效率更高)

16.什么是restful风格?

17.如何使用linux动态的查看一些日志?

18.不使用注解框架的情况下如何配置给类配置日志,如果监测

如果是tomcat部署的话:使用tail -f 文件名方式:详情

19.java反射和代理

20mvc和前后端分离的区别.详情

21、tyr{}catcah(){ return }finally{}的执行过程:详细

22.spring如何创建对象

1.在spring的xml配置文件中定义标签其中id是唯一标识

2.通过ClassPathXmlApplication读取spring.xml文件

3.调用getBeand(id)获取对象

23.java的封装

1.将类中的属性设置为private,隐藏对象的属性,外部不能直接访问对象的属性,对外提供固定的的访问属性的方法

24.mybatis的动态sql

1. 在where的后面必须添加1=1,否则会出现多余and情况

2.省去1=1的情况

3. 遍历数组,需要

24.1mybatis如何实现分页操作

1.引入PageHelper的依赖

2.手动配置分页插件

3.先通过PageHelp.startPage(currnt,num)》查询语句结果集>将结构集放到PageInfo中

PageHelper.startPage(page,size); List<BlogVo> blogVos = blogServie.selecSearch(blogSearch); PageInfo<BlogVo> pageInfo = new PageInfo<>(blogVos);

这里是引用

25.linux命令

25.1查看正在运行的服务端口号和进程号

netstat  -tnlp

1

根据进程号杀死进程

kill -9  pid

1

25.2 tail -n 和tail -f 日志详情

tail -f

动态的监控服务的日志

监控tomcat中catalina.out

26.Mysql

26.1Mysql存储引擎

Innodb:支持事务、注重多功能的拓展、不支持全文索引

myisam:不支持事务、注重性能、支持全文索引

26.1Mysql语句执行的顺序

1.from where groupby having select orderby limit

27.SpringMVC

27.1 执行流程:详情

27.2 springmvc设计组件的功能

1.处理映射器(HandlerMapping):根据url找到handler

2.处理适配器(HandlerAdapter):根据根据响应的去指向Handler

3.视图解析器(ViewResolver):解析视图,将逻辑视图转化为真正的视图

27.3 springmvc处理请求的过程中在那个环节将参数分装到Bean中

处理适配器这一步骤

28.反射

28.1 反射

1.Class类的对象用于表示当前运行的 Java 应用程序中的类和接口。

2.关于反射:详情

(1)什么是反射?

(2)

28.2 动态代理


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
1月前
|
监控 Java 应用服务中间件
高级java面试---spring.factories文件的解析源码API机制
【11月更文挑战第20天】Spring Boot是一个用于快速构建基于Spring框架的应用程序的开源框架。它通过自动配置、起步依赖和内嵌服务器等特性,极大地简化了Spring应用的开发和部署过程。本文将深入探讨Spring Boot的背景历史、业务场景、功能点以及底层原理,并通过Java代码手写模拟Spring Boot的启动过程,特别是spring.factories文件的解析源码API机制。
76 2
|
26天前
|
Java 程序员
Java社招面试题:& 和 && 的区别,HR的套路险些让我翻车!
小米,29岁程序员,分享了一次面试经历,详细解析了Java中&和&&的区别及应用场景,展示了扎实的基础知识和良好的应变能力,最终成功获得Offer。
66 14
|
1月前
|
存储 缓存 算法
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
本文介绍了多线程环境下的几个关键概念,包括时间片、超线程、上下文切换及其影响因素,以及线程调度的两种方式——抢占式调度和协同式调度。文章还讨论了减少上下文切换次数以提高多线程程序效率的方法,如无锁并发编程、使用CAS算法等,并提出了合理的线程数量配置策略,以平衡CPU利用率和线程切换开销。
面试官:单核 CPU 支持 Java 多线程吗?为什么?被问懵了!
|
1月前
|
存储 算法 Java
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
本文详解自旋锁的概念、优缺点、使用场景及Java实现。关注【mikechen的互联网架构】,10年+BAT架构经验倾囊相授。
大厂面试高频:什么是自旋锁?Java 实现自旋锁的原理?
|
1月前
|
存储 设计模式 SQL
[Java]知识点
本文涵盖Java编程中的多个知识点,包括静态与动态代理、基本数据类型转换、设计模式、异常处理、类加载、序列化、ORM框架、IPv4地址分类、编译与解释等。文章详细介绍了每个知识点的原理和使用方法,并提供了相关示例和注意事项。
47 16
[Java]知识点
|
1月前
|
存储 缓存 Oracle
Java I/O流面试之道
NIO的出现在于提高IO的速度,它相比传统的输入/输出流速度更快。NIO通过管道Channel和缓冲器Buffer来处理数据,可以把管道当成一个矿藏,缓冲器就是矿藏里的卡车。程序通过管道里的缓冲器进行数据交互,而不直接处理数据。程序要么从缓冲器获取数据,要么输入数据到缓冲器。
Java I/O流面试之道
|
1月前
|
Java 编译器 程序员
Java面试高频题:用最优解法算出2乘以8!
本文探讨了面试中一个看似简单的数学问题——如何高效计算2×8。从直接使用乘法、位运算优化、编译器优化、加法实现到大整数场景下的处理,全面解析了不同方法的原理和适用场景,帮助读者深入理解计算效率优化的重要性。
35 6
|
1月前
|
网络协议 Java 物联网
Java网络编程知识点
Java网络编程知识点
45 13
|
1月前
|
存储 缓存 Java
大厂面试必看!Java基本数据类型和包装类的那些坑
本文介绍了Java中的基本数据类型和包装类,包括整数类型、浮点数类型、字符类型和布尔类型。详细讲解了每种类型的特性和应用场景,并探讨了包装类的引入原因、装箱与拆箱机制以及缓存机制。最后总结了面试中常见的相关考点,帮助读者更好地理解和应对面试中的问题。
61 4
|
1月前
|
存储 Java 程序员
Java基础的灵魂——Object类方法详解(社招面试不踩坑)
本文介绍了Java中`Object`类的几个重要方法,包括`toString`、`equals`、`hashCode`、`finalize`、`clone`、`getClass`、`notify`和`wait`。这些方法是面试中的常考点,掌握它们有助于理解Java对象的行为和实现多线程编程。作者通过具体示例和应用场景,详细解析了每个方法的作用和重写技巧,帮助读者更好地应对面试和技术开发。
129 4