6年java开发面试题

背景:回合肥了,最近一直在面试,整理一下遇到的面试题(主要是没答上来的,或者觉得不太满意的)

1.你知道类怎么加载的吗?

 我的回答:不太了解,印象中编译的时候将Java文件转成class文件,启动的时候类加载器将对应的数据加载到jvm中

百度:当程序要使用某个类时,如果该类还未被加载到内存中,则系统会通过加载、连接、初始化三步来实现对这个类进行初始化。

1. 加载:是将class文件读入内存,并为之创建一个Class对象。任何类被使用时系统都会建立一个Class对象。

2. 连接
(1)验证是否有正确的内部结构,并和其他类协调一致。
(2)准备负责为类的静态成员分配内存,并设置默认初始化值。
(3)解析将类的二进制数据中的符号引用替换为直接。
3. 初始化:就是我们以前讲过的初始化步骤。

2.mybaties 特殊字符怎么处理?

 我的回答:转义,&lt;之类的,又问其他方法没答出来,<![CDATA[]]>

3.内存溢出怎么排查的?

我的回答:找客户了解具体情况,查看日志,确定具体操作了哪些内容溢出的,面试官打断并问不知道具体什么原因导致的,我回答这种使用jdk自带的jconsole和jvisualvm工具,分析具体哪一个类占用大量资源,并分析对应类的使用情况,面试官问Linux环境怎么使用jconsole工具,回答可以设置远程连接的

4.springboot主服务上的注解有哪些?

@SpringBootApplication,@Configuration,@EnableAutoConfiguration,@ComponentScan  (一个都没想起来)

5.Java什么是面向接口编程?

 我的回答,将方法抽象出来,具体实现不对外暴露,使用者只关注具体结果,面试官说这是封装,不是面向接口编程,

百度:面向接口编程是一种编程规范和设计规范,它强调通过接口来定义和实现系统组件之间的交互。这种编程方式的核心思想是将系统的具体实现与接口定义分离,通过接口来规定组件之间的通信协议和行为规范。面向接口编程旨在降低程序各部分之间的耦合性,提高系统的可扩展性和可维护性。

面向接口编程的实现通常包括以下几个关键点:

  1. 接口定义:首先,根据系统的需求和设计,定义一组接口。这些接口描述了系统组件应该提供的功能和服务的抽象规范。
  2. 实现类:然后,为这些接口提供具体的实现类。这些实现类包含了实现接口定义所需的具体逻辑和代码。
  3. 解耦:通过面向接口编程,可以实现系统的高内聚低耦合。这意味着系统的各个部分可以通过接口进行交互,而不需要直接依赖彼此的具体实现,从而减少了代码之间的直接耦合。
  4. 扩展和维护:当系统需求发生变化时,只需要为新的需求编写相应的实现类,而不需要修改现有的代码。这种设计使得系统的扩展和维护变得更加容易。
  5. 设计原则:面向接口编程遵循开闭原则,即对扩展开放,对修改关闭。这意味着系统应该能够容易地添加新的功能或服务,而不需要修改已有的代码。

面向接口编程的好处包括:

  • 降低耦合性:通过接口定义和实现分离,减少了系统各部分之间的直接依赖,降低了耦合性。
  • 易于扩展和维护:当需求变化时,只需要添加新的实现类,而不需要修改现有代码,提高了系统的可扩展性和可维护性。
  • 遵循设计原则:遵循开闭原则,使得系统能够更容易地适应变化和扩展新功能

6.微服务中一个完整的请求链路是什么样的

我的回答:前端发一个请求到控制层,控制层调用服务层,服务层调用mapper,mapper再调用对应的SQL,最后再一层层返回给前端.

百度:客户端发起请求,网关解析请求发给具体某个微服务,服务间可能涉及到多个微服务调用,每个微服务完成请求后给调用者结果,聚合服务收集这些响应,整体发送给客户端,客户端接收到响应后根据具体情况处理

7.spring事务失效的可能有哪些

我的回答:spring是用容器管理对象的,没有用容器管理对象,或者没有从容器中获取对象而是直接new的,还有抛出异常好try catch了,又或者@transactional注解配置不对

百度:事务方法不是public,对象内部方法自调用事务方法,异常处理不当,数据源或事务管理器配置错误,事务传播行为不当,处理方式不正确,事务同步问题

8.鉴权怎么处理的?

我的回答:我们权限有很多,首先服务启动的时候我们会根据客户信息将对应的菜单加载上去,然后客户可以设置用户的权限(菜单权限,基金权限,项目权限),用户登录后访问具体某个接口,我们会先判断该接口是公用接口还是菜单接口,菜单接口会去判断用户有没有该菜单权限,有的话才可以访问,项目权限,基金权限是用来对具体展示的数据做业务过滤的

9.springboot你觉得最核心的是哪一个jar包

我的回答:不知道

百度:spring-boot-starter

10.SQL优化怎么优化的

我的回答:先开启慢SQL日志,分析具体有哪些SQL比较慢,explain查看一下是否有索引以及是否使用了索引,让其使用上索引,比较复杂的SQL考虑代码层面进行优化,

11.in和exists的区别

我的回答:两个差不多吧,in的话数据量大会有问题,超过1000个oracle会报错,

百度:

  1. 应用场景
  • IN适用于子查询结果集较小,而外部查询的表较大且又有索引的情况。
  • EXISTS适用于外部查询的记录较少,而子查询中的表较大且有索引的情况。
  1. 驱动顺序与底层原理
  • IN是先查询子查询的表,然后将内外表做笛卡尔积,再根据条件筛选。它实际上是把外表和内表做hash连接。
  • EXISTS是以外层表为驱动表,先被访问,然后对内表进行查询。它是对外表做loop循环,每次loop循环再对内表进行查询。
  1. 对NULL值的处理
  • 有观点认为IN不对NULL进行处理,而EXISTS会对NULL值进行处理,但这一区别在实际测试中可能并不明显。
  1. 效率考虑
  • 当外表较大,子查询内表结果较小的时候,使用IN的效率可能会更高,因为IN可以使用外表的索引。
  • 当外表较小,而子查询内表结果较大,且子查询可以使用索引的时候,使用EXISTS效率可能会更高,因为EXISTS可以使用内表的索引。
  • 如果内外表查询结果集相差不大,两者效率可能相当,具体取决于所使用的索引和查询优化器的选择。
  1. 适用性
  • IN可以单独使用,如IN(a,b,c...),而EXISTS通常与子查询一起使用。
  • IN通常用于非关联子查询,而EXISTS通常用于关联子查询。

12.设计模式用过哪些?

我的回答:23种设计模式吗?用的比较多的建造者模式,单例模式,工厂模式,面试官先后问了建造者模式怎么使用的,单例模式有哪种,工厂模式抽象工程是什么样的,建造者模式我们是有不同客户需求同一个合同需要的参数是不一样的,用建造者模式可以方便维护,就是set后返回整个对象,方便链式使用,单例模式有饱汉饿汉,一个启动的时候创建对象,一个使用的时候才创建,抽象工厂模式没答上来

百度:工厂模式可以分为三种类型:简单工厂模式、工厂方法模式和抽象工厂模式。简单工厂模式由一个工厂类根据传入的参数动态决定创建哪一个产品类的实例。工厂方法模式则定义了一个创建对象的接口,由子类决定实例化哪一个类。抽象工厂模式则更为复杂,它允许生产一系列相关或独立的产品,而不需要关心具体产品的创建过程。

13.Java怎么调用存储过程?

我的回答:不记得了

百度:@Select("CALL your_procedure_name(#{param1, mode=IN, jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})")

或者

<select id="callYourProcedure" statementType="CALLABLE">

{CALL your_procedure_name(#{param1, mode=IN, jdbcType=INTEGER}, #{param2, mode=OUT, jdbcType=VARCHAR})}

</select>

14.你对spring,springboot,springcloud的理解

我的回答:spring是大的框架,springboot基于约定大于配置,省略了一些配置项,springcloud是一个轻量级微服务框架

百度: Spring 是一个开源应用框架,它解决了开发人员在进行企业级开发时常遇到的一些常见问题。它主要提供了IoC(控制反转)和AOP(面向切面编程)。Spring 的核心是 Spring Core,它提供了依赖注入(DI)特性。

Spring Boot 是 Spring 的一个子项目,它的目标是简化 Spring 应用的初始搭建以及开发过程。它提供了一种快速开发、运行和部署生产级应用的方法。Spring Boot 会以默认配置开启各种功能,这些设置都是针对大多数应用的。

Spring Cloud 是一系列工具,它提供了微服务架构中常见的模式实现,如服务发现注册、配置管理、智能路由、负载均衡等。Spring Cloud 构建于 Spring Boot 之上,使得开发者可以快速的搭建一套完整的微服务系统。

Spring, Spring Boot 和 Spring Cloud 的关系:Spring Boot 专注于快速启动、开箱即用,而 Spring Cloud 关注分布式系统中的服务发现、配置管理、负载均衡、断路器等问题。Spring Cloud 构建于 Spring Boot 之上,Spring Boot 对 Spring 进行了简化和简单化的封装,使开发者能够快速上手。

  • 7
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值