【八股文】Java实习生面试-01

注意:答案由博主整理,如果你觉得回答有误或者有更好的想法欢迎在留言区留言

2023-08-04

笔试题目

70分钟,总分120分,简答题都是5分,最后实战题目30分

说说HTTP常用状态码及其含义?

答:

状态码 含义
400 客户端请求语法错误,服务器无法理解
403 用户没有访问权限,服务器理解该请求但拒绝执行请求
404 服务器没有找到用户请求的资源,一般是用户请求的路径不正确或者开发者没有填写正确路径
500 服务器内部错误,无法完成请求
502 充当网关或代理的服务器,从远端服务器接收到了一个无效的请求
301 永久重定向
302 临时重定向

HTTP常用的请求方式、区别和用途?

答:

Get:用于向服务器获取资源或数据。通过在URL中添加参数发送请求,参数会附加在URL的末尾,可以被缓存,可被书签保存。

  • 区别:GET请求的参数会暴露在URL中,有长度限制,不合适传输敏感信息。
  • 用途:用于获取数据,如获取网页、图片、文档等。

Post:用于想服务器提交数据或请求进行修改。通过请求体传输数据,参数不会暴露在URL中,不会被缓存,不可被书签保存。

  • 区别:Post请求的参数不会暴露在URL中,无长度限制,适合传输敏感信息。
  • 用途:用于提交数据,如提交表单、上传文件、修改数据等。

Put:用于向指定URL位置上传新的内容。

  • 区别:Put请求需要提供完整的资源路径,用于替换指定URL位置的内容。
  • 用途:用于上传文件、创建新资源等。

Delete:用于删除指定URL位置的资源。

  • 区别:Delete请求用于删除指定URL位置的资源。
  • 用途:用于删除资源。

补充:

Patch:用于对资源进行部分修改。

  • 区别:Patch请求对资源进行局部更新或修改。

  • 用途:用于对资源的部分内容进行修改。

Head:类似Get请求,但只返回头部信息,不返回具体内容。

  • 区别:Head请求只获取响应头部信息,不获取具体内容。
  • 用途:用于获取资源的元数据,如文件大小、最后修改时间等。

请简单说一下你了解的端口及其对应的服务?

端口:20、21、22、23、25、80、110、443

答:

  1. 20端口:FTP传输数据端口。
  2. 21端口:用于FTP服务器,传输控制信息端口,用于连接。
  3. 22端口:用于SSH服务器,提供安全的远程登录和文件传输。
  4. 23端口:用于Telnet(远程终端协议)服务器,提供远程登录功能。
  5. 25端口:用于SMTP服务器,负责邮件的发送
  6. 80端口:用于HTTP服务器,常用于提供网页浏览服务。
  7. 110端口:用于POP3服务器,负责接收邮件。
  8. 443端口:用于HTTPS服务器,提供安全的加密通信,常用于进行网站的安全访问。

Java有哪些基础数据类型,string不是基础数据类型,他们有何区别?

答:Java有8种基础数据类型。

  1. 整数类型:byte、short、int、long
  2. 浮点数类型:float、double
  3. 字符类型:char
  4. 布尔类型:boolean

String 是 Java 中的引用类型,不属于基础数据类型。它是一个类,用于表示字符序列。基础数据类型和引用类型之间有以下区别:

  1. 存储方式:基础数据类型直接存储值,而引用类型存储的是对象的引用地址。
  2. 默认值:基础数据类型有默认值,如 int 类型默认为 0,boolean 类型默认为 false,而引用类型的默认值为 null。
  3. 可变性:基础数据类型是不可变的,一旦赋值后其值无法修改,而引用类型可以通过方法改变对象的状态。
  4. 复制行为:基础数据类型在赋值或传递时是按值传递,即创建一个新的副本,而引用类型在赋值或传递时是按引用传递,即传递对象的引用地址。
  5. 比较方式:基础数据类型比较的是值是否相等,而引用类型比较的是引用地址是否相等,除非重写了 equals() 方法。

如何获取某个日期是当月的最后一天?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
public static void calendarMonth (){
// 获取当前日志
Calendar calendar = Calendar.getInstance();
// 获取当前年份
int year = calendar.get(Calendar.YEAR);
// 获取当前月份,从0开始算,实际显示会少1,需要自行+1才是显示正确月份
int month = calendar.get(Calendar.MONTH);
// 设置指定月份,这里给月份+1,表示指定下个月并且日设置为1
calendar.set(year,month+1,1);
// 然后再给相加时间,在原本的次月加上 -1 天,就是这个月的月末最后一天
calendar.add(Calendar.DATE,-1);
// 输出时间
int day = calendar.get(Calendar.DATE);
System.out.println("Calendar 类获取当月最后一天:" + day);
}
public static void localDateMonth(){
// 使用 LocalDate 类获取当月最后一天
LocalDate currentDate = LocalDate.now();
LocalDate firstDayOfNextMonth = currentDate.withDayOfMonth(1).plusMonths(1);
LocalDate lastDayOfMonth = firstDayOfNextMonth.minusDays(1);
int lastDay2 = lastDayOfMonth.getDayOfMonth();
System.out.println("LocalDate 类获取当月最后一天:" + lastDay2);
}


/**
* 如何获取某个日期是当月的最后一天?
*/
public static void main(String[] args) {
calendarMonth();
localDateMonth();
}

你知道@SpringBootApplication注解在内部时如何工作的吗?

@SpringBootApplication 是一个组合注解,它包含了多个注解:@SpringBootConfiguration@EnableAutoConfiguration@ComponentScan。这个注解通常用于主类(启动类)上,用于标记一个 Spring Boot 应用程序的入口点。

  1. @SpringBootConfiguration:将类标记为配置类,相当于 Spring XML 配置文件中的 <beans> 标签。它指示 Spring Boot 应用程序使用基于 Java 的配置,该注解等同于@Configuration注解。
  2. @EnableAutoConfiguration:借助 Spring Boot 的自动配置机制,该注解能够根据类路径下的依赖自动配置 Spring Boot 应用程序所需的各种组件。它根据应用程序的类路径和已有的 Bean 来推断和添加配置。通过这个注解,Spring Boot 能够快速地根据依赖和配置条件自动配置整个应用程序。
  3. @ComponentScan:自动扫描指定包及其子包下的注解类,并将它们注册为 Spring 容器中的 Bean。这样,通过注解方式声明的类就可以被 Spring 容器管理和使用。

什么是Spring中的控制反转(IOC)?

控制反转(简称 IOC)是一种设计原则和实现机制。IOC 的核心思想是将对象的创建、组装和管理责任从应用程序代码中转移到一个外部容器中。

在 Spring 中,IOC 的实现主要依赖于容器依赖注入(简称 DI)机制。容器负责创建、组装和管理对象,而 DI 机制则负责将对象的依赖关系注入到对象中。

控制反转带来的好处有`松耦合、可替换性、集中管理。

我们如何在Spring Boot中实现依赖注入?

在Spring Boot中,有三种方式可以实现依赖注入,SpringBoot提供了自动装配和依赖注入的功能。

  1. 使用@Autowired或者@Resource注解来进行自动注入

  2. 使用构造器注入

  3. 使用Setter方法注入

介绍一下finalize方法

理解finalize

finalize()方法是Java中的一个特殊方法,属于Object类的一个方法。它被设计为在对象被垃圾回收期回收之前进行一些清理工作。

当一个对象变成垃圾不再被引用时,垃圾回收器会自动调用该对象的finalize()方法,这个方法可以被子类重写,以实现自定义的清理逻辑。

同时finalize()方法不是在对象被创建时立即调用,而是在垃圾回收器决定要回收时才调用,因此,finalize()方法可能不会及时被调用,并且只能被调用一次,之后就不能再次使用了。

总结:finalize()方法的调用时机和频率不确定,不容易控制,建议使用其他的方式来进行资源的释放和清理。

如何使用Spring Boot连接数据库?

下面我以事业mybatis框架连接数据库为例

  1. 导入相关依赖
    • 导入mybatis依赖
    • 导入MySQL依赖
  2. 配置数据库连接信息,如数据库名、用户名和密码等
  3. 创建数据表实体类
  4. 创建数据访问接口
    • 如果使用xml编写sql语句的话,创建mapper接口
    • 创建xml文件编写sql语句(注意命名空间要对应到接口)
  5. 使用数据访问接口,在需要用到数据库的地方,注入mapper接口,并使用对应的方法实现。

Spring Boot中如何处理事务?使用的是什么注释?

在Spring Boot中,我们可以使用@Transactional注解来处理事务。在Service层中,如果你需要对整个类进行事务处理,则在需要处理事务的类上添加@Transactional注解,如果只是需要对某个方法进行事务处理,则在方法上添加@Transactional注解就可以了,就可以保证数据库的一致性和完整性。

如果还需要指定需要回滚的异常类型,可以设置rollbackFor属性来指定需要回滚的异常类型。

@PathVariable@RequestParam有什么区别?

@PathVariable:通常用于获取URL路径的变量,通过指定占位符的名称作为注解参数来获取相应的值。

@RequestParam:获取Get或Post请求的参数,其中包括可以获取表单中的值,通过指定参数的名称作为注解参数来获取相应的值。

@Primary注解有什么用?

@Primary注解是Spring框架中的一个注解,用于标识多个同类型的Bean中的首选(Primary)Bean。当存在多个同类型的Bean时,使用@Primary注解可以指定其中一个Bean作为默认的实例。

比如接口A,有实现类B和C,当我们在实现类B上添加@Primary注解,我们在其他地方使用该接口时,默认使用实现类B,可以解决依赖注入的歧义性。

@Entity和@Table注解有什么区别?

@Entity:表示声明一个类是实体类,与数据库做ORM映射,默认的类名就是表名,表中的字段与类中的属性对应。

@Table:@Table注解是一个非必须的注解,它指定了需要映射的表,其中使用@Table注解的name属性可以指定映射的表。

我们在开发时,可能会两个注解同时使用,这时候对应的表是@Table注解指定的表,因为优先级:@Table > @ Entity

如何验证传入的请求并将错误通知给用户?

我们一般会做参数校验、异常处理、统一错误处理、返回错误信息。

  1. 参数校验:我们可以使用一些验证框架来处理,如java.validation或者Spring Validation来进行参数校验,设置@NotNull、@Size、@Pattern的验证规则
  2. 异常处理:我们可以在代码中使用异常处理机制来捕获验证过程中产生的异常,然后进行对应的处理。
  3. 统一错误处理:我们可以定义一个全局错误处理器来处理错误。
  4. 返回错误信息:根据不同的错误返回不同的错误信息,可以将错误码、错误描述等内容返回给用户。

实战题目(30分)

AI虚拟分身助手 小程序,帮助大学生了解、使用和掌握AI技能,与AI虚拟人(导师)对话,学习AI知识。未来,创建自己的AI助手,帮助收集资料、写论文等。面向在校大学生,免费注册、会员收费的模式,为他们提供个性化互动,一站式学习平台。要求(可以二选一):

1、如果你是产品经理,根据上述产品信息描述,以你对这款产品的理解,请理解,你最关注的3个功能体验,并且说明理由。

2、如果你是产品架构师,根据上述产品信息描述,以你对这款产品的理解,请列出产品使用者角色,以及对应的应用功能,并且画出系统架构部署图。

面试题目

什么是面向对象?

面向对象(OOP)是一种编程范式的方法论,它和程序设计看做是一组对象的交互。面向对象编程(OOP)通过将显现实的事务抽象为对象,然后定义对象之间的关系来进行编程。

面向对象的三大特点就是:

  1. 封装:封装是一种将数据和操作封装在对象内部,对外隐藏内部实现细节的机制,通过公共方法来访问和操作对象的数据,这样就可以提高代码的可维护性和安全性。
  2. 继承:继承是一种通过创建新的类,也叫子类,来集成现有的类,也即是父类,继承父类的属性和方法的机制。子类继承父类的特性,可以在此基础上进行扩展和修改,并且不影响父类。
  3. 多态:多态是一种允许不同类型的对象来执行相同的操作的能力。通过使用继承和方法重写,可以在父类引用中存储子类对象,并根据实际对象类型的不同而调用相应的方法。

Java有哪些基础类?

  1. Object类:所有类的基类。提供一些通用的方法,如equals()、hashCode()、toString()等。
  2. String类:表示字符串。提供对字符串的各种操作和功能,如连接、切割、替换、格式化等。
  3. Number类:表示数值。包括整数类型的Integer、Long、Short、浮点数类型如Float、Double等。
  4. Boolean类:表示布尔值。包括true、false。
  5. Character类:表示单个字符。提供对字符的各种操作方法和功能。
  6. Array类:表示数组。可以存储多个相同类型的元素,提供了一些常用的方法来操作数组长度、访问元素等。
  7. Enum类:定义枚举类型。表示一组固定的命名常量。
  8. Date类:表示日期和时间,提供了对日期和时间的各种操作方法。
  9. Calendar类:用于处理日期和时间的类。提供了一些方便的方法来获取和设置日期和时间的各个部分。
  10. Math类:提供了各种数学相关的方法,如绝对值、幂运算、三角函数等。

说一下第一二三范式的应用场景

第一范式(1NF):确保数据表中的每个属性具有原子性,即每个属性不可再分。第一范式要求每个属性都是单一值,而不是多个值的组合或集合。

  • 应用场景:学生信息表,每个属性如姓名、年龄、性别等都应该是单一值,并且不可再分。

第二范式(2NF):确保数据表中的非主键属性完全依赖于整个主键,即消除部分依赖。第二范式要求数据表中的每个非主键属性都必须完全依赖于主键,而不是依赖于主键的某一部分。

  • 应用场景:在订单管理系统中,订单明细表通常具有一个复合主键,如订单编号和商品编号。此时,订单明细表中的其他属性(如商品名称、商品价格)应该完全依赖于整个复合主键(即订单编号和商品编号),而不是只依赖于其中一个主键。

第三范式(3NF):确保数据表中的非主键属性不依赖于其他非主键属性,即消除传递依赖。第三范式要求数据表中的每个非主键属性都不依赖于其他非主键属性,而是直接依赖于主键。

  • 应用场景:在学生选课系统中,有学生信息表课程表,其中学生信息表包含学生姓名、学号等属性,课程表包含课程名称、课程编号等属性。若想要在选课记录表中存储学生选课信息,应该将学生信息表和课程表进行关联,避免将学生的姓名、课程名称等冗余存储在选课记录表中,以减少数据冗余和更新异常。

一张表最多有几个索引?

答:在MySQL中,限制一张表最多可以创建64个索引。

索引包括主键索引、唯一索引、普通索引等类型的索引。

虽然可以创建多个索引来提高查询性能和数据完整性,但在设计数据库时,需要权衡索引的数量和性能开销,过多的索引可能会增加读写操作的开销和存储空间的占用。

主键和索引有什么区别?

主键(Primary Key)和索引(Index)是数据库中两个重要的概念。

主键:

  1. 主键是用于唯一标识表中每一行记录的极端或字段组合
  2. 主键必须是唯一且不可重复的,每个表只能有一个主键
  3. 主键可以由一个或多个字段组成,通常选择具有唯一性、稳定性和简单性的字段作为主键
  4. 主键可以用来保证数据的完整性和一致性,以及加速表中记录的访问
  5. 主键的值不能为空,即不存在空值

索引:

  1. 索引分为唯一索引和非唯一索引,且唯一索引的值必须唯一,非唯一索引的值可以重复
  2. 索引是为了提高数据库查询性能而创建的一种数据结构,可以加速表中记录的检索
  3. 索引可以包括一个或多个咧,将这些列的值映射到相应的记录位置
  4. 索引可以加快数据的查找速度,但在插入、更新和删除时会增加额外的开销

综上所述:主键是一种特殊的索引,用于唯一标识表中的记录,而索引是为了提高查询性能而创建的数据结构。主键是一种约束条件,而索引是一种辅助工具

本文章来源于我的博客:https://blog.hikki.site