Note·Interview 面经

作者 : jamin 本文共3926个字,预计阅读时间需要10分钟 发布时间: 2020-10-18 共1101人阅读

Interview 面经

001 Spring Boot 最大的优势是什么呢?

Spring Boot 的最大的优势是“约定优于配置”。“约定优于配置”是一种软件设计范式,开发人员按照约定的方式来进行编程,可以减少软件开发人员需做决定的数量,获得简单的好处,而又不失灵活性。

002 Spring Boot 中 “约定优于配置“的具体产品体现在哪里?

Spring Boot Starter、Spring Boot Jpa 都是“约定优于配置”的一种体现。都是通过“约定优于配置”的设计思路来设计的,Spring Boot Starter 在启动的过程中会根据约定的信息对资源进行初始化;Spring Boot Jpa 通过约定的方式来自动生成 Sql,避免大量无效代码编写。

003 Spring Boot Starter 的工作原理是什么?

Spring Boot 在启动的时候会干这几件事情:

  1. Spring Boot 在启动时会去依赖的 Starter 包中寻找 resources/META-INF/spring.factories 文件,然后根据文件中配置的 Jar 包去扫描项目所依赖的 Jar 包。
  2. 根据 spring.factories 配置加载 AutoConfigure 类。
  3. 根据 @Conditional 注解的条件,进行自动配置并将 Bean 注入 Spring Context。

总结一下,其实就是 Spring Boot 在启动的时候,按照约定去读取 Spring Boot Starter 的配置信息,再根据配置信息对资源进行初始化,并注入到 Spring 容器中。这样 Spring Boot 启动完毕后,就已经准备好了一切资源,使用过程中直接注入对应 Bean 资源即可。

004 Spring Boot 的自动配置是如何实现的?

Spring Boot 项目的启动注解是:@SpringBootApplication,其实它就是由下面三个注解组成的:

  • @Configuration
  • @ComponentScan
  • @EnableAutoConfiguration

其中 @EnableAutoConfiguration 是实现自动配置的入口,该注解又通过 @Import 注解导入了AutoConfigurationImportSelector,在该类中加载 META-INF/spring.factories 的配置信息。然后筛选出以 EnableAutoConfiguration 为 key 的数据,加载到 IOC 容器中,实现自动配置功能。

005 JPA 和 Hibernate 有哪些区别?JPA 可以支持动态 SQL 吗?

JPA 本身是一种规范,它的本质是一种 ORM 规范(不是 ORM 框架,因为 JPA 并未提供 ORM 实现,只是制定了规范),因为 JPA 是一种规范,所以只是提供了一些相关的接口,但是接口并不能直接使用,JPA 底层需要某种 JPA 实现,Hibernate 是 JPA 的一个实现集。

JPA 是根据实体类的注解来创建对应的表和字段,如果需要动态创建表或者字段,需要动态构建对应的实体类,再重新调用 Jpa 刷新整个 Entity。动态 SQL,mybatis 支持的最好,jpa 也可以支持,但是没有 Mybatis 那么灵活。

006 SSM 概念

SSM:Spring + Spring MVC + MyBatis

  • Spring 是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架。
  • SpringMVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
  • MyBatis 是一个支持普通 SQL 查询,存储过程和高级映射的优秀持久层框架。

007 Java 变量

Java 中共有三种变量,分别是类变量、成员变量和局部变量。他们分别存放在 JVM 的方法区、堆内存和栈内存中。

public class Variables {
    /**
      * 类变量
      */
    private static int a;

    /**
      * 成员变量
      */
    private int b;

    /**
      * 局部变量
      */
    public void test(int c){
        int d;
    }
}

上面定义的三个变量中,变量 a 就是类变量,变量 b 就是成员变量,而变量 c 和 d 是局部变量。

008 REST 和 RPC

  • REST(representational state transfer,表现层状态转移):使用 HTTP 协议,应用层,可以跨防火墙,在不同局域网之间通信
  • RPC(remote procedure call,远程过程调用):使用 TCP 协议,传输层,速度快,但不可跨防火墙,仅支持局域网通信

结论:对内 RPC,对外 REST

009 页面导入样式时,使用 link 和@import 有什么区别?

  1. link 是 HTML 标签,@import 属于 CSS 范畴。
  2. link 引入的样式页面加载时同时加载,@import 引入的样式需等页面加载完成后再加载。
  3. link 没有兼容性问题,@import 不兼容 ie5 以下。
  4. link 可以通过 js 操作 DOM 动态引入样式表改变样式,而 @import 不可以。

010 用递归算法实现,数组长度为 5 且元素的随机数在 2-32 间不重复的值

核心是生成随机数算法,Math.random() 函数返回一个随机浮点数,浮点数范围为左闭右开区间 [0, 1)

function rand(arr = [], length = 5, min = 2, max = 32) {
  if (arr.length < length) {
    const num = Math.floor(Math.random() * (max - min + 1)) + min
    if (!arr.includes(num)) {
      arr.push(num)
    }
    return rand(arr)
  }
  return arr
}

011 去除字符串中的空格,根据传入不同的类型分别能去掉前、后、前后、中间的空格

算法难点:

  1. 通过 Symbol() 来生成枚举类型
  2. 正则分组去除中间空格
const POSITION = Object.freeze({
  left: Symbol(),
  right: Symbol(),
  both: Symbol(),
  center: Symbol(),
  all: Symbol()
})

function trim(str, position = POSITION.both) {
  switch (position) {
    case POSITION.left:
      str = str.replace(/^\s+/, '')
      break
    case POSITION.right:
      str = str.replace(/\s+$/, '')
      break
    case POSITION.both:
      str = str.replace(/^\s+|\s+$/g, '')
      break
    case POSITION.center:
      while (str.match(/\w\s+\w/)) {
        str = str.replace(/(\w)(\s+)(\w)/, '$1$3')
      }
      break
    case POSITION.all:
      str = str.replace(/\s/g, '')
      break
    default:
      break
  }
  return str
}

const str = ' s t r '
const result = trim(str, POSITION.left)

012 去除字符串中最后一个指定的字符

function delLast(str, char) {
  if (!str) return false
  if (!char) return str
  const index = str.lastIndexOf(char)
  return str.substring(0, index) + str.substring(index + 1)
}

基础语法

0x01 Java 有哪些数据类型

  1. 分为基本数据类型和引用数据类型。
  2. 基本数据类型包括:数值型(byte、short、int、long、float、double),字符型(char)以及布尔型(boolean)。除了基本类型外,其他数据类型都属于引用类型,包括类、接口、数组等。

0x02 float number=3.4;有没有问题?为什么?

有问题,因为 3.4 是双精度数,将双精度型(double)赋值给浮点型(float)属于向下转型,可能会造成精度损失,所以必须进行强制类型转换,正确的写法是 float number =(float)3.4;/ float number =3.4F;

0x03 字符串拼接的方式以及效率?

  1. 使用 + 直接拼接,String 是 final 对象,不会被修改,每次使用 + 进行拼接都会创建新的对象,而不是改变原来的对象,效率低,是线程安全的。
  2. 使用 StringBuffer 可变字符串,效率较高,是线程安全的(StringBuffer 的方法使用了 synchronized 关键字进行修饰)。
  3. 使用 StringBuilder 可变字符串,效率最高,但是线程不安全。

0x04 简述 final,finally 和 finalize 区别

  1. final 可以修饰类、方法和变量,被 final 修饰的类不可继承,被 final 修饰的方法不可重写,被 final 修饰的变量引用不可更改,引用的内容可以更改。
  2. finally 用于 try-catch 代码块中,无论是否发生异常最后都将执行,作用是释放资源。
  3. finalize 是 Object 类的方法,在对象被垃圾回收之前将调用一次,一般用于资源的释放。

0x05 ==和 equals 有什么区别?equals 和 hashCode 有什么联系?

  1. 如果是引用类型,== 比较的是两个对象的引用是否完全相同,如果是基本类型,比较的是两个基本类型的数值是否相同。
  2. 如果没有重写的话,equals 默认按照 == 进行比较,如果重写了 equals() 方法,则按照对应的比较规则比较。
  3. 两个对象如果相等,那么它们的 hashCode 值必须相等,但两个对象的 hashCode 值相等时,它们不一定相同。

参考文章:
【7 万字干货】2021Java 实习必看面试两百题解析

本站所提供的部分资源来自于网络,版权争议与本站无关,版权归原创者所有!仅限用于学习和研究目的,不得将上述内容资源用于商业或者非法用途,否则,一切后果请用户自负。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容资源。如果上述内容资对您的版权或者利益造成损害,请提供相应的资质证明,我们将于3个工作日内予以删除。本站不保证所提供下载的资源的准确性、安全性和完整性,源码仅供下载学习之用!如用于商业或者非法用途,与本站无关,一切后果请用户自负!本站也不承担用户因使用这些下载资源对自己和他人造成任何形式的损失或伤害。如有侵权、不妥之处,请联系站长以便删除!
金点网络 » Note·Interview 面经

常见问题FAQ

免费下载或者VIP会员专享资源能否直接商用?
本站所有资源版权均属于原作者所有,这里所提供资源均只能用于参考学习用,请勿直接商用。若由于商用引起版权纠纷,一切责任均由使用者承担。
是否提供免费更新服务?
持续更新,永久免费
是否经过安全检测?
安全无毒,放心食用

提供最优质的资源集合

立即加入 友好社区
×