![](https://img-blog.csdnimg.cn/20201014180756926.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
Java工程师面试
文章平均质量分 53
weixin_44416039
这个作者很懒,什么都没留下…
展开
-
Java如何像图片添加自定义水印
20231019193150520-bc.png是水印图片。利用imageio压缩转换图片并且直接添加水印。这样可以根据一个字符串的文字生成一个水印图片。利用Thumbnails添加水印。将webp图片转为png图片。原创 2024-05-31 09:35:07 · 350 阅读 · 0 评论 -
Java类的加载过程
类加载总体流程:Java类的加载过程分为以下三个步骤:将类的class文件读入到内存中,并为之创建一个java.lang.Class对象。在加载阶段,JVM使用双亲委派机制,首先尝试将类的加载请求委派给父类加载器,若父加载器无法加载,则交由自己的类加载器进行加载。Java虚拟机会对类进行验证(Verification),以确保它的字节码是正确、安全且符合规范的。这个阶段主要有四种验证方式:文件格式验证、元数据验证、字节码验证和符号引用验证。文件格式验证:第一阶段要验证字节流是否符合Class文件格式的规范,原创 2024-05-29 09:33:26 · 181 阅读 · 0 评论 -
MySQL分页查询越来越慢,如何优化?
拿 limit 10000, 10 这条语句来说明一下, MySQL在执行这条查询的时候,需要查询 10010 (10000 + 10) 条记录,然后只返回最后 10 条,并将前面的 10000 条记录抛弃,这样当翻页越靠后时,代价就变得越来越高。这是因为查询时 MySQL 并不是跳过 OFFSET 行,而是取 OFFSET+N 行,然后放弃前 OFFSET 行,最后返回 N 行,当 OFFSET 特别大的时候,效率就非常的低下。优化四:使用索引覆盖+连接查询优化。优化三:使用索引覆盖+子查询优化。原创 2024-05-29 09:30:39 · 159 阅读 · 0 评论 -
雪花算法生成的ID由哪些部分组成?
基于Twitter的Snowflake算法实现分布式高效有序ID生产黑科技(sequence)——升级版Snowflake。序列号,占用12位。一毫秒可以生成4095个ID。时间戳,占用41位,可以支持69年的时间跨度。机器ID,占用10位。原创 2024-05-28 09:43:26 · 215 阅读 · 0 评论 -
分布式微服务项目如何设计的?
我一般设计成两层:业务层和能力层(中台),业务层接受用户请求,然后通过调用能力层来完成业务逻辑。先做一个说明,从理论上来说,给缓存设置过期时间,是保证最终一致性的解决方案。这种方案下,我们可以对存入缓存的数据设置过期时间,所有的写操作以数据库为准,对缓存操作只是尽最大努力更新即可。也就是说如果数据库写成功,缓存更新失败,那么只要到达过期时间,则后面的读请求自然会从数据库中读取新值然后回填缓存。因此,接下来讨论的思路不依赖于给缓存设置过期时间这个方案。在这里,我们讨论更新策略:先更新缓存,再更新数据库。原创 2024-05-28 09:41:35 · 553 阅读 · 0 评论 -
redis 哨兵的工作原理
哨兵是Redis集群架构中用于高可用的组件,它通过监控Redis主节点的状态来实现故障转移,保证Redis集群的可用性。总的来说,哨兵的工作原理是通过检测主节点状态、选举领头哨兵、确认主节点宕机、选举新的主节点等操作,来实现Redis集群的高可用性。原创 2024-05-28 09:41:03 · 285 阅读 · 0 评论 -
Java 面试题集 二
借助异常机制,我们可以省略很多业务逻辑上的判断处理.直接借助 java 的异常机制可以简化业务逻辑判断代码的编写1 当你不想把你的错误直接暴露给前端或者你想让前端从业务角度判断后台的异常,这个时候自定义异常类是你的不二选择2 虽然 JAVA 给我们提供了丰富的异常类型,但是在实际的业务上,还有很多情况 JAVA 提供的异常类型不能准确的表述出我们业务上的含义3 控制项目的后续业务。原创 2024-05-28 09:40:20 · 758 阅读 · 0 评论 -
dubbo超时内部是怎么实现的?
在 Dubbo 中,如果提供者执行完毕后,调用方已经超时并产生了异常,那么提供者不会再向调用方写返回值。参数来控制调用超时时间,如果在规定时间内未收到服务提供方的响应,则会抛出超时异常。总之,Dubbo 的超时机制是通过设置超时时间和超时重试机制来保证调用的及时响应和可靠性,从而提高系统的稳定性和可用性。参数来控制服务端处理请求的超时时间,如果服务端处理时间超过规定时间,则会抛出超时异常。:表示请求超时时间,即客户端向服务端发起请求后,等待服务端处理请求的时间。在服务端,Dubbo 通过设置。原创 2024-05-28 09:39:49 · 140 阅读 · 0 评论 -
如何保证缓存和数据库双写时的数据一致性?
(2)写入数据时,先更新数据库中的数据,然后再从缓存中删除对应的数据。需要考虑缓存和数据库的容量,以及缓存和数据库的性能问题,以避免缓存和数据库的容量和性能瓶颈导致数据一致性问题。(1)读取数据时,先从缓存中读取数据,如果缓存中不存在,则从数据库中读取数据,并将数据加入到缓存中。(3)删除数据时,先从缓存中删除数据,然后再从数据库中删除数据。(1)写入数据时,先将数据写入到缓存中,然后再写入到数据库中。(2)更新数据时,先将数据更新到缓存中,然后再更新到数据库中。原创 2024-05-28 09:39:18 · 193 阅读 · 0 评论 -
Java面试题集锦 一
同时,当 Redis 清除过期 key 时,会阻塞其他的 Redis 操作,因为 Redis 是单线程模型的,所有的操作都是串行执行的。在使用二级缓存时,当对象A需要注入对象B,而对象B又需要注入对象A时,如果在第一次创建对象A时,对象A中包含了对对象B的引用,那么Spring容器会创建对象B并注入到对象A中。具体实现中,可以使用数组、链表等数据结构来维护滑动窗口,每次有请求到来时,更新滑动窗口的计数器和时间戳,然后遍历滑动窗口,统计窗口内的请求数量,判断是否超过阈值。原创 2024-05-28 09:38:47 · 678 阅读 · 0 评论 -
怎么表达滑动窗口限流?
滑动窗口限流是一种常见的限流算法,它将单位时间内的流量平均分布到若干个时间窗口中,然后通过统计每个时间窗口内的请求数量来判断当前流量是否超过阈值,从而进行限流。该方法会先将过期的请求移除,然后判断当前窗口的总请求数是否超过了限流阈值,如果超过了则返回。滑动窗口限流算法可以平滑地限制流量,适用于对响应速度要求较高的场景,如接口调用、API网关等。该示例实现了一个简单的滑动窗口限流器。,否则将当前请求的时间戳和令牌数记录在窗口中,并返回。表示当前窗口中最后一条请求的位置,表示当前窗口中请求的数量;原创 2024-05-28 09:38:10 · 213 阅读 · 0 评论 -
1000万的 db 数据分页怎么处理?
针对1000万的数据进行分页处理,一般的做法是采用数据库的 limit 和 offset 语句,将所有数据按照指定的排序字段进行排序,然后根据当前页码和每页显示的数量计算出 offset 和 limit 的值,从而得到当前页需要的数据。但是,对于这么大的数据集,这种做法可能会导致查询效率大大降低和性能问题。综合以上策略,可以在保证查询效率的同时,提高分页性能和查询性能。原创 2024-05-28 09:37:35 · 362 阅读 · 0 评论 -
redis中有一批 key 瞬间过期,为什么其它 key 的读写效率会降低?
Redis的内部实现是单线程的,当Redis执行某些操作时,如AOF、RDB持久化、复制等,Redis主线程会被阻塞,无法处理其他请求。同时,Redis会定期执行过期键的删除操作,当要删除的键较多时,也会占用主线程的处理时间。当一批key瞬间过期时,可能会导致Redis主线程集中处理删除操作,占用主线程的大量时间,导致其它键的读写效率降低。另外,当一个key过期时,如果这个key被频繁地访问,Redis会重新生成这个key,这会导致CPU缓存失效,从而影响其它键的读写效率。原创 2024-05-28 09:37:04 · 326 阅读 · 0 评论 -
线程池核心数20,最大600,阻塞队列 200,当qps200(注意是 qps )的时候,请求(请求是调第三方,是一个长时间的任务)阻塞超时,请问怎么提高它的吞吐量(不能加机器)?
如果增加阻塞队列的大小,可以让更多的请求进入阻塞队列等待处理,从而提高吞吐量。2. 优化阻塞队列:可以尝试使用更高效的阻塞队列,例如使用 Disruptor 队列来替换默认的阻塞队列。7. 使用分布式缓存:可以使用分布式缓存来缓存第三方接口的结果,从而减少对第三方接口的调用次数,提高吞吐量。4. 优化第三方接口:可以尝试优化第三方接口,例如缓存结果或使用更高效的算法,以便更快地处理请求。5. 优化代码:可以对代码进行优化,例如使用更高效的算法或减少不必要的计算,以提高吞吐量。原创 2024-05-28 09:36:34 · 299 阅读 · 0 评论 -
3PC提交协议是什么?
3PC的CanCommit阶段其实和2PC的准备阶段很像。协调者向参与者发送commit请求,参与者如果可以提交就返回Yes响应,否则返回No响应。协调者向参与者发送CanCommit请求。询问是否可以执行事务提交操作。然后开始等待参与者的响应。参与者接到CanCommit请求之后,正常情况下,如果其自身认为可以顺利执行事务,则返回Yes响应,并进入预备状态。否则反馈No。原创 2024-05-28 09:36:03 · 380 阅读 · 0 评论 -
对外提供的API如何保证幂等?
source+seq 在数据库里面做唯一索引,防止多次付款(并发时,只能处理一个请求)。重点:对外提供接口为了支持幂等调用,接口有两个字段必须传,一个是来源 source,一个是来源方序列号 seq,这个两个字段在提供方系统里面做联合唯一索引,这样当第三方调用时,先在本方系统里面查询一下,是否已经处理过,返回相应处理结果;没有处理过,进行相应处理,返回结果。注意,为了幂等友好,一定要先查询一下,是否处理过该笔业务,不查询直接插入业务系统,会报错,但实际已经处理。原创 2024-05-28 09:35:30 · 409 阅读 · 0 评论 -
ZooKeeper和Reids做分布式锁的区别?
Reids:ZooKeeper:总结:原创 2024-05-28 09:34:54 · 190 阅读 · 0 评论 -
TCC解决方案是什么?
C(Cancel):业务回滚阶段,这阶段和上面的C(Confirm)是互斥的,用于释放Try阶段预留的资源或者业务。T(Try):业务检查阶段,这阶段主要进行业务校验和检查或者资源预留;也可能是直接进行业务操作。C(Confirm):业务确认阶段,这阶段对Try阶段校验过的业务或者预留的资源进行确认。张三冻结字段加100.李四冻结字段加100。张三冻结字段减100.李四冻结字段减100,张三冻结字段减100.李四冻结字段减100.原创 2024-05-28 09:33:22 · 211 阅读 · 0 评论 -
Redis如何做分布式锁?
Step1: 服务A为了获得锁,向Redis发起如下命令: SET productId:lock 0xx9p03001 NX EX 30000 其中,"productId"由自己定义,可以是与本次业务有关的id,"0xx9p03001"是一串随机值,必须保证全局唯一,“NX"指的是当且仅当key(也就是案例中的"productId:lock”)在Redis中不存在时,返回执行成功,否则执行失败。Step4: 服务A执行完毕,为了释放锁,服务A会主动向Redis发起删除key的请求。原创 2024-05-27 09:44:00 · 428 阅读 · 0 评论 -
可靠消息最终一致性方案
可靠消息最终一致性方案是分布式系统中常用的一种保证数据最终一致性的解决方案,它通过异步消息传递的方式来实现数据的一致性。可靠消息最终一致性方案的优点是可以提高系统的可用性和容错性,缺点是需要增加系统的复杂度和维护成本,并且需要考虑消息的传递和消费的时效性问题。在这个过程中,如果发生了故障或者异常情况,消息队列和消费者会保证消息的可靠传递和消费,从而保证数据的最终一致性。原创 2024-05-27 09:43:26 · 348 阅读 · 0 评论 -
什么是补偿性事务?
2. Confifirm阶段主要是对业务系统做确认提交, Try阶段执行成功并开始执行Confifirm阶段时,默认 Confifirm阶段是不会出错的。可靠性:解决了 XA 协议的协调者单点故障问题,由主业务方发起并控制整个业务活动,业务活动管理器也变成多点,引入集群。TCC 其实就是采用的补偿机制,其核心思想是:针对每个操作,都要注册一个与其对应的确认和补偿(撤销)操作。3. Cancel阶段主要是在业务执行错误,需要回滚的状态下执行的业务取消,预留资源释放。原创 2024-05-27 09:42:50 · 369 阅读 · 0 评论 -
什么是两阶段提交?
b) 参与者使用阶段 1 中的 undo 信息执行回滚操作,并释放整个事务期间占用的资源。1. 性能问题:所有参与者在事务提交阶段处于同步阻塞状态,占用系统资源,容易导致性能瓶颈。在阶段 2 中,如果出现协调者和参与者都挂了的情况,有可能导致数据不一致。a)协调者向所有参与者发出正式提交事务的请求(即 commit 请求)。d) 协调者收到所有参与者反馈的 ack 消息后,即完成事务提交。d) 协调者收到所有参与者反馈的 ack 消息后,即完成事务。c) 各参与者向协调者反馈 ack(应答)完成的消息。原创 2024-05-27 09:42:15 · 307 阅读 · 0 评论 -
说说你对分布式事务的理解?
CAP原则又称CAP定理,指的是在一个分布式系统中,一致性(Consistency)、可用性(Availability)、分区容忍性(Partition tolerance)。BASE理论是对CAP中的一致性和可用性进行一个权衡的结果,理论的核心思想就是:我们无法做到强一致,但每个应用都可以根据自身的业务特点,采用适当的方式来使系统达到最终一致性。分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个东西,特别是在微服务架构中,几乎可以说是无法避免。原创 2024-05-27 09:41:39 · 248 阅读 · 0 评论 -
Spring Boot 需要独立的容器运行吗?
比如 Spring Web 中的 ContextLoaderlistener 和 Web MVC 中的 Dispatcherservlet,他们创建 spring 应用上下文的方式均属于被动回调,spring 并无完整的应用主导权,而 springboot 使启动容器变为应用一部分,由 SpringApplication 引导启动。可以不需要,内置了 Tomcat / Jetty 等容器。这里的独立的 spring 应用是指两方面。原创 2024-05-27 09:40:48 · 297 阅读 · 0 评论 -
分布式幂等性如何设计?
在高并发场景的架构里,幂等性是必须得保证的。比如说支付功能,用户发起支付,如果后台没有做幂等校验,刚好用户手抖多点了几下,于是后台就可能多次受到同一个订单请求,不做幂等很容易就让用户重复支付了,这样用户是肯定不能忍的。原创 2024-05-27 09:40:11 · 516 阅读 · 0 评论 -
MyBatis中如何实现缓存的扩展
2.考察你对MyBatis缓存的扩展。1.考察你的MyBatis中缓存架构的理解。mybatis 内存采用装饰器模式。原创 2024-05-27 14:00:00 · 349 阅读 · 0 评论 -
介绍下MyBatis中的工作原理
SqlSession: new DefaultSqlSession,创建相关的事务工厂,完成Executor的创建,已经二级缓存。首先,MyBatis从XML映射文件中读取SQL语句,将其解析成SQL语句对象,并将SQL语句对象存储在内存中。然后,MyBatis将SQL语句对象与用户提供的参数绑定,生成完整的SQL语句。接着,MyBatis将SQL语句发送给数据库,并将查询结果映射到Java对象。CachingExecutor的装饰,同时完成了插件逻辑的植入。处理SQL请求的流程。原创 2024-05-27 09:38:51 · 233 阅读 · 0 评论 -
Java中sleep和wait方法的区别?
方法是线程类的静态方法,它可以让当前线程进入睡眠状态,让出CPU的执行时间,从而让其他线程有机会运行。方法的作用是让当前线程暂停一段时间,以便于其他线程有机会执行,但是当前线程持有的锁并不会释放。方法会释放当前线程所持有的对象锁,并让当前线程进入等待状态,直到其他线程调用该对象的。方法的作用和使用方式是不同的,需要根据具体的场景来选择使用哪一个方法。类的方法,它用于线程之间的协作,可以让线程等待某个条件的满足。方法都是用于线程间的协作,但是它们的作用和使用方式是不同的。方法时,需要将其放置在一个。原创 2024-05-27 09:38:17 · 806 阅读 · 0 评论 -
JVM加载问题,该如何聊?
①验证(Verify):目的在于确保Class文件的字节流中包含信息符合当前虚拟机要求,保证被加载类的正确性,不会危害虚拟机自身安全,主要包括四种验证,文件格式验证,元数据验证,字节码验证,符号引用验证②准备(Prepare):为类变量分配内存并且设置该类变量的默认初始值,即零值③解析:将常量池内的符号引用转换为直接引用的过程。原创 2024-05-27 09:37:46 · 432 阅读 · 0 评论 -
Java中常用的Map有哪些?
除了以上常用的Map实现类,Java8中还引入了新的类型:ConcurrentSkipListMap,它是一个并发的有序map,基于跳表(skip list)实现,支持高并发,也支持排序。原创 2024-05-27 09:37:10 · 586 阅读 · 0 评论 -
ArrayList和LinkedList有什么区别?
4) LinkedList 需要更多的内存,因为 ArrayList 的每个索引的位置是实际的数据,而 LinkedList 中的每个节点中存储的是实际的数据和前后节点的位置(一个 LinkedList 实例存储了两个值: Node\ first 和 Node\ last 分别。与此对应,LinkedList是以元素列表的形式存储它的数据,每一个元素都和它的前一个和后一个元素链接在一起,在这种情况。Array 获取数据的时间复杂度是 O(1),但是要删除数据却是开销很大的,因为这需要重排数组中的所有数据。原创 2024-05-27 09:36:23 · 389 阅读 · 0 评论 -
spring的事务传播机制是什么?
REQUIRED情况下,调用方存在事务时,则被调用方和调用方使用同一个事务,那么被调用方出现异常时,由于共用一个事务,所以无论是否catch异常,事务都会回滚,而在NESTED情况下,被调用方发生异常时,调用方可以catch其异常,这样只有子事务回滚,父事务不会回滚。原创 2024-05-27 09:35:46 · 401 阅读 · 0 评论 -
说一下使用spring的优势?
2、Spring框架之外还存在一个构建在核心框架之上的庞大生态圈,它将Spring扩展到不同的领域,如Web服务、REST、移动开发以及NoSQL。8、 Spring的高度开放性,并不强制应用完全依赖于Spring,开发者可自由选用Spring框架的部分或全部。6、Spring的AOP支持允许将一些通用任务如安全、事务、日志等进行集中式处理,从而提供了更好的复用。5、Spring的loC容器降低了业务对象替换的复杂性,提高了组件之间的解耦。3、低侵入式设计,代码的污染极低。原创 2024-05-27 09:35:08 · 235 阅读 · 0 评论 -
spring bean循环依赖怎么解决
当A、B两个类发生循环引用时,在A完成实例化后,就使用实例化后的对象去创建一个对象工厂,并添加到三级缓存中,如果A被AOP代理,那么通过这个工厂获取到的就是A代理后的对象,如果A没有被AOP代理,那么这个工厂获取到的就是A实例化的对象。当A进行属性注入时,会去创建B,同时B又依赖了A,所以创建B的同时又会去调用getBean(a)来获取需要的依赖,此时的getBean(a)会从缓存中获取,第一步,先获取到三级缓存中的工厂;当B创建完后,会将B再注入到A中,此时A再完成它的整个生命周期。至此,循环依赖结束!原创 2024-05-25 17:12:59 · 381 阅读 · 0 评论 -
事务注解的本质是什么?
具体来说,当在方法上添加了事务注解时,Spring框架会通过AOP在方法执行前后插入一些额外的处理逻辑,例如开启事务、提交事务或回滚事务等。这些处理逻辑是由Spring框架内置的事务管理器实现的,可以根据不同的事务注解来决定执行哪些逻辑。事务注解是一种方便的声明式事务管理方式,可以通过在方法上添加注解来控制方法执行过程中的事务处理,例如在方法执行前开启事务,在方法执行完成后提交或回滚事务等。总之,事务注解的本质是基于AOP的实现方式,在方法执行前后通过动态代理实现对事务的控制,从而实现声明式事务管理。原创 2024-05-25 17:12:27 · 417 阅读 · 0 评论 -
BeanFactory和ApplicationContext的区别?
应用程序上下文从程序环境变量中ApplicationContextcontext=newClassPathXmlApplicationContext(“bean.xml”);从表面上看,applicationcontext如同beanfactory一样具有bean定义、bean关联关系的设置,根据请求分发bean的功能。3.已在监听器中注册的bean的事件。原创 2024-05-25 17:11:52 · 220 阅读 · 0 评论 -
你对BeanPostProcessor的理解?
需要注意的是,如果 BeanPostProcessor 的实现类本身依赖于 Spring 容器中的其他 Bean,那么需要保证其他 Bean 的依赖注入和初始化已经完成,否则会出现 NullPointer 等异常。BeanDefinition--> 注册BeanDefinition -->BeanFactory --> BeanFactory的后置处理 --> 单例bean -->AOP --》代理对象--> advice pointcut join point。SpringloC 核心流程。原创 2024-05-25 17:11:17 · 296 阅读 · 0 评论 -
依赖关系、关联关系、聚合关系、组合关系
关系是类与类之间的联接。依赖关系表示一个类依赖于另一个类的定义。例如,一个人(Person)可以买车(car)和房子(House),Person类依赖于Car类和House类的定义,因为Person类引用了Car和House。与关联不同的是,Person类里并没有Car和House类型的属性,Car和House的实例是以参量的方式传入到buy()方法中去的。一般而言,依赖关系在Java语言中体现为局域变量、方法的形参,或者对静态方法的调用。关系是类与类之间的联接,它使一个类知道另一个类的属性和方法。原创 2024-05-25 17:10:47 · 340 阅读 · 0 评论 -
开发中需要遵守的设计原则?
它要求一个对象应该对其他对象有最少的了解,即一个类应该对自己需要耦合或调用的类知道得最少,被耦合或调用的类也应该尽量降低对外部类的依赖。通过将Animal接口拆分为多个更小的接口,即接口隔离原则,可以避免Bird类实现与其无关的Swimmable接口,而Fish类也不需要实现与其无关的Flyable接口,从而实现了代码的高内聚低耦合。比如 我们设计一个类里面既包含了用户的一些操作,又包含了支付的一些操作,那这个类的职责就不够单一,应该将该类进行拆分,拆分成多个功能更加单一的,粒度更细的类.原创 2024-05-25 17:10:14 · 318 阅读 · 0 评论 -
什么是设计模式?
编写软件过程中,程序员面临着来自耦合性内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑 战 设 计模式是为了让 程序 软件 具有更好1 代码重用性2 可读性(编程规范性,便于他人阅读理解)3 可扩展性(当需要增加新的功能时,非常方便)4 可靠性(当我们增加新的功能后,对原来功能无影响)5 使程序呈现高内聚,低耦合的特性。原创 2024-05-24 15:00:00 · 306 阅读 · 0 评论