Java 面试题集锦记录

2023-12-28 10:01:27

1. SpringBoot、SpringCloud区别

  1. 作用不同;前者的作用是为了提供一个默认配置,从而简化配置过程;后者的作用是为了给微服务提供一个综合管理框架。2. 使用方式不同;前者可以单独使用;springcloud必须在springboot使用的前提下才能使用。

springboot和springcloud都是从spring生态圈中衍生出来的软件开发框架,但是二者的创作初衷是完全不同的,springboot的设计目的是为了在微服务开发过程中可以简化配置文件,提高工作效率,而springcloud的设计目的是为了管理同一项目中的各项微服务,因此二者是完全不同的两个软件开发框架。

@SpringBootApplication是一个组合注解,它整合了@Configuration、@EnableAutoConfiguration和@ComponentScan注解,并开启了Spring Boot程序的组件扫描和自动配置功能。

2. SpringCloud怎么保证服务间通信?

Eureka 每隔一段时间向注册中心同步一次心跳,更新上下线及其他服务状态信息

3. Spring怎么保持高可用性、稳定性?

可以采用多个实例来保证服务的高可用性和负载均衡。可以通过使用服务注册与发现机制,如Eureka、Consul等来进行服务的注册与发现,同时结合负载均衡算法(如轮询、随机、加权轮询等)来分配请求。此外可以使用断路器(如Hystrix)来避免因服务实例挂掉或响应时间过长时对整个系统造成影响。在配置多个实例时,还需考虑实例间的通信问题和数据同步问题。

Retry+Hystrisx

4. 负载均衡

用的ribbon(轮询、随机、加权轮询)

5. Rabbitmq 怎么避免重复消费,消费模式

消费过的加pg/redis,消费时先判断是否消费过;成功消费后提交offset

  • 简单队列模型(单消费者/生产者 消费完删除 优缺点:简单;不支持多个消费者并发消费;)
  • 工作队列模型(单生产者多消费者平均干活 优缺点:消费负载均衡可实现更高吞吐量;无法根据消息优先重要等级去处理;)
  • 发布/订阅模型(都收到广播 优缺点:支持广播发布和订阅,无法动态路由;)
  • 路由模型(支持基于路由键的动态路由 优缺点:可根据高优先级动态去发送队列;需要提前配置好交换机和队列的绑定关系)
  • 主题模型(支持更灵活、更具体的消息路由和过滤。优缺点:灵活;配置化更复杂)

6. Spring用到了哪几种设计模式,Java设计模式

  • 工厂模式(一堆创建类工厂的方法,不暴露类的细节 BeanFactory)
  • 单例模式(对象 实例,保证一个对象只创建一个实例)
  • 代理模式(SpringAOP 动态代理)
  • 原型模式(复制一个类)
  • 策略模式
  • 适配器模式
  • 观察者模式
  • 模板模式

JVM

Java Virtual Machine,核心组件,解释和执行Java字节码。编译一次,实现了Java的跨平台;

Java垃圾回收机制

jvm垃圾回收机制采用的时分代回收思想,将内存区域划分为新生代和老年代。新生代又分为伊甸区和幸存区,幸存区又由大小相等的两个区组成。刚建立的对象会处于伊甸区,然后会经过GC进入幸存区1,再一次GC如果还没被清理,就会进入幸存区2.如果幸存区2.中再经历过GC还没被清理,又会进入幸存区1.在幸存区之间没转变一次。对象的年龄就会加一。当年龄达到15后会进入老年代。

ES篇

ElasticSearch:分布式实时的存储文件系统、搜索引擎、分布式、可拓展、TB级别的结构化/非结构化数据;倒排索引(分词);Cluster、Node、Shards、Replica;

Redis篇

内存中的数据结果存储系统;

redis缓存穿透、雪崩、击穿

是一个比较好的开头;自我介绍 or 项目介绍 or 问答
面试官逻辑思维能力很好,很谦逊。面试过程比较愉快,或者技术,或者提问的问题,都比较亲和。当然也问了我技术问题等,不是很深入的,一些我也没能回答上来。

事务、隔离级别、锁

隔离级别

脏读(A读到了B未提交的)、幻读(读取已提交内容,范围读取,在同一个事务内相同的条件(age > 10)多次读取到的数据量不一致。)、不可重复读(同一个事务内,相同的条件(age = 10)多次读取的数据结果不一致。)

  1. Read Uncommitted(读取未提交内容):出现脏读,也就是可能读取到其他会话中未提交事务修改的数据。
  2. Read Committed(读取已提交内容):不可重复读,只能读取到已经提交的数据。Oracle 等数据库默认的隔离级别。
  3. Repeatable Read(可重复读):出现幻读。在同一个事务内的查询都和事务开始时刻一致。InnoDB默认级别。
  4. Serializable(串行读):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞。

分布式事务

CAP(Consistency、Avaliability、Partition Tolerance) 关系型数据库CA;跨行转账CP;NoSql数据库AP;
在分布式系统中,AP的应用是比较多的,即保证系统的可用性和分区容忍性,牺牲数据的强一致性(写操作后立即读取新数据),保证数据的最终一致性。比如:订单退款、今日退款成功、明日到账等等。


  • 乐观锁适用于读操作多的场景,而悲观锁适用于写操作多的场景。
    synchronized、ReentrantLock 都属于悲观锁,而AtomicInteger.incrementAndGet 则属于乐观锁。

ArrayList,线程安全扩容

  • ArrayList 结构,扩容后怎么实现的,有没有list是线程安全的
    Collections.synchoronizedList()
    Collections.copyOnWriteArrayList
    CopyOnWrite VS Vector
    在 get() 操作上,Vector 使用了同步关键字,所有的 get() 操作都必须先取得对象锁才能进行。在高并发的情况下,大量的锁竞争会拖累系统性能。反观CopyOnWriteArrayList 的get() 实现,并没有任何的锁操作。

    在 add() 操作上,CopyOnWriteArrayList 的写操作性能不如 Vector,原因也在于Copy-On-Write,写入时不止加锁,还使用了Arrays.copyOf()进行了数组复制,性能开销较大,遇到大对象也会导致内存占用较大。

    在读多写少的高并发环境中,使用 CopyOnWriteArrayList 可以提高系统的性能,但是,在写多读少的场合,CopyOnWriteArrayList 的性能可能不如 Vector。

list、set、concurrentHashMap

交易幂等怎么避免重复

  • 交易怎么避免重复交易(幂等交易这种怎么控制)
    前后端结合着来
    幂等性:任意多次执行对资源本身所产生的影响均与一次执行的影响相同。
    生成token加到redis查询,以避免多次重复错误的处理;
    source+序列号~~~ 加入redis/或者存入数据库
    唯一全局id加入redis/或者存入数据库

跨行业,怎么去更新学习业务方面的知识?

经验、交流、积累
分块–大框架—每一个点
吃透每一个点—自己编织一张网

偏技术太久——像业务靠近的重要性;
从客户出发,市场需求价值,多思考 & 本质是否赚钱——来自东哥的,感觉也挺不错的,是个切入点。

文件流

zip包免生成文件直接封装二进制流(文件跨路径校验,文件个数超多校验,文件大小超大校验等)

Java 8新特性:try-with-resources 文件流自动关闭;

lambda表达式是什么?

匿名函数,把函数作为参数传递给方法;代码简洁度;

Stream是什么?

1. 对象3特性

封装继承多态(encapsulation,inherits、polymorphism)

2. 抽象类和接口的差别

3. 内部类和静态内部类的差别

4. TCP/IP七层网络模型

也可以说是4层,(从上到下)包括了应用层、表示层、会话层、传输层、网络层、数据链路层、物理层。

5. 进程/线程

进程是操作系统分配资源的基本单位;线程是操作系统调度的基本单位;
一个进程内有多个线程,进程内多个线程共享资源;进程调度更耗资源时间等;线程调度更方便;

6. 数据表操作增删查改的关键字

select、update、delete/drop、insert

7. 正则表达式匹配数字

\d+ \w+

8. 重载、重写

都是子类与父类间,重载(参数个数、类型、排列顺序)

9. 浅拷贝、深拷贝

对象内引用对象的复制与否,深拷贝:改变新对象原对象不受影响;浅拷贝原对象值也改变;

10. 流安全使用

java8 try-with-resources自动关闭;

11. lambda表达式、Stream流式编程

Function 匿名函数,flatMap reduce groupingBy

12. 浏览器一个url访问的过程?

13. http常见状态码

404 200 502

14. 主键、外键

15. contentType是什么意思,有哪几种?

文件返回格式,application/json、protobuf、ostream

16. 容器 docker常用命令

17. linux常用命令,举例说明,vim怎么编辑

mv cp tree grep awk ls tail head
vim操作文件命令:vi Insert : wq等

文章来源:https://blog.csdn.net/qq_40985985/article/details/135255817
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。