Java面试知识点复习​_kaic

本文涉及的产品
云数据库 Redis 版,社区版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介: 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
相关文章
|
15天前
|
SQL 分布式计算 监控
Sqoop数据迁移工具使用与优化技巧:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入解析Sqoop的使用、优化及面试策略。内容涵盖Sqoop基础,包括安装配置、命令行操作、与Hadoop生态集成和连接器配置。讨论数据迁移优化技巧,如数据切分、压缩编码、转换过滤及性能监控。此外,还涉及面试中对Sqoop与其他ETL工具的对比、实际项目挑战及未来发展趋势的讨论。通过代码示例展示了从MySQL到HDFS的数据迁移。本文旨在帮助读者在面试中展现Sqoop技术实力。
27 2
|
15天前
|
监控 负载均衡 Cloud Native
ZooKeeper分布式协调服务详解:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入剖析ZooKeeper分布式协调服务原理,涵盖核心概念如Server、Client、ZNode、ACL、Watcher,以及ZAB协议在一致性、会话管理、Leader选举中的作用。讨论ZooKeeper数据模型、操作、会话管理、集群部署与管理、性能调优和监控。同时,文章探讨了ZooKeeper在分布式锁、队列、服务注册与发现等场景的应用,并在面试方面分析了与其它服务的区别、实战挑战及解决方案。附带Java客户端实现分布式锁的代码示例,助力提升面试表现。
30 2
|
15天前
|
数据采集 消息中间件 监控
Flume数据采集系统设计与配置实战:面试经验与必备知识点解析
【4月更文挑战第9天】本文深入探讨Apache Flume的数据采集系统设计,涵盖Flume Agent、Source、Channel、Sink的核心概念及其配置实战。通过实例展示了文件日志收集、网络数据接收、命令行实时数据捕获等场景。此外,还讨论了Flume与同类工具的对比、实际项目挑战及解决方案,以及未来发展趋势。提供配置示例帮助理解Flume在数据集成、日志收集中的应用,为面试准备提供扎实的理论与实践支持。
25 1
|
16小时前
|
JavaScript 前端开发 Java
【JAVA面试题】什么是引用传递?什么是值传递?
【JAVA面试题】什么是引用传递?什么是值传递?
|
2天前
|
存储 安全 Java
[Java基础面试题] Map 接口相关
[Java基础面试题] Map 接口相关
|
2天前
|
Java
[Java 面试题] ArrayList篇
[Java 面试题] ArrayList篇
|
3天前
|
Java 调度
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
Java面试必考题之线程的生命周期,结合源码,透彻讲解!
29 1
|
3天前
|
设计模式 搜索推荐 Java
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
面试官不按套路出牌,上来就让聊一聊Java中的迭代器(Iterator ),夺命连环问,怎么办?
12 0
|
3天前
|
存储 安全 Java
每日一道Java面试题:说一说Java中的泛型?
今天的每日一道Java面试题聊的是Java中的泛型,泛型在面试的时候偶尔会被提及,频率不是特别高,但在日后的开发工作中,却是是个高频词汇,因此,我们有必要去认真的学习它。
15 0
|
3天前
|
Java 编译器
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
每日一道Java面试题:方法重载与方法重写,这把指定让你明明白白!
15 0