当前位置: 首页 > article >正文

面试时被问的问题

变量是干什么的,作用是什么?

变量是用来存储数据值的基本单位。它们就像是用来保存信息的小盒子,可以在程序运行期间保存数值、文本字符串、其他数据结构等信息,并且这些信息可以被读取、修改和操作。

作用是

  1. 存储数据:变量可以用来暂时或持久地保存数据,这样程序就可以在需要的时候使用这些数据。
  2. 数据操作:通过变量,程序可以执行各种运算和逻辑判断,如加减乘除、比较等。
  3. 数据传递:函数或方法之间可以通过变量传递参数,实现数据共享或者结果返回。
  4. 控制流程:变量可以用来控制程序的执行流程,例如循环次数、条件分支的选择等。
  5. 数据组织:在一些语言中,可以定义更复杂的变量类型来组织相关的简单变量,比如数组、列表、对象等

什么情况下变量需要初始化,什么时候不需要?

成员变量(全局变量/实例变量):
  • 初始化需求

    :成员变量不需要显式初始化。如果未显式初始化,则它们会被自动赋予一个默认值:

    • 基本类型(如 int, byte, short, long)默认值为 0
    • floatdouble 默认值为 0.0
    • boolean 默认值为 false
    • 引用类型(如 Object, String, 数组等)默认值为 null
静态变量:
  • 静态变量(static variables)也是成员变量的一种,行为类似,它们不需要显式初始化,并且拥有默认值,但是它们在内存中只有一个副本,被所有对象共享。
形参变量:
  • 初始化需求:当一个方法被调用时,传入的实际参数会自动给形参变量赋值,所以形参变量不需要显式初始化。
局部变量:
  • 初始化需求:局部变量(在方法、构造函数或代码块中声明的变量)必须在使用前显式初始化。编译器不允许对未初始化的局部变量进行访问,因为它们的值在声明后是不确定的。

总的来说,成员变量和形参变量在Java中有默认的初始化行为,而局部变量则需要开发者显式地初始化才能使用。

编码习惯有哪些?

  1. 代码风格一致性
    • 统一的缩进、空格、括号等格式。
    • 遵循项目或团队的代码风格指南。
  2. 命名规范
    • 变量、函数、类等命名清晰且具有描述性。
    • 避免使用缩写词,除非它们是广泛认可的。
    • 区分大小写,如使用 camelCasesnake_case
  3. 注释与文档
    • 对复杂的逻辑添加注释说明。
    • 更新文档以反映最新的代码状态。
    • 写好函数和模块的文档字符串。
  4. 简洁性
    • 避免冗余代码,尽量保持函数简短。
    • 使用DRY(Don’t Repeat Yourself)原则减少重复代码。
  5. 模块化
    • 将代码分解成小的、可重用的模块或组件。
    • 使用接口和抽象类来定义功能合同。
  6. 错误处理
    • 捕获异常并合理处理。
    • 提供适当的错误提示信息。
  7. 单元测试
    • 编写单元测试以验证代码的正确性。
    • 使用持续集成工具自动化测试过程。
  8. 版本控制
    • 使用版本控制系统(如Git)管理代码。
    • 每次提交都有清晰的提交信息。
  9. 安全性
    • 遵循安全编码实践,防止注入攻击等常见漏洞。
    • 对输入数据进行验证和清理。
  10. 性能优化
    • 关注代码性能,优化循环和递归。
    • 合理使用缓存机制减少计算成本。
  11. 代码审查
    • 定期进行代码审查以发现潜在的问题。
    • 鼓励团队协作和知识共享。
  12. 遵守语言的最佳实践
    • 跟随所使用的编程语言的最佳实践指南。
  13. 使用IDE和辅助工具
    • 利用集成开发环境(IDE)的功能提高效率。
    • 使用代码静态分析工具检查潜在错误。

Vue3组件通信方式有什么?

1、props 和 $emit

  • 父组件向子组件传递数据通过 props
  • 子组件通过 $emit 触发事件并传递数据给父组件。

2、attrs和listeners

  • $attrs 用于获取父组件传递的所有非 props 属性。
  • $listeners 获取父组件传递的所有监听器。

3、Provide/Inject

  • 父组件通过 provide 选项提供数据或方法。
  • 子组件通过 inject 选项接收这些值。

4、Vuex

  • Vuex 是 Vue.js 的官方状态管理模式。它适用于大型应用,能够集中管理应用的所有状态,并确保状态以一种可预测的方式发生变化。

5、事件总线(Event Bus)

  • 创建一个全局的 Vue 实例作为事件中心,用于非父子关系的组件间通信。

6、Ref

  • 在 Vue 3 中引入了 Composition API,其中 ref 用于创建响应式数据,可以用来在组件间共享状态。

7、Teleport

  • Teleport 组件可以将子组件渲染到 DOM 树中的某个元素上,即使这个元素不在该子组件的父元素内。

通常,简单的父子组件交互可以使用 props$emit;对于更复杂的场景,可以考虑使用 Vuex 或 Composition API 中的响应式数据。

前后端分离后会话怎么保持的?

前后端分离架构下,前端负责展示层,而后端负责业务逻辑和数据处理。在这种模式下,保持会话(session)主要依赖于服务器端的状态管理机制。

  1. Token 认证(JWT)
    • JSON Web Tokens (JWT) 是一种无状态的认证机制。
    • 用户登录时,服务器生成一个包含用户信息的 token 并返回给前端。
    • 前端将 token 存储在本地(如 localStorage/sessionStorage 或者 cookie 中),并在后续请求中附带此 token。
    • 服务器解析 token 来验证用户的请求。

2.HttpOnly Cookies

  • 使用 HttpOnly 标志来标记 cookies,防止 JavaScript 直接访问,增加安全性。

在实际应用中,最常用的方式是结合使用 JWT 和 HTTP Cookies。JWT 用于携带用户认证信息,而 cookies 可以用来传输 session ID 或者作为存储 JWT 的安全位置(如果设置为 HttpOnly 和 Secure)。这种方式既保证了安全性,又方便了前后端之间的状态管理。

SQL语句的执行顺序是什么?

  1. FROM 子句
    • SQL查询首先会处理 from 子句,确定需要从哪些表中获取数据。如果有多个表,这里还会涉及到联接(JOIN)操作。
    • 如果存在子查询,则子查询会在 from 子句之前执行。
  2. ON/WITH 子句(如果是 JOIN 操作)
    • 如果有 join 操作,那么数据库系统会根据 on/with 子句来决定如何联接表。
  3. WHERE 子句
    • 接下来是 where 子句的处理,这里会对表中的行进行过滤,只有符合条件的行才会被保留。
  4. GROUP BY 子句
    • 如果查询中包含了 group by 子句,那么数据库系统会在此步骤将数据按照指定列进行分组。
  5. HAVING 子句
    • having 子句是在 group by之后执行的,它用于过滤分组后的结果集。
  6. SELECT 子句
    • 在上述步骤完成后,数据库系统开始处理 select 子句,确定最终查询结果中需要返回的列。
  7. DISTINCT 关键字
    • 如果 select 子句中包含了 distinct 关键字,那么系统会在此处去除重复记录。
  8. ORDER BY 子句
    • 最后一步是 order by 子句的处理,它将结果集按照指定列排序。

请注意,不同的数据库管理系统可能会有不同的优化策略,这可能导致执行顺序上的细微差异。此外,数据库优化器可能会重新排序某些部分以提高性能。

Spring 的核心是什么?

  1. 依赖注入(Dependency Injection, DI)
    • Spring 的 IoC(Inversion of Control,控制反转)容器是依赖注入的一个实现。依赖注入允许将对象的创建和依赖关系的管理交给框架,而不是在代码中硬编码。这样可以降低组件之间的耦合度,使代码更加易于测试和维护。
  2. 面向切面编程(Aspect Oriented Programming, AOP)
    • Spring 支持面向切面编程,这是一种编程范式,旨在将横切关注点(如日志记录、事务管理等)从业务逻辑中分离出来。AOP 允许开发者定义“切面”来封装这些关注点,从而使得业务逻辑更加清晰。
  3. BeanFactory
    • BeanFactory 是 Spring IoC 容器的基础,它是单例模式的工厂模式的扩展,用于创建和管理对象的生命周期。BeanFactory 是 Spring IoC 容器的核心接口。
  4. ApplicationContext
    • ApplicationContext 是 BeanFactory 的扩展,提供了更多的企业级功能,如国际化支持(i18n)、事件传播、资源加载等。它是通常在应用程序中使用的 IoC 容器。
  5. 事务管理
    • Spring 提供了统一的事务管理API,支持编程式事务管理和声明式事务管理。后者通常通过 XML 或注解配置来实现。
  6. 数据访问/集成
    • Spring 包含了大量的数据访问框架,简化了与数据库和其他数据源的集成,如 JdbcTemplate、JPA、Hibernate 等。
  7. MVC框架
    • Spring MVC 是一个基于 Spring 的 Model-View-Controller 设计模式的Web框架,它简化了Web应用程序的开发。
  8. 测试支持
    • Spring 提供了测试支持,包括模拟(Mocking)工具,使得测试更加容易。
  9. 转换与校验
    • Spring 支持数据转换和校验,帮助开发者处理输入数据的有效性。
  10. 事件驱动模型
    • Spring 通过事件驱动模型支持应用程序中的事件传播。

AOP IOC DI 分别是什么?

  1. AOP(Aspect Oriented Programming,面向切面编程)
    • AOP 是一种编程范式,它的目标是将横切关注点(cross-cutting concerns)从业务逻辑中分离出来。横切关注点是指那些影响整个应用程序的公共行为,如日志记录、事务管理、安全控制等。
    • 在AOP中,可以定义“切面”(aspect),它封装了那些影响多个类的行为。通过这种方式,可以将这些行为集中管理,并在适当的位置注入到应用程序中,而不必在各个业务逻辑代码中重复编写相同的代码。
    • AOP 的实现通常通过拦截器(interceptors)和通知(advice)来完成,在特定的连接点(join point)执行特定的行为。
  2. IoC(Inversion of Control,控制反转)
    • IoC 是一种设计原则,它提倡将控制权“反转”给外部容器,而不是由代码本身来控制流程。简单来说,就是让对象之间的依赖关系由外部容器来管理,而不是由对象自身来创建和管理。
    • IoC 通常通过依赖注入(DI)来实现。使用IoC的好处是可以降低代码之间的耦合度,提高代码的可测试性和可维护性。
  3. DI(Dependency Injection,依赖注入)
    • DI 是 IoC 的一种实现方式,它是指将一个对象的依赖项(dependency)外部创建好之后,再注入到该对象中。
    • 依赖注入可以通过三种方式实现:
      • 构造函数注入:依赖项通过构造函数参数传递。
      • setter 方法注入:依赖项通过 setter 方法设置。
      • 字段注入:依赖项直接注入到字段中。
    • DI 使得对象可以专注于自己的职责,而不必关心依赖对象是如何创建和初始化的。

OOA、OOD、OOP、DBMS、RDBMS?

  1. OOA(Object-Oriented Analysis,面向对象分析)
    • OOA 是面向对象软件开发过程中的第一步,其目的是理解业务需求,并用面向对象的方式来分析问题域。在这个阶段,开发人员会识别出系统中的对象(实体)及其属性、操作(方法)以及对象之间的关系。
  2. OOD(Object-Oriented Design,面向对象设计)
    • OOD 是在 OOA 基础上进一步细化和具体化的过程,它将分析阶段得出的对象模型转化为设计阶段的设计模型。OOD 关注于如何实现系统的功能,包括类的设计、接口定义、类继承关系、模块划分等。
  3. OOP(Object-Oriented Programming,面向对象编程)
    • OOP 是一种编程范式,强调使用“对象”来设计软件。在 OOP 中,对象是由数据(属性)和对这些数据的操作(方法)组成的实体。OOP 的主要特性包括封装(Encapsulation)、继承(Inheritance)、多态(Polymorphism)和抽象(Abstraction)。
  4. DBMS(Database Management System,数据库管理系统)
    • DBMS 是一类用于创建、维护和管理数据库的软件系统。它可以存储、检索和管理大量的数据,并提供了一种方式来保证数据的安全性、完整性和并发访问。DBMS 支持多种数据模型,如层次模型、网络模型、关系模型等。
  5. RDBMS(Relational Database Management System,关系型数据库管理系统)
    • RDBMS 是一种特定类型的 DBMS,它使用关系模型来组织数据。在 RDBMS 中,数据被组织成一个或多个表格的形式,每个表格都有一个唯一的名称,并且包含若干列(字段)和行(记录)。RDBMS 支持 SQL(Structured Query Language)作为查询语言,用于数据的检索、插入、更新和删除等操作。

安全框架了解

Spring Security

Spring Security 是一个功能强大的安全框架,为基于 Spring 的应用程序提供了完整的安全服务。它提供了一种灵活的方式来配置安全措施,可以满足从小型项目到大型企业级应用的各种需求。

Spring Security 的主要特点:
  1. 认证(Authentication)
    • 提供了多种认证机制,如表单认证、HTTP 基本身份验证、OAuth2 等。
    • 支持自定义认证处理逻辑。
  2. 授权(Authorization)
    • 支持基于角色和基于权限的访问控制。
    • 提供了表达式语言来编写访问决策规则。
  3. 会话管理(Session Management)
    • 支持会话固定防护、会话超时等功能。
    • 可以配置会话的最大数量、会话过期时间等。
  4. 加密支持
    • 支持加密和哈希算法,可用于密码存储等场景。
  5. CSRF 保护
    • 提供跨站请求伪造(CSRF)攻击的防御机制。
  6. 异常处理
    • 提供了异常处理机制,可以自定义异常处理逻辑。
  7. 集成性
    • 与 Spring 框架紧密集成,易于在 Spring 应用中使用。
    • 支持与其他 Spring 模块的集成,如 Spring Boot、Spring MVC 等。

认证

Spring Security通过多种方式进行认证,但最常见的是基于用户名和密码的认证。这一过程主要通过以下步骤实现:

  • 配置认证提供者:在Spring Security中,AuthenticationProvider接口负责执行实际的认证逻辑。通常,我们会使用DaoAuthenticationProvider,它依赖于UserDetailsService来获取用户信息并进行比对。
  • 用户信息获取UserDetailsService接口的实现类负责根据用户名从数据库或其他数据源中加载用户信息(包括密码、权限等)。
  • 密码比对:Spring Security使用PasswordEncoder接口的实现类来加密和解密密码。常见的实现包括BCryptPasswordEncoder,它提供了强密码散列功能。
  • 认证流程:当用户提交登录请求时,Spring Security的过滤器链会捕获该请求,并通过UsernamePasswordAuthenticationFilter等过滤器进行处理。最终,AuthenticationManager(通常是ProviderManager)会调用AuthenticationProviderauthenticate方法来执行认证逻辑。

授权

授权是Spring Security的另一个核心功能,它决定了用户是否有权访问特定的资源。

  • 配置安全请求:通过HttpSecurityauthorizeRequests方法,可以配置哪些URL路径需要什么样的权限才能访问。例如,.antMatchers("/admin/**").hasRole("ADMIN")表示访问/admin/路径下的所有资源都需要ADMIN角色。
  • 权限校验:当用户尝试访问受保护的资源时,Spring Security会检查用户是否拥有相应的权限。这通常是通过调用UserDetails对象中的getAuthorities方法来实现的,该方法返回一个GrantedAuthority列表,表示用户所拥有的权限。

RocketMQ实现了用户在注册时发放优惠券的功能,消息的类型用的什么类型?普通,顺序(全局有序,分区有序)

消息类型选择

  1. 普通消息:
    • 定义:普通消息也称为并发消息,没有特定的顺序要求,生产消费都是并行进行的。
    • 适用场景:如果优惠券的发放不依赖于其他消息的顺序,且不需要严格的分布式事务控制,那么可以选择普通消息。例如,在用户注册成功后,系统立即向MQ发送一条普通消息,消息消费者收到后处理优惠券的发放逻辑。
  2. 顺序消息:
    • 定义:
      • 全局有序消息:一个Topic只有一个分区,所有消息都遵循FIFO(先进先出)的原则。
      • 分区有序消息:一个Topic有多个分区,但同一分区内的消息遵循FIFO原则。
    • 适用场景:
      • 如果优惠券的发放需要严格的顺序控制(比如根据用户注册的时间顺序发放特定编号的优惠券),且这种顺序控制不能通过应用层逻辑来保证,那么可能需要考虑使用顺序消息。然而,在大多数用户注册发放优惠券的场景中,全局有序消息可能会因为性能问题而不被采用(因为全局有序意味着所有消息都只能由一个队列处理,严重影响性能)。因此,如果确实需要顺序,更可能的选择是分区有序消息,通过设计合理的ShardingKey将相关的消息发送到同一个分区。

结论

  • 如果不需要严格的顺序控制:推荐使用普通消息。因为它简单且性能高,能够满足大多数用户注册时发放优惠券的需求。
  • 如果需要严格的顺序控制:考虑使用分区有序消息。但需要注意,这可能会增加系统的复杂性和设计难度,同时也可能影响性能。

注意事项

  • RocketMQ中不同类型的消息Topic不能混用,即普通消息的Topic不能用于发送顺序消息或事务消息。
  • 在设计系统时,应充分考虑业务需求、系统性能和复杂性之间的平衡。
  • 如果选择使用顺序消息,需要仔细设计ShardingKey的分配策略,以确保相关消息能够发送到同一个分区。
  • 在实现过程中,还需要注意异常处理和消息重试机制,以确保系统的稳定性和可靠性。

事务ACID是什么?

  1. 原子性(Atomicity):
    • 原子性指的是事务是一个不可分割的工作单位,其操作要么全部执行成功,要么全部回滚到事务开始前的状态。这意味着,在事务执行过程中,如果发生任何错误或异常,系统必须能够确保事务中的所有操作都不会对数据库产生任何影响,就像这些操作从未执行过一样。
    • 简而言之,事务的原子性保证了数据库操作要么完全成功,要么完全不发生,从而避免了数据不一致的情况。
  2. 一致性(Consistency):
    • 一致性是指事务将数据库从一种状态转变为另一种状态的过程中,必须保证数据库的完整性和约束条件没有被破坏。即事务开始之前和事务结束之后,数据库的完整性约束(如主键约束、外键约束、唯一性约束等)必须保持一致。
    • 换句话说,事务的执行结果必须使数据库从一个有效状态转换到另一个有效状态,而不能因为事务的执行导致数据库处于无效状态。
  3. 隔离性(Isolation):
    • 隔离性要求并发执行的事务之间应该相互隔离,即每个事务都应该感知不到其他事务的存在和它们对数据库的操作。这样做的目的是防止多个事务并发执行时由于交叉执行而导致的数据不一致问题。
    • 事务的隔离性通过不同的隔离级别来实现,包括读未提交(Read Uncommitted)、读提交(Read Committed)、可重复读(Repeatable Read)和串行化(Serializable)。不同的隔离级别提供了不同程度的数据保护,但同时也可能对并发性能产生影响。
  4. 持久性(Durability):
    • 持久性是指一旦事务被提交,其对数据库的修改就是永久性的,即使系统发生故障(如宕机、重启等),这些修改也不会丢失。为了确保事务的持久性,数据库管理系统通常会采用日志记录(如重做日志、回滚日志等)和检查点机制等技术来确保事务的修改能够被永久保存到磁盘上。

事务的传播行为有多少个,分别是什么?

Spring支持七种不同的事务传播行为:

  1. PROPAGATION_REQUIRED
    • 如果当前没有事务,就新建一个事务,然后在新建的事务内执行。
    • 如果当前存在事务,就加入该事务,该方法的操作在当前事务中执行。
  2. PROPAGATION_SUPPORTS
    • 如果当前存在事务,则在该事务中执行。
    • 如果当前不存在事务,则以非事务的方式执行。
  3. PROPAGATION_MANDATORY
    • 如果当前存在事务,则在该事务中执行。
    • 如果当前不存在事务,则抛出异常(通常是TransactionRequiredException)。
  4. PROPAGATION_REQUIRES_NEW
    • 新建一个事务执行,不管当前是否存在事务。
    • 新事务独立于当前事务,如果当前事务存在,新事务执行完后,恢复到执行新事务之前的状态。
  5. PROPAGATION_NOT_SUPPORTED
    • 以非事务的方式执行操作。
    • 如果当前存在事务,则挂起当前事务。
  6. PROPAGATION_NEVER
    • 以非事务的方式执行操作。
    • 如果当前存在事务,则抛出异常。
  7. PROPAGATION_NESTED
    • 如果当前存在事务,则在嵌套事务内执行。
    • 如果当前不存在事务,则其行为类似于PROPAGATION_REQUIRED
  • 如果一个方法需要确保总是运行在一个事务中,可以选择PROPAGATION_REQUIRED
  • 如果一个方法的执行可以有事务也可以没有事务,则可以使用PROPAGATION_SUPPORTS
  • 如果一个方法必须在事务上下文中执行,则应使用PROPAGATION_MANDATORY
  • 当需要确保一个方法总是运行在一个新的事务中时,可以选择PROPAGATION_REQUIRES_NEW
  • 当一个方法不需要事务上下文时,可以使用PROPAGATION_NOT_SUPPORTEDPROPAGATION_NEVER
  • 当需要在一个现有事务中创建一个嵌套事务时,可以使用PROPAGATION_NESTED

分布式事务用的是哪种模式?

TCC(Try-Confirm-Cancel)模式

  • 概述:TCC是一种补偿性事务处理模式,通过尝试(Try)、确认(Confirm)和取消(Cancel)三个阶段来确保事务的一致性。
  • 流程:
    1. 尝试阶段:执行事务操作的所有必要检查和准备工作,但不实际提交事务。
    2. 确认阶段:如果尝试阶段成功,则执行事务操作并提交;如果失败,则进入取消阶段。
    3. 取消阶段:执行逆向操作以回滚事务。
  • 优缺点:
    • 优点:允许开发人员在每个阶段定义自己的业务逻辑和补偿操作,适应不同的业务需求。
    • 缺点:代码侵入性大,需要开发人员手动编写回滚逻辑,改造成本高。

http://www.kler.cn/a/314305.html

相关文章:

  • 高级java每日一道面试题-2024年11月06日-JVM篇-什么是 Class 文件? Class 文件主要的信息结构有哪些?
  • 408笔记合集
  • Ceph 中PG与PGP的概述
  • LabVIEW大数据处理
  • Windows C++ TCP/IP 两台电脑上互相传输字符串数据
  • 844.比较含退格的字符串
  • 后台数据管理系统 - 项目架构设计-Vue3+axios+Element-plus(0917)
  • 新版ssh客户端无法连接旧版服务器sshd的方法
  • PHP基础语法入门指南
  • CMake中的PUBLIC、PRIVATE 和 INTERFACE用法
  • C++ | Leetcode C++题解之第423题从英文中重建数字
  • 【CPU】CPU的物理核、逻辑核、超线程判断及L1、L2、L3缓存、CacheLine和CPU的TBL说明
  • vue-入门速通
  • C++_数据结构详解
  • MATLAB入门基础篇
  • 一个安卓鸿蒙化工具
  • SpringBoot环境配置(Spring Boot Profile)
  • sql执行流程经典案例分析
  • 从Profinet到Ethernet IP网关技术重塑工业网络,数据传输更流畅
  • Go语言并发编程中的超时与取消机制解析
  • 基于菜鸟教程的flask学习记录 —— Flask视图函数
  • Java.猜数字小游戏
  • Go 语言字典探秘:操作指南与约束解析
  • Git之如何删除Untracked文件(六十八)
  • MySQL的索引——提高查找算法的数据结构 B+树
  • Qt容器类控件——QGroupBox和QTabWidget