首页 > 编程语言 >Java后端新手的第一次面试复盘

Java后端新手的第一次面试复盘

时间:2024-04-03 21:33:54浏览次数:33  
标签:面试官 Java 处理 MyBatis 新手 日志 异常 复盘

昨天经历了第一次 Java 后端实习生面试,在无数次的简历投递后,很难得的一次面试机会,收获很多,也深刻感受到自己能力的不足(还需要继续沉淀半个学期),在此记录下收获和感悟,如有错误,欢迎指正!

1. 面试流程

  • 闲聊(5分钟):自我介绍+询问背景动机
  • 技术问答(45分钟):包括 Java 基础、数据库技术、异常处理等
  • 反问(5分钟):询问公司业务等

2. 技术问答复盘

主要记录几个我个人认为最具代表性和启发性的问题来进行详细的复盘和分析。

2.1 日志记录的实践经验与个人习惯

  • 问题:你用过日志嘛?你个人有什么理解?如果说你写日志,你会有自己的一些习惯嘛?规范?
  • 我的回答:用过,SpringBoot 切面,记录日志能更方便的找到错误,写在拦截器里面的,记录具体的请求的方法名,请求类型,请求参数。

面试官想了解我的日志记录实践经验及对日志记录的理解深度,特别是在保障系统稳定性和解决问题方面的实践经验,评估我的代码质量意识和对维护可读、可维护代码库的重视程度。

  • 尝试改进回答
    • 在我的项目中,日志记录主要用来保证应用稳定性,使排查问题更加的方便。
    • 我通常会使用 Spring Boot 的 AOP(面向切面编程) 来实现日志记录的自动化,这样可以在不侵入业务逻辑代码的情况下,有效记录关键数据的流入流出,以及异常信息。
    • 我还习惯于在日志中详细记录请求的方法名、类型、参数和执行时间,这不仅帮助我们快速定位问题,还对性能分析非常有用。
    • 我倾向于为不同级别的日志信息设置不同的日志级别,如DEBUG、INFO、ERROR 等,这样做可以便于在生产环境中根据需要调整日志输出级别,避免日志文件过大影响性能。

2.2 异常处理的实践经验与理解

  • 问题:使用过异常处理嘛?除了书本上的,你自己对于异常的理解呢?比如说抛出异常,期望程序在抛出异常时提供什么?

  • 我的回答:有写过全局的异常处理器,还有自定义异常,自己常见的异常有 NPE 之类的,除此之外,定义统一的错误码,方便定位错误。

面试官的目的在于了解我是如何在实际开发中处理和利用异常的,以及我如何通过异常处理提高程序的健壮性和用户体验。此外,通过询问我期望程序在抛出异常时提供什么,应该是在评估我在异常处理设计方面的考虑是否全面,是否能有效防止程序崩溃,同时提供有用的错误信息。

(我当时回答的时候只记得八股了,满脑子是 Exception、Error、受检异常、非受检异常,面试官引导后才回答了项目上的一些使用和处理)

  • 尝试改进回答
    • 在我的开发实践中,我认为,异常处理不仅仅是捕获和记录错误,更重要的是通过合理的异常管理来增强代码的健壮性和用户体验。
    • 对于异常的处理,我的策略是尽可能地在系统的边界处捕获异常,同时保留足够的错误信息以便于问题的追踪和修复。例如,我会在服务层使用全局异常处理器来捕获和处理所有未被捕获的异常,将内部异常转换为用户友好的错误消息,并通过统一的错误码方便问题的定位。
    • 在处理事务性操作时,确保在发生异常时正确回滚事务,避免脏数据的产生。此外,我遵循阿里巴巴的 Java 开发手册中关于异常处理的指导原则,比如避免在 try 块中包含过多的代码和逻辑,以减少因异常处理不当导致的系统不稳定。

2.3 MyBatis 和 MyBatis-Plus

  • 问题:你用的 mybatis-plus 是吧?你用过 mybatis 吗?对你来说有什么不同吗?为什么会选择 mybatis-plus?那你感觉 mybatis 有好的地方吗?
  • 我的回答:最开始学的时候,用的 mybatis,写项目的时候,用的 mybatis-plus;mybatis 它可能要写 xml 文件,写 sql 标签,可能会比较麻烦,而 mybtis-plus 提供了查询的 querywapper,还提供了分页插件,可能会方便些;mybatis-plus 它封装了简单的一些接口,但是对于复杂的查询,感觉可能还是用 mybatis。

面试官希望了解我对于 MyBatis 和 MyBatis-Plus 两种持久层框架的理解和比较,以及我选择使用 MyBatis-Plus 的原因,不仅仅是对技术选择的考察,也考验我是否能根据项目需求做出合适技术选型。

(后半部分没有回答到点上,没有提到 灵活性 这个说法)

  • 尝试改进回答
    • 在我的项目经验中,我既使用过 MyBatis 也使用过 MyBatis-Plus。MyBatis 提供了对 SQL 的精细控制能力,它允许我们直接编写 SQL 语句,非常适合需要进行复杂 SQL 操作的场景。而 MyBatis-Plus 作为 MyBatis 的增强版,提供了更多的便利性,如自动的 CRUD 操作,以及强大的条件构造器,极大地提高了开发效率。
    • 选择 MyBatis-Plus 的主要原因是它增加了很多开发效率高、易用性好的特性。另外,它的 QueryWrapper 等功能使得构建复杂查询变得简单。然而,这种便利性有时可能会牺牲一定的灵活性,尤其是在处理非标准或复杂的业务逻辑时。
    • MyBatis 通过编写 XML 文件或使用注解来定义SQL语句,这提供了较高的灵活性,让我们可以精确控制SQL执行的细节。对于需要执行复杂查询和优化数据库操作性能的场景非常重要。
    • 像 Hibernate 这样的早期 ORM(Object-Relational Mapping) 框架,虽然提供了完全脱离 SQL 的编程模型,但在处理复杂查询和优化性能时,可能会显得笨重和不足。因此,选择 MyBatis 或 MyBatis-Plus,实际上是在灵活性和开发效率之间做权衡。

2.4 Java 语言的特性及其执行流程

  • 问题:Java常被描述为哪种类型的语言?请解释Java的编译与执行流程,并讨论这种方式带来的主要好处是什么?
  • 我的回答:半解释半编译,流程是写完代码以后,javac 去编译成字节码,然后 JVM 转换成机器码,和 C++ 不一样,C++ 就是编译型的;可能相对于 python 解释性语言,Java 可能会更快一点,因为它是半编译的。

面试官希望了解我对 Java 语言核心特性的理解,特别是 Java 的编译执行流程,也想考察对 Java 跨平台执行的深入理解。

(这部分的理解还不够,没有回答到重点的 跨平台 特性)

  • 尝试改进回答
    • Java 是一种面向对象的编程语言,它采用 "一次编写,到处运行" 的设计理念。
    • Java 的程序在执行前首先被编译成字节码,这些字节码随后被 Java 虚拟机(JVM)在运行时解释执行或通过即时编译器(JIT)转换成本地机器码执行。
    • 这种设计的主要好处是跨平台兼容性,即同一份字节码可以在任何安装了 JVM 的操作系统上运行,无需为每种操作系统重新编写或编译代码。
    • 相比直接编译到机器码的语言(如 C++),Java 的这种半编译半解释的执行方式确实在某些情况下会牺牲一些执行速度,但随着 JVM 优化和 JIT 技术的发展,这种差距已经大大缩小。与纯解释执行的语言(如 Python)相比,Java 的执行效率通常要高得多,特别是在长时间运行的应用中,JIT 编译器可以对热点代码进行优化,使得其执行速度进一步提升。

2.5 并发编程的实践和思考

  • 问题:Java 还学了什么?高级的?比如说 并发、多线程?比如说多个线程处理一个变量会发生什么?
  • 我的回答:有简单的用过,比如处理多个数据源的并发读写操作,以及使用 join 方法同步多个线程的执行;多个线程处理一个变量会线程不安全,一起修改这个变量的时候,导致最后操作的结果不一致。

面试官想了解我对 Java 高级特性,尤其是并发和多线程编程的理解和应用程度。最后面试官的建议实质上是鼓励我不仅要学会使用 Java 的并发工具,更要深入理解并发编程的基本原理和问题解决方法

(这部分我确实没咋用过,所以了解不深)

  • 尝试改进回答
    • 在 Java 中,我接触过并发和多线程编程。在多线程环境下处理共享数据时,需要特别注意线程安全问题。例如,当多个线程同时修改同一个变量时,如果没有适当的同步措施,就可能导致预期之外的结果,这是因为线程调度是不确定的,可能会导致操作的交错执行。
    • 为了解决这个问题,Java 提供了多种同步机制,比如synchronized 关键字、Lock 接口以及并发集合等。使用synchronized 可以对方法或代码块加锁,确保同一时刻只有一个线程可以执行该段代码。而 Lock 接口提供了更加灵活的锁定机制,允许尝试获取锁、获取锁时设置超时时间等。
    • 此外,Java 在并发包 java.util.concurrent 中提供了一系列并发集合,如 ConcurrentHashMap、CopyOnWriteArrayList 等,它们内部采用了特殊的算法来减少锁的竞争,提高并发访问的效率。

2.6 Web 请求处理流程

  • 问题:问一个计算机方面的知识,输入一个 url 地址,到你访问到会经过哪些过程?
  • 我的回答:首先,输入 url,浏览器会根据你的域名,dns 解析到对应得 ip 地址,发送请求到对应得服务器,然后返回页面的代码啥的,然后页面渲染

面试官想评估我对网络基础知识的掌握程度,从在浏览器输入 URL 到页面展示这一系列过程中不仅涉及到DNS解析、TCP/IP连接、HTTP请求/响应等网络通信机制,还包括浏览器的渲染过程。

(我的回答有点简略了,说明掌握程度还不够,理解不够深入!)

  • 尝试改进回答
    • URL解析:浏览器首先解析 URL,分析出协议、域名和路径等信息。
    • DNS查询:浏览器会对 URL 中的域名进行 DNS 解析,找到对应的 IP 地址。这个过程可能包括访问浏览器缓存、操作系统缓存、本地 DNS 服务器,以及可能的递归查询直到找到域名对应的 IP 地址。
    • 建立连接:浏览器根据解析到的 IP 地址和服务器建立 TCP 连接(对于 HTTPS 链接,还会进行 TLS 握手过程)。
    • 发送HTTP请求:浏览器向服务器发送 HTTP 请求,请求可能包括要访问的页面、浏览器类型、接受的响应格式等信息。
    • 服务器处理请求:服务器接收到请求后,根据请求的路径和参数等信息处理请求,可能涉及到后端数据库的查询等操作。
    • 发送HTTP响应:服务器处理完请求后,会将结果数据(通常是 HTML 页面)通过 HTTP 响应返回给浏览器。
    • 浏览器渲染页面:浏览器接收到服务器返回的数据后,会解析 HTML、CSS 和 JavaScript 代码,渲染出页面。这个过程包括构建 DOM 树、计算 CSS 样式、执行 JavaScript 脚本等步骤,最终在浏览器窗口中展示出完整的页面。

3. 项目经验讨论

因为我比较菜,所以整个面试过程中大部分都是面试官教我或者引导我来让我理解一些知识和内容,所以这部分记录下面试官提供的宝贵知识点和见解

3.1 计算机基础的重要性

无论技术如何进步和变化,计算机科学的基础知识都是学习和应用这些技术的基石

  • 计算机基础的重要性:无论是在学习的早期还是后期深入研究更高层次的设计和架构时,计算机科学的基础知识始终是至关重要的。它们不仅是学习其他高级主题的基础,而且在实际应用中起到了桥梁的作用,使得理论知识能够与实践有效结合。

  • 技术进步与硬件发展:面试官通过 Elasticsearch (ES) 的例子,指出了技术进步往往伴随着存储介质和硬件速度的提升。

    • ES 作为一个技术工具,它的优势不仅在于其软件架构,还在于利用了更快的存储介质,如 SSD 和内存,来提高数据处理速度。这说明了硬件发展对软件性能的直接影响,以及软硬件协同进步的重要性。
  • 数据存储技术的通用性与专用性:面试官提到 ES 和 MySQL 都属于数据存储的软件,但它们各有侧重,一方面说明了不同技术的选择和应用需要基于具体的使用场景;另一方面也强调了在选择技术解决方案时,需要对底层原理有足够的理解,以便更好地利用这些工具。

3.2 重视异常处理和代码健壮性

在软件开发过程中,正确处理异常和编写健壮的代码不仅是为了避免当前的错误和问题,更是为了确保长期的系统稳定性和可维护性

  • 学习与实践的差异:在学校中学到的知识与工作中遇到的实际问题之间存在差异。虽然新技术令人兴奋,但在实际工作中,系统的稳定性和健壮性更为重要。
  • 异常处理的重要性:通过提到同学们常见的异常处理方式——将代码包裹在try-catch块中,面试官强调了理解异常处理的深层次含义比简单避免程序崩溃更加重要。不恰当的异常处理会导致系统的不稳定,特别是在高并发和复杂的系统中。
  • 异常与事务管理:面试官通过提到MyBatis中的事务传递问题,强调了在进行异常处理时考虑事务管理的重要性。不当的异常处理可能导致事务不一致,从而影响系统稳定性。
  • 代码规范和最佳实践:推荐查看阿里巴巴的代码规范和使用IDEA插件等资源,以学习和遵守业界的代码编写规范和最佳实践。

3.3 理解框架技术的选择与权衡

技术选择时进行全面考虑,结合实际项目需求和团队能力进行选择

  • 框架的历史与发展:通过对比 Hibernate、SPA(单页应用)和MyBatis(包括MyBatis-Plus)的特点,说明了技术选择随时间演进的重要性。这些框架在不同的发展阶段解决了特定的问题。
  • 实践的重要性:例如,MyBatis 和 MyBatis-Plus 在查询时对listone的处理不同,这可能会导致数据重复或其他错误。
  • 技术的双刃剑:任何技术工具都有其好处和局限,选择某一技术时,需要权衡其带来的便利和可能的风险。比如,自动化的代码生成可以加快开发速度,但也可能导致对底层实现的理解不足,从而在遇到问题时难以排查。

3.4 数据库技术选择与应用场景

技术选择没有绝对的好坏之分,关键在于是否适合当前的业务需求和技术栈

  • 数据库类型和适用场景
    • OLTP 与 OLAP:区分了面向事务处理的 OLTP 系统(如MySQL)和面向分析的 OLAP 系统(如ClickHouse),强调了它们在处理不同类型数据和查询时的优势。
    • 高并发与数据分析:讨论了如Redis这样的内存数据库在处理高并发场景下的优势,以及ClickHouse在数据分析场景下处理大数据量的能力。
  • 技术的适用性:技术选择应基于实际业务需求,如电商场景下的数据分析可能更适合使用 ClickHouse。同时指出,面对大数据量且需要事务支持的场景,分库分表技术成为了一种必要的设计选择。

4. 个人思考和感悟

太菜勿喷

  • 对于整个面试的表现

    • 有的问题回答的很泛,很多时候没回答到重点上!回答显得有些跳跃和不够具体!尽量给出直接、明确且具体的回答!(说明对原理的理解不够深入)
    • 有的回答明明自己是对的,面试官一反问就开始自我怀疑了,需要更自信些
    • 听录音发现,太多 ”然后“ 连接词,语言表达能力有待提高
    • 不要瞎插话!!
  • 技术方面

    • 基础很重要,理解业务逻辑和架构设计的重要性也很关键!

    • 写一个健壮性的代码比把代码写出来更重要!!!

    • 工具的好与坏:在提供方便的时候,或许也意味着麻烦,技术没有好坏,只有适不适合,不管是毕设还是工作,实践很重要!

    • 学习新技术时,会发现自己需要探索更多相关领域的知识,遇到 bug 时候就很容易自我怀疑,那么日志和异常就非常重要!

    • 简历中需要突出我的专业技能和项目经验,应该更有效地展示能力和成就,如果提到使用了某种算法或技术,准备好在面试中深入讨论其工作原理和为什么选择这种算法。

    • 即使面试官提出深入或难以回答的问题,并不是在为难你,而是想探究你的知识深度和解决问题的能力,要自信点!!

标签:面试官,Java,处理,MyBatis,新手,日志,异常,复盘
From: https://www.cnblogs.com/thr-0103/p/18113538

相关文章

  • java毕业设计二手书籍拍卖小程序[附源码]
    本系统(程序+源码)带文档lw万字以上  文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着数字化时代的深入发展,人们对于信息的获取和物品的交易方式正经历着翻天覆地的变化。特别是在教育领域,电子书的普及使得纸质书籍逐渐被边缘化,这并不意......
  • Java Web实验四:Servlet应用开发
    实验四  Servlet应用开发一、实验目的1.学会使用Servlet获取表单数据;2.学会使用Servlet的跳转方法实现重定向;3.学会配置和获取应用初始化参数的方法。二、实验内容1.编写一个登录页面,根据登录验证结果,重定向到登录成功页面和登录失败页面;2.在Servlet中获取应用......
  • JavaWeb-01记录
    JWT令牌JSONWebToken作用:以json格式在各方之间安全传递信息,是数字签名的。格式:标头Header.有效载荷Payload.签名Signature前两部分用Base64编码,可以被前端翻译并理解。第三部分使用编码后的前两部分,加上一个密钥,用头部声明的加密算法进行签名,保证令牌没有被篡改。swagger生......
  • 关于openEuler系统的基本环境配置(包括nginx,mysql5.7和java1.8)
    关于openEuler系统的基本环境配置(包括nginx,mysql5.7和java1.8)观前BB:openEuler虽然是国产系统,但是本质还是centos的套壳系统,你可以通过(uname-a)命令得以观察出,而且系统更类似于centos8(这个还有待确认),这就导致了安装环境的时候经常会出现奇奇怪怪的错误(比如yum找不到源什么的),本......
  • Java的Scanner类、Random类、ArrayList类、String类的基本定义
    学习目标:学习Java中Scanner类、Random类、ArrayList类、String类基本定义学习内容:Scanner类Scanner功能简介用于获取外界输入,例如从键盘录入字符、数字等等…Scanner类使用前需要先导入Scanner包importjava.util.Scanner;导包后创建Scanner类对象,接上.使......
  • JavaWeb(未完结)
    #1静态web*.htm*.htm这些都是网页的后缀,如果服务器上一直存在这些东西,我们就可以直接进行读取缺点Web页面无法动态更新,所有用户看到的都是同一个页面无法和数据库交互(数据无法持久化)2动态Web页面会动态展示:Web的页面展示的效果因人而异##2web服务器服务器是......
  • 数据结构——队列(包括循环队列)——Java版
    目录队列介绍:基本概念:应用:Java实现示例:循环队列的Java实现:队列介绍:队列(Queue)是一种常见的数据结构,它按照先进先出(FIFO,First-In-First-Out)的原则管理数据。在现实生活中,队列的概念很容易理解,就像是排队等待服务的人群一样。在计算机科学领域,队列同样扮演着重要的角色,在......
  • 【附源码】java毕业设计售后管理系统
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:在当今市场竞争日益激烈的环境下,优质的售后服务已成为企业提升品牌形象、增强客户忠诚度和市场竞争力的重要手段。传统的售后管理多依赖人工操作,不仅效率......
  • 【附源码】java毕业设计书城管理系统的设计与实现
    本系统(程序+源码)带文档lw万字以上 文末可领取本课题的JAVA源码参考系统程序文件列表系统的选题背景和意义选题背景:随着互联网技术的普及和电子商务的发展,传统的书店逐渐向线上书城转型,以满足人们日益增长的在线阅读和购书需求。一个功能全面、操作便捷、系统稳定的书城......
  • Java好题分享——健康体检(循环队列)
    目录题目描述输入输出样例输入 Copy样例输出 Copy提示代码实现 题目描述队列是一种特殊的线性表,特殊之处在于它只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作。进行插入操作的端称为队尾,进行删除操作的端称为队头。队列中没有元素时,称为空队......