Java 面试题集锦记录
Java 面试题集锦记录
- 一
- 1. SpringBoot、SpringCloud区别
- 2. SpringCloud怎么保证服务间通信?
- 3. Spring怎么保持高可用性、稳定性?
- 4. 负载均衡
- 5. [Rabbitmq](https://blog.csdn.net/qq_40985985/article/details/128013229) 怎么避免重复消费,[消费模式](https://blog.csdn.net/qq_54796785/article/details/133580623)
- 6. [Spring用到了哪几种设计模式,Java设计模式](https://zhuanlan.zhihu.com/p/545864894)
- JVM
- Java垃圾回收机制
- ES篇
- Redis篇
- redis缓存穿透、雪崩、击穿
- 二
- 三
- 四
- 五
- 1. 对象3特性
- 2. 抽象类和接口的差别
- 3. 内部类和静态内部类的差别
- 4. [TCP/IP七层网络模型](https://blog.csdn.net/m0_74722801/article/details/132058553)
- 5. 进程/线程
- 6. 数据表操作增删查改的关键字
- 7. 正则表达式匹配数字
- 8. 重载、重写
- 9. 浅拷贝、深拷贝
- 10. 流安全使用
- 11. [lambda表达式、Stream流式编程](https://blog.csdn.net/justloveyou_/article/details/79562574)
- 12. 浏览器一个url访问的过程?
- 13. http常见状态码
- 14. 主键、外键
- 15. contentType是什么意思,有哪几种?
- 16. 容器 docker常用命令
- 17. linux常用命令,举例说明,vim怎么编辑
一
1. SpringBoot、SpringCloud区别
- 作用不同;前者的作用是为了提供一个默认配置,从而简化配置过程;后者的作用是为了给微服务提供一个综合管理框架。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 问答
面试官逻辑思维能力很好,很谦逊。面试过程比较愉快,或者技术,或者提问的问题,都比较亲和。当然也问了我技术问题等,不是很深入的,一些我也没能回答上来。
事务、隔离级别、锁
- 事务
ACID
隔离级别
脏读(A读到了B未提交的)、幻读(读取已提交内容,范围读取,在同一个事务内相同的条件(age > 10)多次读取到的数据量不一致。)、不可重复读(同一个事务内,相同的条件(age = 10)多次读取的数据结果不一致。)
- Read Uncommitted(读取未提交内容):出现脏读,也就是可能读取到其他会话中未提交事务修改的数据。
- Read Committed(读取已提交内容):不可重复读,只能读取到已经提交的数据。Oracle 等数据库默认的隔离级别。
- Repeatable Read(可重复读):出现幻读。在同一个事务内的查询都和事务开始时刻一致。InnoDB默认级别。
- 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等
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!