Java进阶面试

进阶面试

1.链表和数组的区别,优缺点及原理

数组:
特点:
1.数组在内存中是一块连续的区域,
2.数组需要预留空间,
3.在数组的起始位置处,插入和删除的效率低
4.随机访问效率高,时间复杂度可达到O(1)
5.数组的空间不够时,需要扩容。扩容的话就会要把就数组中的所有元素想新数组中搬移
6.数组的空间是从栈分配的
优点:随机访问性强,查询速度快,时间复杂度为O(1)
缺点:
1.头插和头删的效率低
2.空间利用率不高
3.内存空间的要求高,必须有足够的内存空间
4.空间大小固定,不能动态扩展
链表:
特点:
1.在内存中的空间是分散的,不需要连续
2.链表中的元素都会有两个属性,一个是元素的值,另一个是指针,指针标记了下个元素的地址
3.查找数据时效率低
4.空间是动态申请的,根据需求动态的申请和删除内存空间,扩展方便,空间利用率高
5.任意位置插入和删除元素的效率高
6.链表的空间是从堆中分配的
优点:
1.任意位置插入元素和删除元素的速度快,时间复杂度为O(1)
2.内存的利用率高,不会浪费内存
3.链表的空间可以动态扩展
缺点:
随机访问效率低,时间复杂度为O(N)

2.如果让你设计一个链表,会怎么设计完成它,说说思路和基本逻辑

3.文件的读取和打印,给一个路径如何实现

4.排序方法,选择一个手写代码

5.MyBastis关联查询

6.了解多线程吗?用过什么组件或技术

7.数据库查询缓慢的原因,怎么解决

8.用过什么云存储

9.如果页面图片加载缓慢怎么办

10.聊一聊分布式缓存

11.MQ的应用场景

12.spring的AOP和IOC,设计模式

13.MyBatis和hibernate有没有了解,MyBatis的缓存机制

14.数据库引擎了解哪些,区别是什么

15.乐观锁和悲观锁?死锁?

16.GC的垃圾回收机制

17.哈希冲突是什么?发生哈希冲突会怎么样?

18.知道哪些常用的设计模式

19.支付时出现的异常和方案

20.bean实现原理

21.spring的servelet流程

22.拦截器和过滤器的区别

23.Gateaway 和 Eureka分别承担什么角色,有注册中心不要网关可以吗

24.微服务部署

25.在eureka一个节点里面每个微服务是部署多少个点,更新服务时用eureka会导致服务不可用,对应的解决方法

26.redis分布式集群有什么理解,有哪些分类,怎么使用到项目,redis的数据结构类型有哪些

27.消息中间件区别,项目中怎么使用

28.部署nginx

29.对分页功能时怎么理解的,原理是什么,做分页时考虑查询速度,分页响应能力,以及堆数据库或者内存的压力怎么做分析

30.springcloudalibaba有哪些组件,为什么使用springcloudalibaba

SpringCloud Alibaba主要功能
分布式配置
分布式系统的外部配置管理,配置中心可视化、分环境配置控制。配置动态更新能力。
服务注册与发现
适配SpringCloud标准的服务注册与服务发现管理。
服务限流与降级
可通过控制台进行实时的修改限流降级的规则,实时的Metrics监控。支持多种协议
消息驱动
基于RocketMQ实现消息驱动的业务场景开发。
分布式事物开源Seata使用@GlobalTransactional注解,零侵入的实现分布式事物的支持。
SpringCloud Alibaba核心组件
Nacos (配置中心与服务注册与发现)
Nacos实现了服务的配置中心与服务注册发现的功能,Nacos可以通过可视化的配置降低相关的学习与维护成本,实现动态的配置管理与分环境的配置中心控制。同时Nacos提供了基于http/RCP的服务注册与发现功能。

Sentinel (分布式流控)
Sentinel是面向分布式微服务架构的轻量级高可用的流控组件,以流量作为切入点,从流量控制,熔断降级,系统负载保护等维度帮助用户保证服务的稳定性。常用于实现限流、熔断降级等策略。

RocketMQ (消息队列)
RocketMQ基于Java的高性能、高吞吐量的消息队列,在SpringCloud Alibaba生态用于实现消息驱动的业务开发,常见的消息队列有Kafka、RocketMQ、RabbitMQ等,相关的比较文档可以自行去翻阅。

Seata (分布式事物)
既然是微服务的产品,那么肯定会用到分布式事物。Seata就是阿里巴巴开源的一个高性能分布式事物的解决方案。

Dubbo (RPC)
Dubbo已经在圈内很火了,SpringCloud Alibaba基于上面提到的Nacos服务注册中心也同样整合了Dubbo。

其他
SpringCloud Alibaba还有一些其他的组件选择,例如schedulerX、SMS、OSS等。但是由于其主要是阿里云的商业化产品就不再过多的进行介绍。集成其商业化产品时才能用到。

1.SpringCloud说实话已经不再完整了,它的很多组件已经闭包了,换句话说就是不在提供维护了
2.性能方面SpringCloud Alibaba 比SpringCloud 高很多
3.稳定,阿里巴巴相信大家都很熟悉,基本不会跑路的
4.不管是孵化失败,还是别的原因导致了它不在完整了,所以我们要学习albb的
5.阿里巴巴高并发等方面是有目共睹的,性能肯定好,而且简单
6.SpringCloud有基础的可以直接转SpringCloud Alibaba

31.分布式事务怎么做的两阶段提交方案/XA方案

所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数据库都回复 ok,那么就正式提交事务,在各个数据库上执行操作;如果任何其中一个数据库回答不 ok,那么就回滚事务。

这种分布式事务方案,比较适合单块应用里,跨多个库的分布式事务,而且因为严重依赖于数据库层面来搞定复杂的事务,效率很低,绝对不适合高并发的场景。如果要玩儿,那么基于 Spring+JTA 就可以搞定,自己随便搜个 demo 看看就知道了。

这个方案,我们很少用,一般来说某个系统内部如果出现跨多个库的这么一个操作,是不合规的。我可以给大家介绍一下, 现在微服务,一个大的系统分成几十个甚至几百个服务。一般来说,我们的规定和规范,是要求每个服务只能操作自己对应的一个数据库。

如果你要操作别的服务对应的库,不允许直连别的服务的库,违反微服务架构的规范,你随便交叉胡乱访问,几百个服务的话,全体乱套,这样的一套服务是没法管理的,没法治理的,可能会出现数据被别人改错,自己的库被别人写挂等情况。

如果你要操作别人的服务的库,你必须是通过调用别的服务的接口来实现,绝对不允许交叉访问别人的数据库。

32.RabbitMQ经典问题解决方案(重复消费、丢失数据、消息有序)

重复消费
保证消息不被重复消费的关键是保证消息队列的幂等性,这个问题针对业务场景来答分以下几点:
1.比如,你拿到这个消息做数据库的insert操作。那就容易了,给这个消息做一个唯一主键,那么就算出现重复消费的情况,就会导致主键冲突,避免数据库出现脏数据。
2.再比如,你拿到这个消息做redis的set的操作,那就容易了,不用解决,因为你无论set几次结果都是一样的,set操作本来就算幂等操作。
3.如果上面两种情况还不行,上大招。准备一个第三方介质,来做消费记录。以redis为例,给消息分配一个全局id,只要消费过该消息,将<id,message>以K-V形式写入redis。那消费者开始消费前,先去redis中查询有没消费记录即可。
如何解决丢数据的问题?

1.生产者丢数据
生产者的消息没有投递到MQ中怎么办?从生产者弄丢数据这个角度来看,RabbitMQ提供transaction和confirm模式来确保生产者不丢消息。
transaction机制就是说,发送消息前,开启事物(channel.txSelect()),然后发送消息,如果发送过程中出现什么异常,事物就会回滚(channel.txRollb信息,sql发生异常后,自定义异常进行响应
6. 过滤参数中含有的一些数据库关键词

46.stringbuffer和stringbuild的区别

string声明的是不可变的对象,每次操作必然产生一个新的对象;stringbuffer和stringbuilder都继承自抽象类abstractstringbuilder;
stringbuffer具备线程安全;
再使用场景上,并发必选stringbuffer,迭代必选stringbuilder,普通场景选string,避免中途不必要的类型转换开销。

47.说几个常用的linux名令

gzip 解压 tar jxvf 解压命令 ifconfig 显示网络设置
cat 查看 ll ls 查看目录

48.docker的常用命令

docker images:列出本地所有镜像
docker pull <IMAGE_ID> : 下载image
docker push <IMAGE_ID>:上传image
docker rmi <IMAGE_ID>:删除image
使用docker run命令去启动镜像,-d表示后台运行,-P表示随机端口,-p指定端口

版权声明:玥玥 发表于 2021-06-10 9:40:10。
转载请注明:Java进阶面试 | 女黑客导航