个人技能面试题

编程语言相关:

1.请简述 Java 中接口和抽象类的主要区别。

  • 抽象类可以有构造方法,接口不能有构造方法。
  • 抽象类中可以有普通成员变量,接口中只能有常量(默认public static final)。
  • 抽象类中可以有非抽象方法,接口在 Java 8 前只能有抽象方法,Java 8 后可以有默认方法(default修饰)和静态方法,Java 9 后还可以有私有方法。
  • 一个类只能继承一个抽象类,但可以实现多个接口。

    2.简单说明 HTML、CSS、JavaScript 在网页开发中的各自作用,以及它们之间的配合关系。

    • HTML:负责网页的结构,定义页面中的各种元素(如标题、段落、图片、链接等),是网页的骨架。
    • CSS:负责网页的表现,控制元素的样式(如颜色、字体、布局、间距等),让网页更美观。
    • JavaScript:负责网页的行为,实现网页的交互功能(如表单验证、动态内容更新、事件响应等),让网页更具活力。
    • 配合关系:HTML 搭建基础结构,CSS 对结构进行美化修饰,JavaScript 则基于 HTML 和 CSS 构建的页面,添加交互逻辑,三者协同工作,构建出完整的网页。

    3.解释 Maven 中坐标(GroupId、ArtifactId、Version)的作用,以及 Maven 是如何解决依赖冲突问题的。

    • 坐标作用GroupId标识项目所属的组织或团体;ArtifactId是项目自身的唯一标识;Version表示项目的版本。通过这三个坐标,Maven 能唯一确定一个依赖库。
    • 依赖冲突解决:Maven 通过依赖调解(Dependency Mediation)来解决冲突,遵循 “路径最近者优先” 和 “第一声明者优先” 原则。也可通过<exclusions>标签排除传递依赖中不需要的版本,或使用<dependencyManagement>统一管理依赖版本

    4.对比Maven 和 Gradle,说说它们各自的优势和适用场景。

    • Maven
      • 优势:拥有成熟的生态系统,插件丰富且稳定;项目结构规范,约定大于配置,学习成本相对较低;依赖管理成熟,冲突解决机制完善。
      • 适用场景:传统 Java 项目,尤其是企业级应用,团队更倾向于稳定、规范的构建工具时。
    • Gradle
      • 优势:构建脚本使用 Groovy 或 Kotlin 编写,灵活且表达能力强;支持增量构建,构建速度快;对多项目构建支持更优,能更高效地处理大型项目。
      • 适用场景:大型多模块项目,特别是 Android 项目(Android 官方推荐使用 Gradle),以及追求构建灵活性和速度的项目。

    后端开发相关:

    1.Spring Boot 的自动配置原理是什么? starters 依赖是如何工作的?

    • 自动配置原理:Spring Boot 的自动配置基于@EnableAutoConfiguration注解,该注解会导入AutoConfigurationImportSelector类,它会扫描META-INF/spring.factories文件,加载其中配置的自动配置类。自动配置类通过条件注解(如@ConditionalOnClass@ConditionalOnBean等)来判断是否生效,从而实现按需自动配置。
    • starters 依赖工作方式:starters 是一组依赖的集合,它将某个功能相关的依赖打包在一起,方便开发者引入。例如spring-boot-starter-web包含了 Web 开发所需的 Spring MVC、Tomcat 等依赖。当引入某个 starter 时,Spring Boot 会根据 starter 中的依赖和自动配置类,自动配置相关功能。

    2.如何在 Spring Boot 中通过 application.yml 或 properties 文件配置多环境(开发、测试、生产)参数?请举例说明。

    src/main/resources下创建application.yml(主配置文件),以及application-dev.yml(开发环境)、application-test.yml(测试环境)、application-prod.yml(生产环境)。主配置文件application.yml中指定激活的环境:

    spring:
      profiles:
        active: dev

    然后在各环境配置文件中配置不同参数,如application-dev.yml中配置开发环境的数据库连接:

    spring:
      datasource:
        url: jdbc:mysql://localhost:3306/dev_db
        username: dev_user
        password: dev_pass

    application-prod.yml中配置生产环境的数据库连接:

    spring:
      datasource:
        url: jdbc:mysql://prod-host:3306/prod_db
        username: prod_user
        password: prod_pass

    3.你在项目中是如何优化 Spring Boot 项目启动时间和减少环境切换问题的?具体做了哪些配置调整?

    • 缩短启动时间:通过分析项目依赖,排除不必要的自动配置(使用@SpringBootApplication(exclude = {...}));优化依赖,使用轻量级的组件替换重组件(如用 Undertow 替换 Tomcat);利用 Spring Boot 的分层构建和缓存机制,加速构建和启动。
    • 减少环境切换问题:通过@Profile注解对不同环境的 Bean 进行隔离;使用配置中心(如 Nacos、Consul)统一管理配置,减少本地配置文件的维护,避免环境切换时的配置错误。

    4.结合MyBatis SpringBoot 开发时,Mapper 接口和 XML 映射文件是如何关联的?请描述实现数据库 CRUD 操作的大致流程。

    • 关联方式:Mapper 接口上使用@Mapper或在配置类上使用@MapperScan扫描 Mapper 接口所在包。XML 映射文件中,通过namespace属性指定对应的 Mapper 接口全限定名,SQL 语句的id与 Mapper 接口中的方法名一致,从而实现关联。
    • CRUD 流程:定义 Mapper 接口,声明 CRUD 方法;在 XML 映射文件中编写对应的 SQL 语句(如<select><insert><update><delete>);在 Service 层注入 Mapper 接口,调用相应方法,MyBatis 会自动执行 XML 中的 SQL 语句,完成数据库的 CRUD 操作。

      前端工具相关:

      1.请列举几个 HTML5 中的语义化标签,并说明使用它们的好处。

      • 语义化标签<header>(页面或区块的页眉)、<nav>(导航栏)、<article>(独立的文章或内容块)、<section>(文档中的节)、<footer>(页面或区块的页脚)等。
      • 好处:提高代码的可读性和可维护性;有利于搜索引擎优化(SEO),搜索引擎能更好地理解页面结构,提升页面排名;提升无障碍访问性,辅助技术(如屏幕阅读器)能更准确地解读页面内容。

      2.解释 JavaScript 中箭头函数与普通函数的区别,以及 Promise、async/await 的作用和使用场景。

      • 箭头函数与普通函数区别:箭头函数没有自己的this,它的this指向定义时所在的作用域;箭头函数不能作为构造函数(不能用new调用);箭头函数没有arguments对象(可使用剩余参数...args代替)。
      • Promise 作用和场景:用于解决异步操作的回调地狱问题,将异步操作以同步的方式表达出来。场景:处理 Ajax 请求、文件读写、定时器等异步操作。
      • async/await 作用和场景:是 Promise 的语法糖,让异步代码更像同步代码,更易读。场景:在需要按顺序执行多个异步操作时,如先获取数据 A,再根据数据 A 获取数据 B。

      3.描述一下 Vue.js 组件的生命周期,并说明在哪些生命周期钩子中适合进行数据请求等操作。

      • 生命周期:创建阶段(beforeCreatecreated)、挂载阶段(beforeMountmounted)、更新阶段(beforeUpdateupdated)、销毁阶段(beforeDestroydestroyed)。
      • 数据请求时机:通常在created钩子中进行数据请求,因为此时组件实例已经创建,能访问到datamethods,但 DOM 还未挂载,适合提前获取数据;也可在mounted钩子中请求,此时 DOM 已挂载,可操作 DOM 相关的请求。

      4.如何在 Vue 项目中使用 Vue Router 配置动态路由、嵌套路由以及路由守卫(如登录拦截)?

      • 动态路由:在路由配置中使用:param形式定义动态参数,如{ path: '/user/:id', component: User }。在组件中通过$route.params.id获取参数。
      • 嵌套路由:在路由配置中,使用children属性定义子路由,如:
      {
        path: '/parent',
        component: Parent,
        children: [
          { path: 'child', component: Child }
        ]
      }

      在父组件模板中使用<router-view>渲染子组件。

      • 路由守卫(登录拦截):可使用全局前置守卫router.beforeEach((to, from, next) => {}),在其中判断用户是否登录,若未登录且要访问需要登录的页面,就跳转到登录页,否则执行next()放行。

      云服务相关:

      1.请说明 docker pull 和 docker run 命令的作用,以及如何通过这两个命令拉取并启动 Nginx 镜像。

      docker pull作用:从 Docker 镜像仓库(默认 Docker Hub)拉取指定的镜像到本地。

      docker run作用:基于指定的镜像创建并启动一个容器。

      启动 Nginx 示例

      拉取 Nginx 镜像:docker pull nginx

      启动 Nginx 容器:docker run -d -p 80:80 nginx-d表示后台运行,-p 80:80表示将容器的 80 端口映射到主机的 80 端口)。

      2.列举几个常用的 Docker 容器日常运维命令,并说明它们的用途。

      • docker ps:查看正在运行的容器。
      • docker ps -a:查看所有容器(包括已停止的)。
      • docker start/stop/restart 容器ID/容器名:启动、停止、重启容器。
      • docker logs 容器ID/容器名:查看容器的日志。
      • docker exec -it 容器ID/容器名 /bin/bash:进入容器的交互式终端。
      • docker rm 容器ID/容器名:删除容器(需先停止容器)。
      • docker rmi 镜像ID/镜像名:删除镜像。

      AI 工具相关:

      1.你使用过 codebuddy、cursor、Cloudcode、augument 这些 AI 大模型工具中的哪些?请分享一下在实际开发中使用它们的体验和帮助。

      以使用codebuddy为例,在实际开发中,当编写复杂的算法代码或不熟悉的框架代码时,可将需求描述输入codebuddy,它能快速生成初步的代码框架,节省编码时间;在调试代码遇到问题时,也可将错误信息和相关代码片段提交给codebuddy,它能辅助分析问题原因并提供解决方案思路。不同的 AI 大模型工具在代码补全、错误排查、文档生成等方面各有特点,能从不同维度提升开发效率。

      数据库操作相关:

      1.什么是数据库索引?它有什么作用?在什么情况下需要优化索引?

      • 作用:索引是对数据库表中一列或多列的值进行排序的一种结构,能加快数据的查询速度,就像书籍的目录一样,帮助数据库快速定位到所需数据。
      • 优化时机:当查询操作频繁,且查询的列是经常作为查询条件(如WHERE子句中的列)时;当表中的数据量较大,且查询需要扫描大量数据时;当插入、更新、删除操作相对较少,查询操作占比较大时。

          2.请解释数据库事务的 ACID 特性,以及在 SQL 中如何处理事务。

          • ACID 特性
            • 原子性(Atomicity):事务是一个不可分割的工作单位,事务中的操作要么全部执行,要么全部不执行。
            • 一致性(Consistency):事务执行前后,数据库的完整性约束没有被破坏,数据处于一致状态。
            • 隔离性(Isolation):多个事务并发执行时,一个事务的执行不能被其他事务干扰。
            • 持久性(Durability):一个事务一旦提交,它对数据库中数据的改变就应该是永久性的,接下来的其他操作或故障不应该对其执行结果有任何影响。

          3.简单说明关系型数据库和 NoSQL 数据库(如 Redis)的区别,以及 Redis 的典型使用场景。

          • 区别
            • 数据结构:关系型数据库采用结构化的数据(二维表),NoSQL 数据库(如 Redis)支持多种非结构化数据结构(如字符串、哈希、列表、集合、有序集合等)。
            • Schema 约束:关系型数据库有严格的 Schema 约束,NoSQL 数据库 Schema 灵活,可动态添加字段。
            • 事务支持:关系型数据库对事务支持更完善(遵循 ACID),Redis 等部分 NoSQL 数据库对事务的支持相对简单(Redis 事务保证原子性,但不保证隔离性等)。
            • 扩展性:关系型数据库水平扩展性较差,NoSQL 数据库通常具有更好的水平扩展性。
          • Redis 典型场景:缓存(将热点数据缓存起来,减轻数据库压力);会话存储(存储用户会话信息,实现分布式系统中的会话共享);消息队列(简单的消息发布与订阅);排行榜(利用有序集合实现实时排行榜);计数器(如文章阅读量、点赞数的计数)

          性能调优相关:

          1.什么是 JVM 性能调优?请列举几个常见的 JVM 性能分析工具,并说明它们的用途。

          • JVM 性能调优:通过调整 JVM 的堆内存大小(-Xms初始堆大小、-Xmx最大堆大小)、新生代和老年代的比例、垃圾收集器(如选择 G1、ZGC 等高性能收集器)、JIT 编译参数等,优化 JVM 的内存使用和垃圾回收效率,从而提升应用性能。
          • 常用性能分析工具
            • JConsole:基于 JMX 的可视化监控工具,可监控内存、线程、类加载等情况。
            • VisualVM:功能强大的多合一性能分析工具,可进行内存分析、线程分析、CPU 分析、生成堆转储快照等。
            • JProfiler:商业级性能分析工具,能深入分析内存泄漏、线程问题、方法执行性能等。
            • GC 日志分析工具(如 GCViewer):用于分析 JVM 的垃圾收集日志,帮助优化垃圾收集器配置。

          2.在 JVM 性能调优过程中,通常会关注哪些指标?

          • 内存相关:堆内存使用情况(新生代、老年代的使用率)、非堆内存使用情况、内存泄漏情况(通过堆转储分析)。
          • 垃圾回收相关:垃圾收集的频率、每次垃圾收集的时间、垃圾收集器的停顿时间(STW 时间)。
          • 线程相关:线程数量、线程状态(如阻塞线程数)、线程死锁情况。
          • CPU 相关:CPU 使用率、方法的 CPU 占用率(热点方法)。
          • 类加载相关:类加载的数量、类加载时间。

          暂无评论

          发送评论 编辑评论

          
          				
          |´・ω・)ノ
          ヾ(≧∇≦*)ゝ
          (☆ω☆)
          (╯‵□′)╯︵┴─┴
           ̄﹃ ̄
          (/ω\)
          ∠( ᐛ 」∠)_
          (๑•̀ㅁ•́ฅ)
          →_→
          ୧(๑•̀⌄•́๑)૭
          ٩(ˊᗜˋ*)و
          (ノ°ο°)ノ
          (´இ皿இ`)
          ⌇●﹏●⌇
          (ฅ´ω`ฅ)
          (╯°A°)╯︵○○○
          φ( ̄∇ ̄o)
          ヾ(´・ ・`。)ノ"
          ( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
          (ó﹏ò。)
          Σ(っ °Д °;)っ
          ( ,,´・ω・)ノ"(´っω・`。)
          ╮(╯▽╰)╭
          o(*////▽////*)q
          >﹏<
          ( ๑´•ω•) "(ㆆᴗㆆ)
          😂
          😀
          😅
          😊
          🙂
          🙃
          😌
          😍
          😘
          😜
          😝
          😏
          😒
          🙄
          😳
          😡
          😔
          😫
          😱
          😭
          💩
          👻
          🙌
          🖕
          👍
          👫
          👬
          👭
          🌚
          🌝
          🙈
          💊
          😶
          🙏
          🍦
          🍉
          😣
          Source: github.com/k4yt3x/flowerhd
          颜文字
          Emoji
          小恐龙
          花!
          上一篇