自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(232)
  • 收藏
  • 关注

原创 JVM有哪些垃圾回收器,实际如何选择?

JVM有哪些垃圾回收器,实际如何选择?

2022-06-21 20:11:47 1453

原创 傻眼!25分类227页1000+题50w+字的绝版“java高分面试指南”现世!

一次偶然,从朋友那里得到一份“java高分面试指南”,里面涵盖了25个分类的面试题以及详细的解析:JavaOOP、Java集合/泛型、Java中的IO与NIO、Java反射、Java序列化、Java注解、多线程&并发、JVM、Mysql、Redis、Memcached、MongoDB、Spring、Spring Boot、Spring Cloud、RabbitMQ、Dubbo 、MyBatis 、ZooKeeper 、数据结构、算法、Elasticsearch 、Kafka 、微服务、Linux。这

2021-07-06 16:06:43 532 1

原创 面试突击MySQL:高并发情况下,数据库该如何设计?

面试突击MySQL题目:高并发情况下,数据库该如何设计?Java高级面试题:为什么要分库分表( 设计高并发系统的时候 , 数据库层面该如何设计 ) ? 用过哪些分库分表中间件 ? 不同的分库分表中间件都有什么优点和缺点? 你们具体是如何对数据库 如何进行垂直拆分或水平拆分的?题目来源:Java高级架构面试知识点整理--MySQL分库分表问题(附解析,如下图)image.pngJava高级架构面试知识点整理:包含消息队列、Redis缓存、MySQL分库分表、读写分离、设计高并发系

2021-06-15 15:14:36 3982 20

原创 双非二本搬砖 4 年,5 面 Alibaba 艰苦经历(Java 岗定薪 45K), 回馈一波心得体会!

5月准备跳槽,先后面试了各大小公司,拿了一些offer,有阿里,滴滴,快手,达达,得物等公司。面试的公司大部分都能过,所以这里给大家分享下自己的经验,也给自己做个归档,希望能给正在准备跳槽,找工作的朋友一点帮助,这里主要分享下阿里面试的经历!阿里一面 自我介绍,聊项目, 这边挺常规的,从项目入手。 解析Excel为什么用POI ? POI存在的问题? 还知道哪些解析Excel的工具吗? 你们项目中用过MQ,平时都用MQ来做什么? 你处理过MQ得幂等.

2021-06-11 14:41:16 441 3

原创 【Spring】如何控制bean的加载顺序?

其实在工作中,我相信很多人碰到过复杂的依赖关系的bean加载,把这种不确定性交给spring去做,还不如我们自己去控制,这样在阅读代码的时候 ,也能轻易看出bean之间的依赖先后顺序。

2025-06-09 21:42:59 304

原创 【RabbitMQ】RabbitMQ基础入门

RabbitMQ是基于Erlang语言开发的开源消息通信中间件,官网地址:接下来,我们就学习它的基本概念和基础用法。多个消费者绑定到一个队列,同一条消息只会被一个消费者处理通过设置prefetch来控制消费者预取的消息数量交换机的作用是什么?接收publisher发送的消息将消息按照规则路由到与之绑定的队列不能缓存消息,路由失败,消息丢失FanoutExchange的会将消息路由到每个绑定的队列描述下Direct交换机与Fanout交换机的差异?

2025-06-04 14:30:00 619

原创 【RabbitMQ】RabbitMQ高级使用

在支付场景中,支付成功后利用RabbitMQ通知交易服务,更新业务订单状态为已支付。但是大家思考一下,如果这里MQ通知失败,支付服务中支付流水显示支付成功,而交易服务中的订单状态却显示未支付,数据出现了不一致。此时前端发送请求查询支付状态时,肯定是查询交易服务状态,会发现业务订单未支付,而用户自己知道已经支付成功,这就导致用户体验不一致。因此,这里必须尽可能确保MQ消息的可靠性,即:消息应该至少被消费者处理1次该如何确保MQ消息的可靠性?如果真的发送失败,有没有其它的兜底方案?

2025-06-04 14:30:00 754

原创 JDBC 底层原理

JDBC(Java DataBase Connectivity)是Java和数据库之间的一个桥梁,是一个「规范」而不是一个实现,能够执行SQL语句。JDBC由一组用Java语言编写的类和接口组成。各种不同类型的数据库都有相应的实现,注意:本文中的代码都是针对MySQL数据库实现的。先看一个案例:javaSystem.out.println("name: " + rs.getString("name") + " :年龄" + rs.getInt("age"));

2025-06-04 14:00:00 868

原创 【Spring】如何控制bean的加载顺序?

springboot遵从约定大于配置的原则,极大程度的解决了配置繁琐的问题。在此基础上,又提供了spi机制,用可以完成一个小组件的自动装配功能。在一般业务场景,可能是不需要关心一个bean是如何被注册进spring容器的,只需要把需要注册进容器的bean声明为@Component即可,因为spring会自动扫描到这个Bean完成初始化并加载到spring上下文容器。但是,如果加载Bean的过程中部分Bean和Bean之间存在依赖关系,也就是说Bean A的加载需要等待Bean B加载完成之后才能进行;

2025-06-04 13:30:00 904

原创 【Spring】Spring事务管理深度解析-从实践到原理!

事务管理在系统开发中是不可缺少的一部分,Spring提供了很好事务管理机制。

2025-06-04 12:30:00 923

原创 【Spring】AOP中动态代理详解!

代理模式(Proxy pattern): 为另一个对象提供一个替身或占位符以控制对这个对象的访问【下载】Java面试、学习文档、进阶路线、算法、架构资源动态代理就是,在程序运行期,创建目标对象的代理对象,并对目标对象中的方法进行功能性增强的一种技术。在生成代理对象的过程中,目标对象不变,代理对象中的方法是目标对象方法的增强方法。可以理解为运行期间,对象中方法的动态拦截,在拦截方法的前后执行功能操作。

2025-06-03 14:01:41 599

原创 【Spring】从底层源码深入分析Bean的实例化

每次客户端请求 prototype 作用域的 Bean 时,Spring 容器都会创建一个新的实例,并且不会管那些被配置成 prototype 作用域的 Bean 的生命周期。而对于 prototype 作用域的 Bean,Spring 只负责创建,当容器创建了 Bean 的实例后,Bean 的实例就交给客户端代码管理,Spring 容器。初始化前:BeanPostProcessor,也就是拿出所有的后置处理器对bean进行处理,当有一个处理器返回null,将不再调用后面的处理器处理。

2025-06-03 13:58:54 680

原创 【Spring】Spring中的循环依赖是怎么个事?

首先,有两种Bean注入的方式:构造器注入和属性注入。

2025-06-03 13:56:01 782

原创 【Spring】从底层源码深入分析Spring的IoC容器初始化过程 !

AbstractBeanDefinitionReader的loadBeanDefinitions方法源码如下:java@Override// 模式匹配类型的解析器,这种方式是加载多个满足匹配条件的资源try {// 获取到要加载的资源// 委派调用其子类XmlBeanDefinitionReader的方法,实现加载功能= null) {else {// 只能通过绝对路径URL加载单个资源.= null) {

2025-06-03 13:54:25 602

原创 【Spring】Spring框架IoC核心详解!

IoC(Inversion of Control:控制反转) 是一种设计思想,而不是一个具体的技术实现。IoC 的思想就是将原本在程序中手动创建对象的控制权,交由 Spring 框架来管理,由Spring容器管理bean的整个生命周期。通俗来说就是IoC是设计思想,DI是实现方式。通过反射实现对其他对象的控制,包括初始化、创建、销毁等,解放手动创建对象的过程,同时降低类之间的耦合度。在 Spring 中,是 Spring 用来实现 IoC 的载体,

2025-06-02 21:51:30 875

原创 【Spring】Spring AOP基础、快速入门!

AOP,面向切面编程,作为面向对象的一种补充,将公共逻辑(事务管理、日志、缓存、权限控制、限流等)封装成切面,跟业务代码进行分离,可以减少系统的重复代码和降低模块之间的耦合度。切面就是那些与业务无关,但所有业务模块都会调用的公共逻辑。先看一个例子:如何给如下UserServiceImpl中所有方法添加进入方法的日志,java@Override@Override将记录日志功能解耦为日志切面,它的目标是解耦。进而引出AOP的理念:就是将分散在各个业务逻辑代码中相同的代码通过横向切割。

2025-06-02 21:50:13 678

原创 【Spring】全网最详细的Spring入门教程!

Spring 是一款开源的轻量级 Java 开发框架,旨在提高开发人员的开发效率以及系统的可维护性。Spring的一个最大的目的就是使JAVA EE开发更加容易。同时,Spring之所以与Struts、Hibernate等单层框架不同,是因为Spring致力于提供一个以统一的、高效的方式构造整个应用,并且可以将单层框架以最佳的组合揉和在一起建立一个连贯的体系。可以说Spring是一个提供了更完善开发环境的一个框架,可以为POJO(Plain Ordinary Java Object)对象提供企业级的服务。

2025-06-02 21:48:15 784

原创 《SpringBoot》EasyExcel实现百万数据的导入导出

在日常的开发工作中,Excel 文件的读取和写入是非常常见的需求,特别是在后台管理系统中更为频繁,基于传统的方式操作excel通常比较繁琐,EasyExcel 库的出现为我们带来了更简单、更高效的解决方案。本文将介绍 EasyExcel 库的基本用法和一些常见应用场景,帮助开发者更好地利用 EasyExcel 提高工作效率。Easy Excel 官网 (alibaba.com)

2025-05-30 16:47:11 890

原创 《SpringBoot》史上最全SpringBoot相关注解介绍

DeleteMapping("/users/{userId}")等价于@RequestMapping(value="/users/{userId}",method=RequestMethod.DELETE)@ComponentScan:扫描被@Component (@Repository,@Service,@Controller)注解的 bean,注解默认会扫描该类所在的包下所有的类。@GetMapping 是@RequestMapping 的GET请求方法的特例。

2025-05-30 16:44:02 960

原创 《SpringBoot》自动装配原理(简单易懂)

可以知道SpringBoot在启动的时候从类路径下的META-INF/spring.factories中获取EnableAutoConfiguration指定的值,将这些值作为自动配置类导入到容器中,自动配置类就生效,帮我们进行自动配置工作。以前需要自己配置的东西,自动配置类都帮我们完成了。可以看到这个注解除了元注解以外,就只有一个@Configuration,那也就是说这个注解相当于@Configuration,所以这两个注解作用是一样的,也就是能够去注册一些额外的Bean,并且导入一些额外的配置。

2025-05-30 16:36:30 830

原创 【SpringBoot】SpringBoot的两种启动方式原理!

使用java -jar默认情况下,不会启动任何嵌入式Application Server,该命令只是启动一个执行jar main的JVM进程,当spring-boot-starter-web包含嵌入式tomcat服务器依赖项时,执行java -jar则会启动Application Server。到这里总算是看到了tomcat的踪迹。//Engine是最高级别容器,Host是Engine的子容器,Context是Host的子容器,Wrapper是Context的子容器。通用的Servlet容器配置都以。

2025-05-30 16:35:12 829

原创 深入剖析HashMap:理解Hash、底层实现与扩容机制!

Key的存储方式是基于哈希表的HashMap是 Map 接口 使用频率最高的实现类。允许使用null键和null值,与HashSet一样,不保证映射的顺序。所有的key构成的集合是无序的、唯一不可重复的。所以,key所在的类要重写:equals()和hashCode()所有的value构成的集合是Collection:无序的、可以重复的。所以,value所在的类要重写:equals()一个key-value构成一个entry所有的entry构成的集合是Set:无序的、不可重复的。

2025-05-29 13:45:00 639

原创 Netty高级使用与源码详解

魔数:约定好的,用来在第一时间判定是否是无效数据包。版本号:可以支持协议的升级序列化算法:消息正文到底采用哪种序列化反序列化方式,可以由此扩展,例如:json、protobuf、hessian、jdk指令类型:是登录、注册、单聊、群聊... 跟业务相关请求序号:为了双工通信,提供异步能力正文长度消息正文。

2025-05-29 13:30:00 972

原创 Netty实战入门教程

Netty 是一个异步的、基于事件驱动的网络应用框架,用于快速开发可维护、高性能的网络服务器和客户端Netty 在 Java 网络应用框架中的地位就好比:Spring 框架在 JavaEE 开发中的地位以下的框架都使用了 Netty,因为它们有网络通信需求!Cassandra - nosql 数据库Spark - 大数据分布式计算框架Hadoop - 大数据分布式存储框架RocketMQ - ali 开源的消息队列ElasticSearch - 搜索引擎gRPC - rpc 框架。

2025-05-29 13:15:00 1497

原创 Java面试:SpringBoot 工程启动以后,希望将数据库中已有的固定内容提前加载到 Redis 缓存中,应该如何处理?

这两个是Springboot中新增的扩展点,之所以将这两个扩展点放在一起,是因为它两个功能特性高度相似,不同的只是名字、扩展方法形参数类型、执行先后的一些小的不同。这两个接口触发时机为整个项目启动完毕后,自动执行。如果有多个,可以利用@Order来进行排序。CommandLineRunner和ApplicationRunner都有一个扩展方法run(),但是run()形参数类型不同;

2025-05-28 17:09:21 595

原创 面试官:JDK的SPI有什么缺陷?dubbo做了什么改进?

在com.alibaba.dubbo.rpc.Protocol extension = (com.alibaba.dubbo.rpc.Protocol)ExtensionLoader.getExtensionLoader(com.alibaba.dubbo.rpc.Protocol.class).getExtension(extName)这个代码中,当然这个是有在具体的暴露服务或者引用远程服务才被调用执行的。// 已经存在了该数据,现在又出现了,则抛出异常。// 如果获取的类包含了Adaptive注解。

2025-05-28 16:59:35 990

原创 面试官:如何统计不同电话号码的个数(位图法)?

有人说遍历,使用HashSet或者int数组来存储,这里先不谈算法效率的问题,这100亿数据如何在能否在内存中放下也是一个问题。如果用int类型来存储这100亿个电话号码,那么就需要 100亿 * 4字节 = 37GB ≈ 40GB。所以这些方法行不通的根本原因实际上是内存不够。

2025-05-28 16:56:24 940

原创 为什么不能用浮点型表示金额?

BigDecimal可以实现对浮点数的运算,不会造成精度丢失。通常情况下,大部分需要浮点数精确运算结果的业务场景(比如涉及到钱的场景)都是通过BigDecimal来做的。想要解决浮点数运算精度丢失这个问题,可以直接使用BigDecimal来定义浮点数的值,然后再进行浮点数的运算操作即可。java// 0。

2025-05-28 16:50:00 521

原创 记录一次线上问题排查:JDK序列化问题!

新加了个字段,然后发版,上线就发现了报错当时这个问题很简单,其实就是用的是 JDK序列化,当时这个类实现了 Serializable接口,但是没显示定义 serialVersionUID,这样一来序列化时会根据当前类的信息计算得到一个 serialVersionUID。

2025-05-28 16:45:35 956

原创 为什么重写equals一定也要重写hashCode方法?

"==" 是运算符如果比较的对象是基本数据类型,则比较的是其存储的值是否相等;如果比较的是引用数据类型,则比较的是所指向对象的地址值是否相等(是否是同一个对象)。int b = 10;//true//显然不是同一个对象,false。

2025-05-27 21:25:58 709

原创 Java面试官:了解泛型擦除吗?知道类型擦除会造成多态的冲突吗?如何解决?

泛型的代码只存在于编译阶段,在进入JVM之前,与泛型相关的信息会被擦除掉,称之为类型擦除。<T>

2025-05-27 21:16:17 1010

原创 Java面试官:讲讲深拷贝和浅拷贝?

在clone()后,克隆后的对象开始也是指向的原来引用地址值(刚克隆完检查a1.category == a2.category 为true),但是一旦String的值发生改变(String作为不可更改的类——immutable class,在新赋值的时候,会创建了一个新的对象)就改变了克隆后对象指向的地址,让它指向了一个新的String地址,不会影响原对象的指向和值,原来的String对象还是指向的它自己的的地址。当类中含有引用类型的属性时,新对象和旧对象的引⽤类型属性指向的是同⼀个对象,即为浅拷贝。

2025-05-27 21:11:05 741

原创 面试官:假设有一个 1G 大的 HashMap,此时用户请求过来刚好触发它的扩容,会怎样?

先看下HashMap的默认构造函数:java// 容纳键值对的最大值// 负载因子int size;Node[] table的初始化长度length为16,默认的loadFactor是0.7。为什么默认负载因子是 0.75?官方答案如下:上面的意思,简单来说是默认负载因子为 0.75,是因为它提供了空间和时间复杂度之间的良好平衡。负载因子太低会导致大量的空桶浪费空间,负载因子太高会导致大量的碰撞,降低性能。0.75 的负载因子在这两个因素之间取得了良好的平衡。

2025-05-27 21:07:47 790

原创 如果让你改造下 HashMap 的扩容实现,你会怎样优化?

假设有一个 1G 大的 HashMap,此时用户请求过来刚好触发它的扩容.那么当前用户请求会被阻塞,因为 HashMap的底层是基于数组+链表(红黑树)来实现的,一旦它发生扩容,就需要新增一个比之前大2倍的数组,然后将元素copy到新的数组上那么如何优化呢?

2025-05-27 21:04:38 924

原创 同事如此使用StringBuilder,我给他提了一个Bug

没有循环的字符串拼接,直接使用 + 就可以了,JVM 会帮我们进行优化。编号 0 处会加载定义的 “NO_” 字符串,编号 8 处开始进行循环的判断,符合条件(0-10)的部分便会执行后续的循环体中的内容。IDE 的提示 如果你使用的 IDE 安装了代码检查的插件,会很轻易的看到上面代码中的 “+=” 操作会有黄色的背景,这是插件在提示,此处使用有问题。字节码的反编译 对上面的代码,我们通过字节码反编译一下,看看 JVM 在此过程中是否帮我们进行了优化,是否涉及到整个 String 的复制。

2025-01-03 17:31:16 720

原创 这下够清楚了吧!详解Mybatis的Mapper映射文件!

我一直来都希望自己只输出观点,而不是输出字典,但其中有些知识点又是极其冗杂,知识输出真是个难搞的差事,如何既能把知识脉络梳理的完整,又能讲得浅显易懂,言简意赅,确实是后续文章分解输出的研究方向。

2025-01-03 17:30:03 972

原创 阿里大佬手写版Docker学习笔记,让我五体投地!

如果你还在问“为什么要学习docker”?那作为一名开发人员,实属不太合格了。掌握更多更流行的技术,是作为一名Java工程师,对自己最基础的要求。学习,是为了让你变成更好的自己!

2025-01-03 17:27:34 810

原创 Mybatis配置文件XML全貌详解,再不懂我也没招了

原本我计划把核心配置文件和映射器 mapper 文件放一块讲,但是发现内容太多太多了,基本核心配置文件就已经讲得有点拖堂了,虽然这几大顶级标签使用起来已经毫不费力。SQL 映射器配置文件,我们后续更新,这块基本是和我们日常打交道最高频的操作。

2025-01-03 17:22:44 951

原创 哦豁?Spring官方推荐Caffeine系列,有点搞头

再说一个劲爆的消息,很多人都听说过Google的GuavaCache,而没有听说过Caffeine,其实和Caffeine相比,GuavaCache简直就是个弟中弟,这不SpringFramework5.0(SpringBoot2.0)已经放弃了Google的GuavaCache,转而选择了Caffeine。所谓的同步加载数据指的是,在get不到数据时最终会调用build构造时提供的CacheLoader对象中的load函数,如果返回值则将其插入缓存中,并且返回,这是一种同步的操作,也支持批量查找。

2025-01-03 17:20:59 894

原创 一整个愣住,MySQL还能实现分布式锁?

那么什么是分布式锁呢,在说分布式锁之前我们看到单体应用锁的特点就是在一个jvm进行有效,但是无法跨越jvm以及进程。所以我们就可以下一个不那么官方的定义,分布式锁就是可以跨越多个jvm,跨越多个进程的锁,像这样的锁就是分布式锁。

2025-01-02 19:28:25 593

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除