面试题(记录真实面试经历)

1. GC这块你知道吗?

回答面试官:GC(垃圾回收)中“垃圾”是指如果一个或多个对象没有任何的引用指向它了,那么这个对象现在就是垃圾。我还知道垃圾回收算法(如标记清除算法、复制算法、标记压缩算法、分代收集算法)

2. Java的equal与==区别

(1) ==是判断两个变量或实例是不是指向同一个内存空间,equals是判断两个变量或实例所指向的内存空间的值是不是相同 

(2)==是指对内存地址进行比较 , equals()是对字符串的内容进行比较

(3)==指引用是否相同, equals()指的是值是否相同

3. Java的hashmap

HashMap是java的一个数据结构,可以实现键值对的存储查询,它基于哈希表实现;

Jdk1,7以前使用的是数组+链表的结构;使用拉链法,将链表相结合,也就是说创建一个链表数组,数组中每一格就是一个链表;若遇到哈希冲突,则将冲突的值加到链表中即可;

JDK1.8以后,使用的是数组+链表+红黑树的结构;在解决哈希冲突的时候,当链表的长度大于阈值(默认为8)时,将链表转化为红黑树,以减少搜索时间,扩容算法做了调整,不再将元素加入链表头,而是使用尾插法,解决死循环;

4. Java的面向对象

回答:要说面向对象,首先要引出类(类是面向对象中的一个很重要的概念,因为类是很多具有相同属性和行为特征的对象所抽象出来的,对象是类的一个实例)

面向对象共有三大特征:封装、继承、多态

然后跟面试官大谈细谈:封装:把一些属性和方法封装起来,形成一个类,对外提供可以访问的方式,可以提高代码的安全性和复用性

继承:在一个现有的基础上构建一个新的类,构建出来的新类被称作子类,现有类被称作父类,子类能调用父类的非private成员,同时添加一些新的成员扩充父类,甚至重写父类已有的方法,使其表现符合子类的特征。

多态:同一种行为具有不同形式的能力,多态性是对象多种表现形式的体现。方法的重载和重写都可以体现多态性。

5.你知道java的设计模式

单例模式:有懒汉式和饿汉式,饿汉单例模式是在类加载的时候就立即初始化,并且创建单例模式,不管你有没有用到,都先创建好来(创建饿汉式的单例很简单,私有化构造方法;在成员变量位置创建唯一实例;对外提供唯一的访问途径)

懒汉式:私有构造方法;在成员变量位置定义该类的引用;对外提供静态的唯一访问方式

适配器模式:它就像我们电脑接口不够时,需要用到的拓展坞,起到转接作用,将新的功能和原先的功能连接起来,使需求变动导致不能用的功能重新利用起来;

工厂模式:简单工厂模式就是定义一个工厂类,他可以根据参数不同返回不同类的实例,被创建的实例通常都有共同的父类;比如一个Phone的接口,小米手机类(XiaoMi)实现(implement)Phone接口,华为手机类(HuaWei类)实现Phone接口,创建一个工厂类,可以创建小米手机,华为手机

6. 像开发中用了什么设计模式知道吗?

工厂模式,单例模式

7. 你知道这个快排算法吗

实现的基本思想是:通过一次排序将整个无序表分成相互独立的两部分,其中一部分中的数据都比另一部分中包含的数据的值小,然后继续沿用此方法分别对两部分进行同样的操作,直到每一个小部分不可再分,所得到的整个序列就变成有序序列

可以分成以下步骤:

  • 分区:从数组中选择任意一个基准,所有比基准小的元素放在基准的左边,比基准大的元素放到基准的右边
  • 递归:递归地对基准前后的子数组进行分区

8. SpringBoot的自动装配原理

在Spring Boot项目中的引导类上有一个注解@SpringBootApplication,这个注解是对三个注解进行了封装,分别是:

- @SpringBootConfiguration

- @EnableAutoConfiguration

- @ComponentScan

其中`@EnableAutoConfiguration`是实现自动化配置的核心注解。

该注解通过`@Import`注解导入对应的配置选择器。关键的是内部就是读取了该项目和该项目引用的所有Jar包的的classpath路径下**META-INF/spring.factories**文件中的(org.springframework.boot.autoconfigure.EnableAutoConfiguration(127))所配置的类的全类名。

在这些配置类中所定义的Bean会根据(@Conditional)条件注解所指定的条件来决定是否需要将其注册到Spring容器中。

一般条件判断会有像`@ConditionalOnClass`这样的注解,判断是否有对应的class文件,如果有则加载该类,把这个配置类的所有的Bean放入spring容器中使用。ConditionalOnClass ->由@conditional + Condition接口实现类中的方法matches,如果返回true则加载bean对象,false则不加载,配置类则不生效

这个加载方式利用了java SPI机制 service provider interface。即可以通过配置文件(全限定类名)

9. 你知道网关微服务这块吗

Nacos是阿里巴巴开发的,不仅仅可以作为注册中心,还可以作为配置中心

注册中心:

服务提供者在启动时,会将自己的元数据信息注册到Nacos服务器中,同时Nacos也会对注册的服务进行心跳检测,以确保服务的可用性,服务消费者在需要调用服务时,可以通过Nacos的服务发现功能获取服务提供者的地址列表,从而实现负载均衡和服务调用

(总结:服务启动时,会将自己的元数据注册到Nacos中,同时对注册的服务进行心跳检测,当服务消费者需要调用服务时,可以通过Nacos服务发现功能获取服务提供者的地址列表,从而实现负载均衡和服务调用)

配置中心:

配置中心则是负责管理应用程序的配置信息,nacos提供了一个可视化的配置管理界面,支持多种格式的配置文件,支持动态配置管理,当配置信息发生变化时,Nacos会自动推送最新的配置信息给应用程序,从而实现配置的实时更新

(总结:负责管理应用程序配置信息,支持多种格式的配置文件,支持动态管理,配置信息发生变化时,Nacos将会自动推送最新的配置信息给应用程序)

Gateway网关:

用于实现服务的路由、负载均衡、过滤和熔断等功能。采用了异步非阻塞的模型,采用Netty作为底层的HTTP库,提高了网关的吞吐量和性能。

网关中的过滤器:

默认过滤器(只能使用SpringCloudGateway自带的过滤器)

路由过滤器(只能使用SpringCloudGateway自带的过滤器)

全局过滤器(创建一个类实现GlobalFilter接口,重写filter方法.可用于鉴权)

三种过滤器默认执行顺序(默认 -> 路由 -> 全局)全局过滤器实现Ordered接口,重写

getOrder方法,返回-1即可实现在其他两个过滤器前执行(默认 和 路由 过滤器的Order默认是1开始

的)

10 你知道服务雪崩吗

在大型互联网项目中,服务雪崩效应是指由于某个服务出现问题或故障,导致其所依赖的其他服务也无法正常运行,最终导致整个系统多个服务同时失效,形成一个连锁反应的状况。

具体而言,服务雪崩的发生通常包括以下几个关键步骤:

一个或多个服务出现故障或者缓慢响应。这些服务无法及时地进行异常恢复,或者由于资源等原因无法承受更高的负载压力。

故障服务所依赖的其他服务,因为接收到了来自该故障服务的请求而无法及时处理自己的任务。这些服务可能会开始积累未完成的工作。

最终,整个系统中的多个服务都由于负载的不均衡而发生故障,无法正常运行。此时,用户将无法访问各项服务,并且整个系统无法进行任何操作,造成极大损失

11 Redis缓存雪崩

当大量的缓存数据同时过期时,大量的请求会同时访问数据库,导致数据库负载过高 解决方法:给缓存的key设置随机过期时间,防止大量的缓存数据同时过期

12 Redis和mysql的区别

从类型上来说,mysql是关系型数据库,redis是缓存数据库。2、mysql用于持久化的存储数据到硬盘,功能强大,但是速度较慢。redis用于存储使用较为频繁的数据到缓存中,读取速度快。3、mysql和redis因为需求的不同,一般都是配合使用。

  mysql和redis的数据库类型,mysql是关系型数据库,主要用于存放持久化数据,将数据存储在硬盘中,读取速度较慢。redis是NOSQL,即非关系型数据库,也是缓存数据库,即将数据存储在缓存中,缓存的读取速度快,能够大大的提高运行效率,但是保存时间有限。

13. Redis是单线程还是多线程

单线程

14. Redis的缓存穿透

当一个热点数据过期时,(缓存中没有)大量的请求会同时访问数据库,导致数据库负载过高。解决方法有:设置热点数据永不过期,定期更新缓存

15. Redis的分布式锁是什么样的?你知道这个分布式锁的应用场景吗

Redis 的 SETNX 命令可以用来实现分布式锁。当需要获得锁时,调用 SETNX 命令尝试将一个字符串作为 key 插入到 Redis 中,如果插入成功则表示获得了锁,否则表示锁已被其他线程占用。释放锁时,删除该 key 即可。为避免死锁,需要为锁设置一个过期时间。

       接口幂等性控制:在高并发场景下,为了避免重复请求对系统造成影响,需要使用分布式锁来保证接口幂等性。

秒杀抢购:在秒杀抢购场景中,需要使用分布式锁保证每个用户只能抢购一次

16.Mysql的视图

为了提高复杂SQL语句的复用性和表操作的安全性,MySQL数据库管理系统提供了视图特性。所谓视图,本质上是一种虚拟表,在物理上是不存在的,其内容与真实的表相似,包含一系列带有名称的列和行数据。但是,视图并不在数据库中以储存的数据值形式存在。行和列数据来自定义视图的查询所引用基本表,并且在具体引用视图时动态生成。

视图的特点如下:

· 视图的列可以来自不同的表,是表的抽象和在逻辑意义上建立的新关系。

· 视图是由基本表(实表)产生的表(虚表)。

· 视图的建立和删除不影响基本表。

· 对视图内容的更新(添加,删除和修改)直接影响基本表。

· 当视图来自多个基本表时,不允许添加和删除数据。

视图的操作包括创建视图,查看视图,删除视图和修改视图。

      17. Mysql的聚合函数有哪些

AVG()

SUM()

MAX()

MIN()

COUNT()

18.  Mysql怎么分库分表

第一步,确定分库分表的策略。

分库分表通常分为两种方式,垂直划分和水平划分。

垂直划分指的是按照表的列将其分成不同的表,目的是将最常使用的列和不常使用的列分离开,提高数据库的效率。

水平划分指的是将一张表按照某个规则分成多张表,比如可以按照时间、用户ID、地区等将数据分别存储到不同的表中。

第二步,进行数据备份和迁移。

在分库分表之前,必须对原数据库进行备份,并将备份数据迁移到新的服务器上。具体来说,我们可以使用MySQL官方提供的工具mysqldump,将原数据库备份到本地,再使用scp命令将其迁移到新服务器上

第三步,进行分库分表操作。

在MySQL中,常用的分库分表方法有两种:手工分表和自动水平分表。

手工分表指的是使用程序手动将表拆分为多个表,并进行数据迁移。

自动水平分表则是使用分库分表工具,将表按照某个规则自动划分成多个表。

其中,比较流行的分库分表工具有Sharding-JDBC、MyCAT、Cobar等。这些工具都支持自动水平分表,可以根据配置对表进行分片,实现水平扩展。

19. Linux的日志命令

1、tail命令,用于查看前多少行日志;2、head命令,用于查看后多少行日志;3、cat命令,可用于查询关键字的日志;4、sed是能够通过正则表达式对文件进行批量编辑查看等操作;5、grep可以直接查询日志文件关键字;6、more/less命令可以分页查看日志

20. Git冲突怎么处理

选择远程的代码或者自己的代码其中一个即可以解决冲突

21.你们项目开发使用的快速开发框架吗?知道哪些快速开发框架,开源的低代码平台

有,宜搭——阿里,宜搭——阿里,织信Informat——基石协作,轻舟——网易,记住一两个就行

22. ERP有了解吗

一般来说,ERP是一个以会计(此处的会计是指管理会计)为核心的信息系统,用来识别和规划企业资源,从而获取客户订单,完成加工和交付,最后得到客户付款,最终获得收入和利润。实际上,ERP系统就是将企业内部所有资源整合在一起,对采购、生产、成本、库存、销售、运输、财务、人力资源进行规划和优化,从而达到最佳资源组合,获取最高利润的行为。

23. 你做这些最困难的是什么东西

可以距举自己的例子,如最新学到的技术

24. 你自己的优点有哪些

要举得出例子

25. 写过接口文档吗?

写过,与前端先交流好来,定义好请求参数,返回参数,请求方法等。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

clh_策码扬鞭

你的鼓励就是对我的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值