JAVA开发相关面试题整理(1)2021-10月

前题:因为是第一篇文章,交代一下也是想记录一下写作背景。

在外地外企做了多年Java开发,今年想要回家想找工作,就打开了求职APP,然后马上就有猎头联系,安排电话面试,我基本没什么准备,这几年也没有什么求职经历,就硬着头皮上,看看现在招聘都问什么吧。结果上来第一个问题就让我一脸懵,啥?哦哦,有关多线程的,嗯,有印象,用过,肯定一定确定用过,但是说不出来,相关概念一片茫然,面试官能继续问下去我觉得他人真的是太好了。然后半小时的面试期间,有很多我有印象,确实切身使用过的技术问题,但我基本答不上来或者很模糊,我尴尬的搜肠刮肚,可惜肚肠空空如也,只能凭借项目经验说我确实用过,用它解决过问题。然后可能是外包公司要求不高,或者自己厚颜觉得我多年经验还算有点用处吧,猎头后来联系我说是会安排我后续面试,我真是亚历山大啊,这社死修罗场还要再来一遍么。所谓知耻而后勇,虽然我已经不是那个心高气傲的少年,在安逸中日常摸鱼混日子太久,脸皮都已经变厚,但还是想尽量不让自己太狼狈。而且我现在直面紧急任务啊,家里希望我年前就回家乡工作,已经联系朋友帮忙了,人情珍贵,而且难道要丢人丢到家乡父老眼前么???

 努力吧,那能咋办呢,赶鸭子上架,骑虎难下啊。工欲善其事,必先利其器,好久没认真学习,真的担心自己的学习效率,没时间慢慢来了,学习效率很重要,我就先找了一波学习方法。CSDN 上面好多大佬分享的学习经验,我尝试找适合自己的,先用着,后续再改善。速成的方法首选就是背面试题了,然后我就定了一个简陋的计划,

一:先罗列自己被问到的面试题,找答案,背答案,整理答案整理记录下来(就是写一波,就是这篇文章想写在正文里面的,手写是来不及不方便了),之后仔细看两遍答案,然后放到语音软件里面反复听(可以利用上碎片时间和上班摸鱼时间),基本记下来了就复述答案(来讲上一波,录下来对答案看看效果)。就希望保证基本能把答案简要说出来,起码下次再被问到,我不会说上次问过了但是我还是不会。

二:后面再去搜罗论坛里大家分享的面试题刷背题,然后尽量把用过的东西和理论概念联系上,没用过的就对比用过的强制记忆。

三:面试应该还要考算法题吧,用了不确定的语气是因为真的不想做,畏难情绪作祟啊,但是没办法,还是要刷,基本都会要求的吧,手撕代码真的是,唉,不能怕手疼,上吧。关键其实我有一个选择就是去亲戚朋友开的小公司里面转做算法工程,不需要面试,可以直接进,然后他会陪训我,所以即使我想偷懒不想做这些准备Java面试的活,算法也是绕不开的痛啊。

要不要转行做AI,也是个问题,机会挺好,不然以我的学历很难应聘上的,虽然二十几人小公司,但是老板是亲近人,研究的是人工智能节能减排,非常前沿,冒险也是真冒险。不知者无畏,刚开始听说这个机会我一秒上头,不用面试,多好啊,最怕面试了,后续要学算法,嗯,能学,基础要重学一下高等数学和线性代数,嗯,重温大学时光啊,等收到学习资料,嗯,真的是个严峻的挑战啊。然后这位长辈也跟我说,想挑战一下的话就去他那里,不然的话就还是去应聘软件开发,这样可以保留一点优势,本来从外企转到国内就基本放弃掉了外语优势,开发经验优势也放弃的话,就要和00后一个起点竞争了。 但是人工智能现在看也是大势所趋,开发现在不转行,将来年纪大了被行业嫌弃了可能还是要转其他领域的,云计算大数据人工智能三大领域总要了解的。

还没考虑好,就先整理一下面试题吧,前言废话太多,抱歉。

面试题:

1. 你说你主要做的是Java开发,那你说一说同步锁Synchronized 吧

Synchronized解决多线程并发的线程安全问题,可以保证方法或者代码块在运行时,同一时刻只有一个方法可以执行,还能让线程变化可见。例子:多窗口卖票。

Java中每一个对象都可以作为锁,synchronized可以修饰:普通方法,静态方法,代码块。

如果synchronized修饰的对象是非静态的,锁是对象;如果synchronized修饰的对象是静态方法或一个类,锁是类,类的所有的对象是同一把锁。 每个对象只有一个锁相关联。
 

2. 说一下你了解的Spring boot 有哪些注解?

@SpringBootApplication SpringBoot项目启动类。

@Configuration  项目的配置主类,可以使用@ImportResource注解加载xml配置文件。@EnableAutoConfiguration 自动配置。
@ComponentScan  自动发现扫描组件。

@Controller 定义控制器类
@ResponseBody 返回结果直接写入HTTP response body中,一般在异步获取数据时使用,用于构建RESTful的api。在使用@RequestMapping后,返回值通常解析为跳转路径,加上@esponsebody后返回结果不会被解析为跳转路径,而是直接写入HTTP response body中。
比如异步获取json数据,加上@Responsebody后,会直接返回json数据。该注解一般会配合@RequestMapping一起使用。
@RestController 是@Controller和@ResponseBody的合集。使用在类上,表示该类是控制器,并且类中所有控制器方法的返回值直接填入HTTP响应体中,是RESTful风格的控制器,控制器方法返回JSON数据。
@RequestMapping 提供路由信息,负责URL到Controller中的具体方法的映射。

@Import 用来导入其他配置类(加了@Configuration注解的类)。

@ImportResource 用来加载xml配置文件。

@PathVariable 获取URL上的参数(Restful风格接口)。

@Service 一般用于修饰service层的组件

@Repository 使用@Repository注解可以确保DAO或者repositories提供异常转译,这个注解修饰的DAO或者repositories类会被ComponetScan发现并配置,同时也不需要为它们提供XML配置项。

@Bean 用@Bean标注方法等价于XML中配置的bean,意思是产生一个bean,并交给SpringBoot管理。

@Value 注入SpringBoot中的配置文件——application.properties配置的属性的值。

@Inject 等价于默认的@Autowired,只是没有required属性。

@Component 泛指组件,当组件不好归类的时候,我们可以使用这个注解进行标注。

@AutoWired 自动导入依赖的bean。byType方式。把配置好的Bean拿来用,完成属性、方法的组装,它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。当加上(required=false)时,就算找不到bean也不报错。

@Qualifier 当有多个同一类型的Bean时,可以用@Qualifier(“name”)来指定。与@Autowired配合使用。@Qualifier限定描述符除了能根据名字进行注入,但能进行更细粒度的控制如何选择候选者。

@Resource(name=”name”,type=”type”) 没有括号内内容的话,默认byName。与@Autowired干类似的事。

@JsonBackReference 解决嵌套外链问题。

@RepositoryRestResourcepublic 配合spring-boot-starter-data-rest使用。 全局异常注解

@ControllerAdvice 包含@Component,可以被扫描到。统一处理异常。

@ExceptionHandler(Exception.class) 用在方法上面表示遇到这个异常就执行以下方法。

JPA注解
JPA是ORM思想的规范接口,存在两个核心:建立表与实体类的映射。建立表字段与实体类属性映射,操作实体类就是操作表。Hibernate框架作为JPA的实现者之一。

@Entity&@Table(name=“表名”)

@Entity注解表明这是一个实体类。
@Table(name=“表名”)映射一张表,但是如果表名和实体类名相同的话,@Table可以省略。

@MappedSuperClass

用在确定是父类的entity上。父类的属性子类可以继承。

@NoRepositoryBean

一般用作父类的repository,有这个注解,SpringBoot不会去实例化该repository。

@Column

建立表字段与实体类属性映射,如果字段名与列名相同,则可以省略。

@Id

表示该属性为主键。

@Transient

表示该属性并非一个到数据库表的字段的映射,ORM框架将忽略该属性。
如果一个属性并非数据库表的字段映射,就务必将其标示为@Transient,否则,ORM框架默认其注解为@Basic。
@Basic

@Basic(fetch=FetchType.LAZY):标记可以指定实体属性的加载方式

@GeneratedValue

@GeneratedValue(strategy = GenerationType.SEQUENCE,generator = “repair_seq”)表示主键生成策略是sequence(可以为Auto、IDENTITY、native等,Auto表示可在多个数据库间切换),指定sequence的名字是repair_seq。

@SequenceGeneretor

@SequenceGeneretor(name = “repair_seq”, sequenceName = “seq_repair”, allocationSize = 1):name为sequence的名称,以便使用,sequenceName为数据库的sequence名称,两个名称可以一致。

@JsonIgnore

作用是json序列化时将Java bean中的一些属性忽略掉,序列化和反序列化都受影响。

@OneToOne、@OneToMany、@ManyToOne

对应多表之间的一对一,一对多,多对一关系。

3.Spring cloud 有哪些组件

答案一:SpringCloud 是微服务架构的集大成者,将一系列优秀的组件进行了整合。基于springboot构建。

1、服务发现与注册 Eureka和Nacos
2、服务调用 Feign和OpenFeign
3、负载均衡 Ribbon
4、服务网关 Zuul和Gateway
5、配置中心 Config
6、熔断器 Hystrix
7、服务总线 Bus

答案二:springcloud由以下⼏个核⼼组件构成:

1、 Eureka:各个服务启动时,Eureka Client都会将服务注册到Eureka Server,并且Eureka Client还可以反过来从Eureka Server拉取注册表,从⽽知道其他服务在哪⾥

2、 Ribbon:服务间发起请求的时候,基于Ribbon做负载均衡,从⼀个服务的多台机器中选择⼀台

3、 Feign:基于Feign的动态代理机制,根据注解和选择的机器,拼接请求URL地址,发起请求

4、 Hystrix:发起请求是通过Hystrix的线程池来⾛的,不同的服务⾛不同的线程池,实现了不同服务调⽤的隔离,避免了服务雪崩的问题

5、 Zuul:如果前端、移动端要调⽤后端系统,统⼀从Zuul⽹关进⼊,由Zuul⽹关转发请求给对应的服务

4.MyBatis XML 中插入操作的动态SQL是什么样子? 实体类与数据表是怎么对应的?MyBatis 的注解有哪些?

MyBatis动态sql可以在Xml映射文件内,以标签的形式编写动态sql。执行原理是根据表达式的值完成逻辑判断并动态拼接 sql 的功能。MyBatis提供了9种动态sql标签:trim、where、set、foreach、if、choose、when、otherwise、bind。

Mybatis是如何将sql执行结果封装为目标对象并返回的?都有哪些映射形式?

答:

第一种是使用<resultMap>标签,逐一定义列名和对象属性名之间的映射关系。

第二种是使用sql列的别名功能,将列别名书写为对象属性名,比如T_NAME AS NAME,对象属性名一般是name,小写,但是列名不区分大小写,Mybatis会忽略列名大小写,智能找到与之对应对象属性名,你甚至可以写成T_NAME AS NaMe,Mybatis一样可以正常工作。

有了列名与属性名的映射关系后,Mybatis通过反射创建对象,同时使用反射给对象的属性逐一赋值并返回,那些找不到映射关系的属性,是无法完成赋值的。

Mybatis常用注解

1>@Insert :实现新增
2>@Update:实现更新
3>@Delete:实现删除
4>@Select:实现查询
5>@Result:实现结果集封装
6>@Results:可以与@Result 一起使用,封装多个结果集
7>@ResultMap:实现引用@Results 定义的封装
8>@One:实现一对一结果集封装
9>@Many:实现一对多结果集封装
10>@CacheNamespace:实现注解二级缓存的使用

复杂关系映射的注解说明

1>@Results 注解 代替的是标签<resultMap>
2>@Resutl 注解 代替了 <id> 标签和<result> 标签
3>@One 注解(一对一) 代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象
4>@Many 注解(多对一)代替了<assocation> 标签,是多表查询的关键,在注解中用来指定子查询返回单一对象

5.用过哪些数据?Mysql 的特点,怎么查表中重复的数据,说说mysql 的索引

MySQL是一个小型关系型数据库管理系统,开发者为瑞典MySQL AB公司,现在已经 
被Sun公司收购,支持FreeBSD、Linux、MAC、Windows等多种操作系统 
与其他的大型数据库例如Oracle、DB2、SQL Server等相比功能稍弱一些 
1、可以处理拥有上千万条记录的大型数据 
2、支持常见的SQL语句规范 
3、可移植行高,安装简单小巧 
4、良好的运行效率,有丰富信息的网络支持 
5、调试、管理,优化简单(相对其他大型数据库)

索引,都是实现在存储引擎层的。主要有六种类型:

1、普通索引:最基本的索引,没有任何约束。

2、唯一索引:与普通索引类似,但具有唯一性约束。

3、主键索引:特殊的唯一索引,不允许有空值。

4、复合索引:将多个列组合在一起创建索引,可以覆盖多个列。

5、外键索引:只有InnoDB类型的表才可以使用外键索引,保证数据的一致性、完整性和实现级联操作。

6、全文索引:MySQL 自带的全文索引只能用于 InnoDB、MyISAM ,并且只能对英文进行全文检索,一般使用全文索引引擎。
 

请写查询语句查询出name字段中重复的值。这个需要用到子查询  先查询出重复字段的值,根据分组统计name字段相同值的 数据条数大于1的就是重复的数据

即  select name from users group by name having count(*) > 1

查到重复的数据 指的是得到了重复数据的 name值  然后再把这个重复值作为条件去查询

select * from users as a where (a.name) in (select name from users group by name having count(*) > 1);

注意:此时的主查询语句的表名需要取别名  因为子查询用的表名和主查询的表名需要区分
 

6. 用过redis 或者mongodb么, 项目中缓存,字节表是怎么处理的

 redis的适用场景?项目中哪里用过redis?

  • 缓存热点数据:如缓存标的列表

  • 计数器:一个月内优惠券一万张,发一张就减一

  • 分布式锁:比如一个人在交易完成前不能再进行第二次操作,用分布式锁来保证。再比如抢标时标的金额递减,也用分布式锁来保证。用setnx实现的

MySQL是关系型数据库,常用于存储结构化数据,并且支持事务。

MongoDB和redis都是非关系型数据库,MongoDB当做数据库使用,如果不确定数据的结构,就可以使用MongoDB,便于扩展字段。

redis当做缓存使用,查询非常快速,比如可以存储热点数据,缩小给前端的返回时间。
 

7. MQ, Kafka 怎么处理数据丢失和重复消费

消费者丢失消息:消费者丢数据一般是因为采用了自动确认消息模式,改为手动确认消息即可!

消费者在收到消息之后,处理消息之前,会自动回复RabbitMQ已收到消息;

如果这时处理消息失败,就会丢失该消息;

解决方案:处理消息成功后,手动回复确认消息。

如何保证消息不被重复消费?或者说,如何保证消息消费时的幂等性?

先说为什么会重复消费:正常情况下,消费者在消费消息的时候,消费完毕后,会发送一个确认消息给消息队列,消息队列就知道该消息被消费了,就会将该消息从消息队列中删除;

但是因为网络传输等等故障,确认信息没有传送到消息队列,导致消息队列不知道自己已经消费过该消息了,再次将消息分发给其他的消费者。

针对以上问题,一个解决思路是:保证消息的唯一性,就算是多次传输,不要让消息的多次消费带来影响;保证消息等幂性;

比如:在写入消息队列的数据做唯一标示,消费消息时,根据唯一标识判断是否消费过;

假设你有个系统,消费一条消息就往数据库里插入一条数据,要是你一个消息重复两次,你不就插入了两条,这数据不就错了?但是你要是消费到第二次的时候,自己判断一下是否已经消费过了,若是就直接扔了,这样不就保留了一条数据,从而保证了数据的正确性。
 

8. 说一下Spring 的 Ioc 和 AOP

IOC:控制反转也叫依赖注入,IOC利用java反射机制,AOP利用代理模式。所谓控制反转是指,本来被调用者的实例是有调用者来创建的,这样的缺点是耦合性太强,IOC则是统一交给spring来管理创建,将对象交给容器管理,你只需要在spring配置文件总配置相应的bean,以及设置相关的属性,让spring容器来生成类的实例对象以及管理对象。在spring容器启动的时候,spring会把你在配置文件中配置的bean都初始化好,然后在你需要调用的时候,就把它已经初始化好的那些bean分配给你需要调用这些bean的类。 
AOP:面向切面编程。(Aspect-Oriented Programming) 
AOP可以说是对OOP的补充和完善。OOP引入封装、继承和多态性等概念来建立一种对象层次结构,用以模拟公共行为的一个集合。实现AOP的技术,主要分为两大类:一是采用动态代理技术,利用截取消息的方式,对该消息进行装饰,以取代原有对象行为的执行;二是采用静态织入的方式,引入特定的语法创建“方面”,从而使得编译器可以在编译期间织入有关“方面”的代码,属于静态代理
 

9. 分布式事务的处理

目前使用较多的分布式事务解决方案有几种:
一、结合MQ消息中间件实现的可靠消息最终一致性
二、TCC补偿性事务解决方案
三、最大努力通知型方案

10. 使用什么版本管理工具

Git, Maven

11. 你在项目中有负责架构设计工作么,你在工作中有使用什么公司特色软件么

参与过架构设计意见建议,做过Agile Scrum master工作。cloud.

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

lmhada

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值