Java后端模拟面试 题集④

1.你先作个自我介绍吧

面试官您好,我叫张睿超,来自湖南长沙,大学毕业于湖南农业大学,是一名智能科学与技术专业的统招一本本科生。今天主要过来面试贵公司的Java后端开发工程师岗位。

大学里面主修的课程是Java、Python、数字图像处理、JavaEE。

大学期间,英语获得6级460分,参加过华为云的比赛,获得了全国高校绿色计算系列大赛团体三等奖。

我熟悉的技术栈在简历上都写了,我自己认为自己的亮点在以下几点:能进行简单的JVM调优;有实际处理高并发问题的经验;熟悉MySQL的操作,了解数据库调优原理;熟悉Linux的基本操作。

我自学C#两周、听学校讲解Python的Django框架2周,都写出了简单的项目;半年时间研究出了一个图像加密算法,并发表为了毕业论文。Java学习了一个学期、自学了2个月,之后在校企合作的项目中做出了这两个Java项目。

领导过小组作出Django框架的项目,参与过校企合作的两个Java项目。

了解到贵公司的业务需求偏向于xxx,我正好擅长xxx,所以我来应聘贵公司的Java开发岗位。

(或者衔接)

了解到贵公司的业务需求偏向于xxx,我最近做了一个xx项目,正好做了xxx,您看需不需要作一个简单的项目介绍。

2.你说一下这个IoC和AOP

IoC:(Inverse of Control)控制反转,也叫DI依赖注入,指的是将对象的创建权交给 Spring 容器去创建。(然后举例轮子和汽车)

其实,IoC有很多种方式。不仅是Spring技术中最常用的Bean注入,还有构造方法、Setter方法实现。

AOP:(Aspect Oriented Programming)面向切面编程,能增强Spring中具体业务的功能,能实现鉴权或公共字段填充的业务。

动态代理主要有两种方式,JDK动态代理和CGLIB动态代理。

SpringMVC用的三级缓存而不是二级缓存,其中原因之一就是方便使用AOP。

关于SpringMVC使用三级缓存,我这里可以给你讲一下,……

关于我们用AOP做的公共字段填充,我这里可以给你讲一下,……

3.JWT了解过吗,有用过吗

了解的,有用过。

JWT就是JSON Web Token,是继Cookie、Session之后一个比较好用的身份验证技术。

Cookie是HTTP协议支持的技术,这是它的优点。

但它的缺点也很明显,它不支持移动端APP,比如Android、IOS;第二点是它不安全,用户自己可以禁用Cookie;第三点是它不能跨域。

Session则是基于Cookie的服务器会话跟踪技术,优点是存储在服务端,安全。

缺点也很明显,因为是基于Cookie的,Cookie自带的毛病它都有:移动端APP不能用、用户自己可以禁用、不能跨域;除此以外,搭建了集群的服务器它也无法使用;它还占用服务器内存。

而企业常用的JWT技术则完美解决了上述的问题。PC端、移动端,它都行;集群中,它也能用;不需要服务器存储,不给服务器带来存储压力。

如果要说它有什么缺点,那就是需要自己实现吧。

那么怎么实现呢?我们这样把JWT加入我们的登录流程:

首先浏览器中访问登录界面,校验用户登录成功后,我们后端就生成一个JWT令牌,并将这个JWT令牌返回给前端。

前端拿到JWT令牌后存起来,后续的请求的请求头都带上这个。

然后后端统一拦截就检查这个JWT,就完成了校验。

JWT令牌包括三部分:

Header头,记录令牌类型、签名算法等。 例如:{"alg":"HS256","type":"JWT"}

Payload有效载荷,携带一些自定义信息、默认信息等。 例如:{"id":"1","username":"Tom"}

Signature签名,防止Token被篡改、确保安全性。将header、payload,加入指定秘钥,通过指定签名算法计算而来。

4.es用过吗,你们是怎么用到的

我们用到了es,在我的外卖项目中,为了提供商家搜索的功能,我们设计了es的搜索流程。

首先,基本的搜索接口4方面分别是,请求方式POST,请求路径为/shopSearch/list,请求参数有关键词、页数、分页大小、排序方式,返回值为页面结果类。

首先定义好Controller;

然后准备设置好ES官方提供的Java语言客户端,Java HighLevel Rest Client,在启动类中创建一个对应Bean,初始化时传入ES客户端的ip地址;

最后写业务处理Service层。

  1. 首先准备请求Request
  2. 然后准备DSL,包括query和请求分页
  3. 第三步发送请求
  4. 第四步进行解析

解析的具体流程是:

  1. 对响应response.getHits()初步解析
  2. getTotalHits().value获取总条数
  3. 再getHits()获取文档数组
  4. 开始遍历,getSourcceAsString()获取文档source
  5. 然后反序列化parseObject
  6. 最后放入集合
  7. 最后的最后封装返回

然后,我们扩展基础搜索,加上过滤条件,比如在排序上,可以综合排序、销量优先、速度优先等;在优惠活动中,可以选择一些日常举办的活动;还有选择价格的范围等。

明确了业务之后,我们做具体的代码工作:

  1. 我们对对应传参的实体类进行修改,增加这些字段的选项
  2. 然后在业务逻辑,即service层中,在准备DSL的阶段增加绑定查询字段的步骤。
    1. 首先构建BoolQueryBuilder bool = new ~;
    2. 然后添加过滤条件:
      1. 分别判断传入的实体类中过滤参数不为空,比如优惠活动 params.getEvent()!=null && !params.getEvent().equals("");
      2. 一旦不为空,就对构建的BoolQueryBuilder进行过滤条件的构建,即bool.filter(QueryBuilders.termQuery("event", params.getEvent());
      3. 至于价格过滤,filter中的参数是这样的:QueryBuilders.rangeQuery("price").gte(params.getMinPrice()).lte(params.getMaxPrice())
    3. 最后放入查询请求的source中, request.source().query(bool);

第二个扩展是添加根据地理位置选择就近的餐馆。

这个在请求和响应中分别添加排序的操作就可以。

第三个扩展是添加店家竞价排名。

我们用function_score查询实现,它包括了3个方面要确定:

  1. 过滤条件:查询出符合条件的,进一步进行分数计算。
  2. 算分函数:计算出来分数,以便进行比较。包括
    1. weight使用权重
    2. random_score计算随机数
    3. field_value_factor以文档中的某个字段值作为函数结果
    4. script_score自定义算分函数算法
  3. 运算模式:计算的分数和原始值,原始值是根据词频等计算出的,进行操作,得到最终结果。包括
    1. multiply:相乘
    2. replace:用function score替换query score
    3. 其它,例如:sum、avg、max、min

我们这里确定的三个方面是:

  1.  过滤条件:添加isAD字段,为true则进行加权计算
  2. 算分函数:weight
  3. 运算模式:默认的multiply

代码层面的改动,

  1. 首先在实体类中添加isAD字段
  2. 然后在DSL中绑定过滤条件时,添加算分,即
    FunctionScoreQueryBuilder functionScoreQuery =QueryBuilders.functionScoreQuery(// 原始查询,相关性算分的查询boolQuery,// function score的数组new FunctionScoreQueryBuilder.FilterFunctionBuilder[]{// 其中的一个function score 元素new FunctionScoreQueryBuilder.FilterFunctionBuilder(// 过滤条件QueryBuilders.termQuery("isAD", true),// 算分函数ScoreFunctionBuilders.weightFactorFunction(10))});
  3.  最后suorce的不是bool,而是包装号的function的。

5.Neo4j数据库是怎么存数据的,里面有什么类型的节点,什么类型的路线

我们节点存的是机构,分为三种标签:一级转运中心、二级转运中心和节点。

节点的属性包括:Neo4j自带的id、业务id、名称、电话、地址、坐标等。

关系存的是路线,属性包括自带id和成本。

6.你说查询最短路线和成本最低路线,Neo4j查询语言是什么样的

Neo4j语句:

查询最短

MATCH path = shortestPath((start:AGENCY) -[*..10]-> (end:AGENCY))
    WHERE start.bid = 123123 AND end.bid = 123456
    RETURN path

查询成本最低

MATCH path = (start:AGENCY) -[*..10]->(end:AGENCY)
    WHERE start.bid = 123123 AND end.bid = 123456
    UNWIND relationships(path) AS r
    WITH sum(r.cost) AS cost, path
    RETURN path ORDER BY cost ASC, LENGTH(path) ASC LIMIT 1

Java语句:

查询最短

  1. 获取网点的类型
  2. 构造查询语句
  3. 执行查询
    1. 设置参数
    2. 设置响应数据类型
    3. 对结果进行封装处理
      1. 读取节点数据,进入stream流
        1. 取第一个标签作为类型
        2. 封装好经纬度数据
    @Overridepublic TransportLineNodeDTO findShortestPath(AgencyEntity start, AgencyEntity end) {//获取网点数据在Neo4j中的类型String type = AgencyEntity.class.getAnnotation(Node.class).value()[0];//构造查询语句String cypherQuery = StrUtil.format("MATCH path = shortestPath((start:{}) -[*..10]-> (end:{}))\n" +"WHERE start.bid = $startId AND end.bid = $endId \n" +"RETURN path", type, type);//执行查询Optional<TransportLineNodeDTO> optional = this.neo4jClient.query(cypherQuery).bind(start.getBid()).to("startId") //设置参数.bind(end.getBid()).to("endId")//设置参数.fetchAs(TransportLineNodeDTO.class) //设置响应数据类型.mappedBy((typeSystem, record) -> { //对结果进行封装处理PathValue pathValue = (PathValue) record.get(0);Path path = pathValue.asPath();TransportLineNodeDTO dto = new TransportLineNodeDTO();// 读取节点数据List<OrganDTO> nodeList = StreamUtil.of(path.nodes()).map(node -> {Map<String, Object> map = node.asMap();OrganDTO organDTO = BeanUtil.toBeanIgnoreError(map, OrganDTO.class);//取第一个标签作为类型OrganTypeEnum organTypeEnum = OrganTypeEnum.valueOf(CollUtil.getFirst(node.labels()));organDTO.setType(organTypeEnum.getCode());//查询出来的数据,x:经度,y:纬度organDTO.setLatitude(BeanUtil.getProperty(map.get("location"), "y"));organDTO.setLongitude(BeanUtil.getProperty(map.get("location"), "x"));return organDTO;}).collect(Collectors.toList());dto.setNodeList(nodeList);//提取关系中的 cost 数据,进行求和计算,算出该路线的总成本double cost = StreamUtil.of(path.relationships()).mapToDouble(relationship -> {Map<String, Object> objectMap = relationship.asMap();return Convert.toDouble(objectMap.get("cost"), 0d);}).sum();dto.setCost(cost);//取2位小数dto.setCost(NumberUtil.round(dto.getCost(), 2).doubleValue());return dto;}).one();return optional.orElse(null);}

查询成本最优,略

7.你的项目是前端后端都有吗,前端有什么了解

前端我学过HTML、CSS、JS的基础,接触过一些Vue、Ajax的算法,了解最新的技术中有饿了么开发的ElementUI等。

8.你的整型数据预测,这个是做的什么预测

这个做的是拨叉整型数据的预测。拨叉是汽车上的一个零件,像一把只有两个头的叉子。从塑型的机器中做出来的初始拨叉形状精度还达不到,需要二次整型。其中,机器的参数就是我们的输入,整型的形变量就是我们的输出。我们用已经测好的数据作为训练集样本,以期预测输入参数后的形变量。

9.我看你还做了个人脸识别,是自己做的吗

是我们组做的,我是组长,负责其他模块,对这个人脸识别了解一点。

这个人脸识别调用的是训练好的模型,用opencv做的。我还记得组员解决不了,我找到了源码给他们看,他们自己看完后就完成进度了。

10.核函数了解吗

了解。它是一种数学函数,能将高维数据经过它数学函数的计算降成低维结果。

核函数有很多应用场景,其中之一就是替代SVM(支持向量机)中计算距离的函数,方便对数据分类。

11.SVM用什么核函数知道吗

一般有线性核,除此之外还有高斯核、高斯径向基函数、Sigmoid核等。

12.论文的创新点是什么

我结合了该领域的两种主流思想,位图标记与位图嵌入,并运用在经典算法中,实现了嵌入秘密信息的能力上的进步。

13.Java的基本数据类型有哪些

四类八种。

巴拉巴拉

14.说一下==和equals的区别

  • “==”是运算符,如果是基本数据类型,则比较存储的值;如果是引用数据类型,则比较所指向对象的地址值
  • equals是Object的方法,比较的是所指向的对象的地址值,一般情况下,重写之后比较的是对象的值

 (摘自详解“==”和equals的区别)

15.Spring的配置文件有几种

3种。properties、yml和yaml。优先级顺序是:

properties>yml>yaml

此外,还有两种设置参数的方式,

一种是Java系统属性配置,格式为:-Dkey=value,这个开发人员偶尔用。例如:

-Dserver.port=9000

还有一种是命令行参数,格式为:--key=value,这个测试人员经常用。例如:

--server.port=10010

 总结,有3种配置文件。

此外,这三种配置文件,加上5种设置参数方式,优先级如下(从低到高):

  • application.yaml(忽略)
  • application.yml (企业实用)
  • application.properties
  • java系统属性(-Dxxx=xxx)
  • 命令行参数(--xxx=xxx)(测试人员实用)

16.StringBuilder和StringBuffer有什么区别,效率的比较呢

StringBuilder是线程不安全的,效率比后者快;

StringBuffer是线程安全的,效率比前者慢;

对字符串拼接操作时,都比String快。

17.Linux想要获取当前文件夹的路径怎么办

pwd

18.有没有做项目的部署,部署过哪些项目

我们用Docker做项目的部署。

Docker是一个容器管理工具,它能将某一个组件,比如MySQL,需要运行的环境单独封装,在Linux上跑,这样就能方便地部署与使用。

首先安装Docker,镜像源之类的就不说了,直接

yum install -y docker-ce

关闭防火墙,systemctl start docker启动,docker -v查看版本,没问题就装好了。

然后是拉取镜像,比如拉取mysql,直接

docker pull mysql:latest

19.Python的Pytest框架你有了解吗

20.写过接口服务吗,后端和前端怎么交互的

写过。

前端呈现页面,用户通过浏览器操作页面,不同的操作发送HTTP请求给后端服务器,服务器对这些请求作出反应,处理业务,并查找数据库,返回响应结果给前端。

21.数据库有用过什么

有。有用过关系型数据库MySQL、非关系型数据库MongoDB、Neo4j等。

22.MySQL分类查询怎么查询

group by

23.如果我想复制一张表,该怎么写,如果我要删除/创建呢

复制:

create table 表1 select * from 表2

删除:

drop table 表1

创建:

create table 表1 if not exists

24.写过比较复杂的查询吗,复杂查询是什么样子的

写过。复杂查询通常涉及多表,需要灵活运用内外连接。比如两个表table1、table2,连接的字段为id,则写为如下:

select * from table1 as t1 inner join table2 as t2 on t1.id = t2.id where 条件1, 条件2

25.我们这里前后端不分离,你能写吗

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/114036.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用QT实现http里面的get和post

#1024程序员节&#xff5c;参与投稿&#xff0c;赢限定勋章和专属大奖# #假如你有一台服务器&#xff0c;你最想做哪些事&#xff1f;# #你被什么样的BUG困扰过一周以上&#xff1f;# 在http里面下面这些方法和服务器的响应代码一起用于HTTP协议中的请求和响应交互。请注意&…

Spring Boot + EasyUI 创建第一个项目(一)

创建一个Spring Boot和EasyUI相结合的项目。 一、构建一个Spring Boot项目 Spring Boot之创建一个Spring Boot项目&#xff08;一&#xff09;-CSDN博客 二、配置Thymeleaf Spring Boot Thymeleaf&#xff08;十一&#xff09;_thymeleaf 设置字体_人……杰的博客-CSDN博客…

mybatisplus开启sql打印的三种方式

1、在application.yml文件中添加mybatisplus的配置文件 使用mybatisplus自带的log-impl配置&#xff0c;可以在控制台打印出sql语句、执行结果的数据集、数据结果条数等详细信息&#xff0c;这种方法适合再调试的时候使用&#xff0c;因为这个展示的信息详细&#xff0c;更便于…

【算法练习Day25】 重新安排行程N 皇后 解数独

​&#x1f4dd;个人主页&#xff1a;Sherry的成长之路 &#x1f3e0;学习社区&#xff1a;Sherry的成长之路&#xff08;个人社区&#xff09; &#x1f4d6;专栏链接&#xff1a;练题 &#x1f3af;长路漫漫浩浩&#xff0c;万事皆有期待 文章目录 重新安排行程N 皇后解数独总…

C# Socket通信从入门到精通(2)——多个同步TCP客户端C#代码实现

前言: 我们在开发Tcp客户端程序的时候,有时候在同一个软件上我们要连接多个服务器,这时候我们开发的一个客户端就不够使用了,这时候就需要我们开发出来的软件要支持连接多个服务器,最好是数量没有限制,这样我们就能应对任意数量的服务器连接,由于我们开发的Tcp客户端程…

使用 Visual Studio Code (VS Code) 作为 Visual C++ 6.0 (VC6) 的编辑器

使用 Visual Studio Code (VS Code) 作为 Visual C 6.0 (VC6) 的编辑器 由于一些众所周知的原因&#xff0c;我们不得不使用经典&#xff08;过时&#xff09;的比我们年龄还大的已有 25 年历史的 VC 6.0 来学习 C 语言。而对于现在来说&#xff0c;这个经典的 IDE 过于简陋&a…

Leetcode1833. 雪糕的最大数量

Every day a Leetcode 题目来源&#xff1a;1833. 雪糕的最大数量 解法1&#xff1a;贪心 排序 本题唯一的难点在于计数排序。 计数排序详解&#xff1a;C算法之计数排序 为了尽可能多的买到雪糕&#xff0c;我们选择从价格低的雪糕开始买&#xff0c;统计能够买到的雪糕…

Java学习_day03_变量数据类型运算符

文章目录 变量定义声明赋值使用简化 数据类型基本数据类型整型浮点型布尔型字符型空型 引用数据类型数据类型转换自动类型转换强制类型转换 运算符算术运算符赋值运算符比较运算符逻辑运算符位运算符条件运算符一元运算符二元运算符三元运算符运算符优先级 变量 变量类似于数学…

计算机算法分析与设计(12)---贪心算法(最优装载问题和哈夫曼编码问题)

文章目录 一、最优装载问题1.1 问题表述1.2 代码编写 二、哈夫曼编码2.1 哈夫曼编码概述2.2 前缀码2.3 问题描述2.4 代码思路2.5 代码编写 一、最优装载问题 1.1 问题表述 1. 有一批集装箱要装上一艘载重量为 c c c 的轮船&#xff0c;已知集装箱 i ( 1 ≤ i ≤ n ) i(1≤i≤…

昇腾CANN 7.0 黑科技:大模型训练性能优化之道

目前&#xff0c;大模型凭借超强的学习能力&#xff0c;已经在搜索、推荐、智能交互、AIGC、生产流程变革、产业提效等场景表现出巨大的潜力。大模型经过海量数据的预训练&#xff0c;通常具有良好的通用性和泛化性。用户基于“大模型预训练微调”开发范式即可在实际业务场景取…

MySQL——练习

MySQL 一、练习要求二、练习过程 一、练习要求 创建表并插入数据&#xff1a; 字段名数据类型主键外键非空唯一自增idINT是否是是否nameVARCHAR(50)否否是否否glassVARCHAR(50)否否是否否 sch 表内容 id name glass 1 xiaommg glass 1 2 xiaojun glass 21、创建一个可以统计…

PostgreSQL与MySQL数据库对比:适用场景和选择指南

数据库是现代应用程序的基石之一&#xff0c;而在选择合适的数据库管理系统&#xff08;DBMS&#xff09;时&#xff0c;开发者常常会面临着许多选择。在这方面&#xff0c;PostgreSQL和MySQL是两个备受瞩目的选项。本文将深入研究这两者之间的异同&#xff0c;并为您提供适用场…

【使用OpenCV进行目标分割与计数的代码实例详解】

文章目录 概要实例一&#xff1a;硬币分割计数实例二&#xff1a;玉米粒分割计数 概要 在当今数字图像处理领域&#xff0c;图像分割技术是一项至关重要的任务。图像分割旨在将图像中的不同目标或区域准确地分开&#xff0c;为计算机视觉、图像识别和机器学习等领域提供了坚实…

[C语言]排序的大乱炖——喵喵的成长记

宝子&#xff0c;你不点个赞吗&#xff1f;不评个论吗&#xff1f;不收个藏吗&#xff1f; 最后的最后&#xff0c;关注我&#xff0c;关注我&#xff0c;关注我&#xff0c;你会看到更多有趣的博客哦&#xff01;&#xff01;&#xff01; 喵喵喵&#xff0c;你对我真的很重要…

【微服务 SpringCloud】实用篇 · Ribbon负载均衡

微服务&#xff08;4&#xff09; 文章目录 微服务&#xff08;4&#xff09;1. 负载均衡原理2. 源码跟踪1&#xff09;LoadBalancerIntercepor2&#xff09;LoadBalancerClient3&#xff09;负载均衡策略IRule4&#xff09;总结 3. 负载均衡策略3.1 负载均衡策略3.2 自定义负载…

C++前缀和算法的应用:向下取整数对和 原理源码测试用例

本文涉及的基础知识点 C算法&#xff1a;前缀和、前缀乘积、前缀异或的原理、源码及测试用例 包括课程视频 题目 向下取整数对和 给你一个整数数组 nums &#xff0c;请你返回所有下标对 0 < i, j < nums.length 的 floor(nums[i] / nums[j]) 结果之和。由于答案可能会…

Kubeadm部署k8s集群 kuboard

目录 主机准备 主机配置 修改主机名&#xff08;三个节点分别执行&#xff09; 配置hosts&#xff08;所有节点&#xff09; 关闭防火墙、selinux、swap、dnsmasq(所有节点) 安装依赖包&#xff08;所有节点&#xff09; 系统参数设置(所有节点) 时间同步(所有节点) 配…

Java面试题-UDP\TCP\HTTP

UDP UDP特性 &#xff08;1&#xff09;UDP是无连接的&#xff1a;发送数据之前不需要像TCP一样建立连接&#xff0c;也不需要释放连接&#xff0c;所以减少了发送和接收数据的开销 &#xff08;2&#xff09;UDP 使用尽最大努力交付&#xff1a;即不保证可靠交付 &#xff0…

Java面向对象(基础)--package和import关键字的使用

文章目录 一、package关键字的使用1. 说明2. 包的作用3. JDK中主要的包 二、import关键字的使用 一、package关键字的使用 1. 说明 package:包package用于指明该文件中定义的类、接口等结构所在的包。语法格式 举例&#xff1a;pack1\pack2\PackageTest.java package pack1.…

Xshell+screen解决ssh连接 服务器掉线的问题

Linux screen命令解决SSH远程服务器训练代码断开连接后运行中断_linux screen ssh-CSDN博客 Linux命令之screen命令_linux screen_恒悦sunsite的博客-CSDN博客 使用教程&#xff1a; 这里粗略介绍一下 &#xff08;1&#xff09;xshell xftp&#xff08;xshell点这个&#…