自定义博客皮肤VIP专享

*博客头图:

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

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

博客底图:

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

栏目图:

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

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

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

原创 函数式接口 FunctionalInterface

函数式接口是在 Java 8 中引入的概念,用于支持 Lambda 表达式和方法引用。在 Java 中,函数式接口本质就是一个锚点,无论是Lambda 还是 方法引用 都要挂载到这个锚点上才有意义。由于函数式接口可以用 Lambda 表达式或方法引用实现,开发者不需要编写大量的匿名类实现,从而减少样板代码,简化开发。Lambda 表达式往往是一次性使用的,很难像普通方法那样进行复用。在需要复杂或可复用的逻辑时,可能还是需要编写常规方法或类。

2024-08-25 15:04:08 351

原创 聊一聊 Spring StateMachine 的基本概念和实践

状态机中基本的元素是状态和事件,整个业务逻辑的组织变更流转基本是围绕状态和事件展开。States 状态枚举类java代码解读复制代码。

2024-08-25 15:03:16 403

原创 SpringBoot如何加载外部Jar来实现插件功能

这种方式需要程序启动的某个节点,调用自定义类加载器去加载指定目录下的jar包,时间点不是很好控制。但这个定制化程度比较高。arduino代码解读复制代码//可以在这里调用自定义类加载 SpringApplication.run(SpringBootDemo.class, args);

2024-08-25 15:02:43 548

原创 (四)并发编程实战:多线程+EasyExcel,20ms内极速导入百万级大数据报表!

看到这里,百万级报表导入篇也走进了尾声,其实这篇里的许多内容都在沿用上篇的概念,毕竟两个场景十分类似,只不过代码细节实现有所不同。但不管是大报表导出,还是大报表导入,我们都未曾打破官方给出的”不允许多条线程对单个文件进行并发读写“这条建议,而是深入分析问题场景,真正定位到了耗时项在做优化。毕竟对于真实的业务场景来说,读写一个百万级的excel文件,硬件到位的前提下,EasyExcel框架只需花费几十秒左右,这个性能完全够了。

2024-08-25 15:02:06 558

原创 Java面试题及答案整理汇总(2024最新版)

在程序运行状态时,都能够知道任何一个类的所有属性和方法,对于任意一个对象,都能调用它的任意一个方法和属性,这种动态获取对象类或对象信息,并动态调用对象的方法被称为反射。守护线程是为了服务用户线程的存在,比如jvm虚拟机会等待用户线程执行完成后关闭,但是不会等待GC线程执行完再关闭。线程局部变量是局限于线程内部的变量,属于线程自身所有,不在多个线程间共享,是一种实现线程安全的方式乐观锁:认为不是每一次操作都需要上锁,但是在执行操作之前会判断是否会对数据执行修改,一般会使用版本号机制或者CAS机制实现。

2024-08-25 14:59:14 629

原创 三分钟解决 Java 进程 cpu 100% 问题

要说简单也简单,如果你的思路是对的,整个处理过程不超过 3 分钟。但如果你的思路有问题,找到问题的时间就可能会无限长。

2024-08-23 15:02:59 286

原创 Oracle开始严查Java许可!

1995年5月,Oak语言才更名为Java(印度尼西亚爪哇岛的英文名称,因盛产咖啡而闻名),并于当时的SunWorld大会上发布了JAVA 1.0,而且那句“Write Once,Run Anywhere”的slogan也是那时候推出的。比如像阿里的Dragonwell,腾讯的Kona,AWS的Amazon Corretto,以及Azul提供的Zulu JDK等等,都是这类典型的代表。众所周知,Oracle接手Java之后,就迅速开始了商业化之路的实践,也于后续推出了一系列调整和改革的操作。

2024-08-23 15:02:09 412

原创 开发易忽视的问题:AtomicInteger是如何保证线程安全

通过Unsafe类提供的原子性操作实现了线程安全的整数操作。它使用volatile保证内存可见性,通过 CAS 操作(如)实现无锁的线程安全。这使得在高并发环境下比传统的同步机制更高效。

2024-08-23 14:59:43 868

原创 创建Java对象,不是只有调用构造器这一种方式

总之,使用静态工厂方法创建对象有很多好处,它相对于构造器,更利于阅读和代码的扩展,并且有很高的灵活性,但是相对的,这种创建对象的方式也有它的一些缺点。只是在日常业务代码开发过程中,很多人的第一反应就是使用构造器创建对象,其实我们更应该结合具体的场景选择更适合的方式。

2024-08-23 14:59:02 385

原创 2024最新JAVA面试题集

Synchronized的并发策略是悲观的,不管是否产生竞争,任何数据的操作都必须加锁。乐观锁的核心是CAS,CAS包括内存值、预期值、新值,只有当内存值等于预期值时,才会将内存值修改为新值。(1)锁消除所消除就是虚拟机根据一个对象是否真正存在同步情况,若不存在同步情况,则对该对象的访问无需经过加锁解锁的操作。比如StringBuffer的append方法,因为append方法需要判断对象是否被占用,而如果代码不存在锁竞争,那么这部分的性能消耗是无意义的。

2024-08-23 14:57:56 779

原创 如何做好 API 接口设计?

在 API 设计中,很多人会经常犯一个错误,那就是:想方设法地创建自己的 error code,用以表达自己对不同错误的个性化理解。但实际上,在 API 设计中,这是一种错误应用惯例原则的实践。比如,当使用方在使用 HTTP API 时,获得了一个 404 错误码(在 HTTP 中是未找到资源的错误),而你恰好也定义了 404 错误码(假设代表接口数据未找到),结果必然出现冲突。

2024-08-22 14:21:39 675

原创 只问你这5个问题,就知道你K8s是什么水平?

Docker作为非常流行的容器技术,之前经常有文章说它被K8S弃用了,取而代之的是另一种容器技术containerd!其实containerd只是从Docker中分离出来的底层容器运行时,使用起来和Docker并没有啥区别,从Docker转型containerd非常简单,基本没有什么门槛。只要把之前Docker命令中的docker改为crictl基本就可以了,都是同一个公司出品的东西,用法都一样。所以不管K8S到底弃用不弃用Docker,对我们开发者使用来说,基本没啥影响!

2024-08-22 14:20:51 621

原创 什么是 Heap dump?Java 如何生成 Heap dump?

本文,我们分析了什么是 Heap dump,Heap dump包含的信息以及 5种生成 Heap dump的方式,每种方式都有其适用场景和限制,选择合适的方法可以更有效地进行内存分析和故障排查。

2024-08-22 14:19:31 916

原创 深入理解Base64的用法和原理

Base64 编码使用 64 个可打印的 ASCII 字符来表示数据。这些字符包括大写字母A-Z(26 个)、小写字母a-z(26 个,但在标准 Base64 中通常使用大写)、数字0-9(10 个)、加号和斜杠。此外,为了支持 URL 和文件名,还有一个变种使用代替和代替。与编码表一样,解码表依赖于 Base64 字符集,包括大写字母A-Z、小写字母a-z(在标准 Base64 中通常不使用)、数字0-9、加号和斜杠。对于 URL 安全的 Base64,使用代替和代替。Java 的Base64。

2024-08-22 14:18:59 598

原创 Java面试题大全(临时抱佛脚)

序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

2024-08-22 14:17:24 717

原创 Java从List中删除元素的几种方式

在Java中,List接口提供了一个方法来移除列表中与给定对象相等的第一个元素。然而,直接使用这个方法来删除列表中的元素有时并不是最优的选择,主要原因包括效率和同步性问题。

2024-08-21 15:52:55 557

原创 一个BUG搞懂ThreadLocal、InheritableThreadLocal、TransmittableThreadLocal

其实ThreadLocal并不是什么很高明的设计,它只是对Thread对象中一个Map成员变量的封装,说白了你完全可以在Thread对象中定义一个Map,然后通过Thread.currentThread().getMap()来获取这个Map,然后直接通过map.put()保存当前线程的数据,也能达到ThreadLocal一样的效果,而且使用起来更简单方便。ThreadLocal中的变量作用域为当前线程,解决了多线程并发问题ThreadLocal中的变量使用后要及时清理。

2024-08-21 15:52:21 686

原创 美团面试题:new Integer(“127“)和Integer.valueOf(“128“)有什么

这个范围恰好对应一个字节(byte)可以表示的整数范围。大多数日常计算和循环中使用的小整数都在这个范围内。缓存范围不能太大,否则会占用过多内存。

2024-08-21 15:51:46 677

原创 一文讲明白@Resource和@Autowired区别

在Spring框架中,依赖注入(Dependency Injection,DI)是核心功能之一,通过它可以轻松管理对象的生命周期及其依赖关系。在实际开发中,@Resource和@Autowired是常见的依赖注入注解,但它们的功能、使用场景以及推荐使用的方式存在一定的差异。本文将详细解释这两者的区别,并探讨为何近年来@Autowired不再被推荐使用。

2024-08-21 15:51:10 700

原创 白嫖最全Java面试题合集(2024/8-21持续更新)

死锁是指两个或两个以上的进程在执行过程中,由于竞争资源或者由于彼此通信而造成的一种阻塞的现象,若无外力作用,它们都将无法推进下去。

2024-08-21 15:50:11 871

原创 深入理解Base64的用法和原理

Base64 编码使用 64 个可打印的 ASCII 字符来表示数据。这些字符包括大写字母A-Z(26 个)、小写字母a-z(26 个,但在标准 Base64 中通常使用大写)、数字0-9(10 个)、加号和斜杠。此外,为了支持 URL 和文件名,还有一个变种使用代替和代替。与编码表一样,解码表依赖于 Base64 字符集,包括大写字母A-Z、小写字母a-z(在标准 Base64 中通常不使用)、数字0-9、加号和斜杠。对于 URL 安全的 Base64,使用代替和代替。Java 的Base64。

2024-08-20 14:51:42 551

原创 解决SpringMVC在多线程下请求头获取失败的问题

在日常的SpringMVC开发中,我们通常会在请求头中自定义一些参数信息,之后借助SpringMVC提供的来完成当前请求的获取,此时代码逻辑大致如下:java代码解读复制代码} } catch (Exception e) { // 记录异常,但不向外抛出,以避免可能的业务逻辑中断 log.error("获取HttpServletRequest时发生异常:", e);} // 返回获取到的请求对象,如果失败则返回null return httpServletRequest;

2024-08-20 14:51:08 688

原创 设计模式之旅:实时更新的观察者模式

当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的,我们就可以使用观察者模式。当然我们具体使用的时候,肯定不是像上面那么简单,在使用的时候我们可以参考的实现思路。

2024-08-20 14:46:26 284

原创 【重写SpringFramework】配置类概述(chapter 3-5)

在早期的 Spring 项目中,使用 XML 文件进行配置。如下所示,在配置文件中,使用bean标签注册组件,使用标签批量扫描组件,使用import标签引入其他的 XML 文件,使用标签加载配置文件,等等。此外,有的标签带有前缀,需要引入相应的名称空间,操作起来异常繁琐。鉴于此,Spring 提供了一套声明式的解决方案,以配置类为核心,为我们提供了更加方便快捷、灵活多样的配置应用的方式。xml代码解读复制代码。

2024-08-20 14:45:34 917

原创 史上最强Java面试八股文合集

官方解释1,Spring创建 bean主要分为两个步骤,创建原始bean对象,接着去填充对象属性和初始化。2,每次创建 bean之前,我们都会从缓存中查下有没有该bean,因为是单例,只能有一个。3,当创建 A的原始对象后,并把它放到三级缓存中,接下来就该填充对象属性了,这时候发现依赖了B,接着就又去创建B,同样的流程,创建完B填充属性时又发现它依赖了A又是同样的流程,不同的是:这时候可以在三级缓存中查到刚放进去的原始对象A。

2024-08-20 14:42:12 1052

原创 浅谈Integer缓存机制原理

当赋值100给Integer时,刚好在这个范围内,所以从cache中取对应的Integer并返回,所以a和b返回的是同一个对象,所以 比较是相等的,当赋值200给Integer时,不在cache 的范围内,所以会new Integer并返回,当然 比较的结果是不相等的。1、2、3都好理解,缓存范围是 [-128,127],1、2都在范围内,返回的是缓存中的对象,因此输出true,3不在范围内,返回的是新 new 的Integer,因此输出false。为什么第一个输出的是true,第二个输出的是false?

2024-08-19 14:17:51 755

原创 Spring源码分析之依赖注入

在Spring中,依赖注入的通过寻找注入点(@Autowired、@Resource、@Inject、@Value注解标记的属性、方法),其中**「AutowiredAnnotationBeanPostProcessor#postProcessProperties()」** 负责@Autowired、@Value、@Inject注解的注入点解析和值注入,负责@Resource注解的注入点解析和值注入;

2024-08-19 14:16:59 821

原创 Java Recap 1

所以函数返回值是在finally执行前确定的注意: finally中最好不要包含return,否则程序会提前退出,返回值不是try或catch中保存的返回值finally不执行的几种情况: 程序提前终止如调用了System.exit, 病毒,断电。finally是在return后面的表达式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来,管finally中的代码怎么样,返回的值都不会改变,仍然是之前保存的值),用于引用类型的比较时: ==和equals都是比较栈内存中的地址是否相等。

2024-08-19 14:15:57 613

原创 那些年背过的题:Spring Security- CSRF源码分析

在使用 Spring Security 时,CSRF(跨站请求伪造,Cross-Site Request Forgery)保护是一个非常重要的安全特性。它可以防止恶意网站通过冒充用户请求来执行未授权操作。Spring Security 默认启用了 CSRF 保护,但你也可以根据需要进行配置。

2024-08-19 14:15:14 935

原创 最新Java面试题及答案(找工作,涨薪,转行)

序列化是一种用来处理对象流的机制,所谓对象流也就是将对象的内容进行流化。可以对流化后的对象进行读写操作,也可将流化后的对象传输于网络之间。序列化是为了解决在对对象流进行读写操作时所引发的问题。

2024-08-19 14:09:05 1294

原创 HBase系列学习:基础知识

Apache HBase 是 Hadoop中一个支持分布式的、可扩展的大数据存储的数据库。当需要对大数据进行随机、实时读/写访问时,可以用 Apache HBase。列式存储:HBase是面向列族的非关系型数据库,每行数据列都可以不同,并且列可以按照需求进行动态增加。因此在开始创建HBase表时,可以只创建列族,等需要时再创建相应的列。数据压缩:列式存储意味着数据往往类型相同,可以采用某种压缩算法进行统一的压缩存储。海量存储:HDFS支持的海量存储,存储PB级数据仍能有百毫秒内的响应速度。

2024-08-18 14:13:01 531

原创 http 请求-01-AJAX(Asynchronous JavaScript and XML)入门介绍, ajax 的优缺点

Ajax 是一种在无需重新加载整个网页的情况下,能够更新部分网页的技术。Ajax的全称是Asynchronous JavaScript and XML,即异步JavaScript+XML。它并不是新的编程语言,而是几种原有技术的结合体。它由以下几种技术组合而成,包括:HTML/XHTML——主要的内容表示语言。CSS——为XHTML提供文本格式定义。DOM——对已载入的页面进行动态更新。XML——数据交换格式。XSLT——将XML转换为XHTML(用CSS修饰样式)。

2024-08-18 14:11:02 637

原创 http 请求-02-Ajax XHR 的替代方案 fetch api 入门介绍

fetch通过更简洁的 API、原生的Promise支持、内置的 JSON 处理、更好的流媒体支持,以及更直观的默认行为,解决了在使用上的诸多不便,适合现代 JavaScript 开发需求。fetch是一个功能强大且现代化的 API,适用于大多数网络请求场景。它的简洁性和与现代异步编程模式的兼容性使其在新项目中非常受欢迎。然而,对于某些高级需求,如进度监听或老旧浏览器支持,可能仍需考虑使用或第三方库。

2024-08-18 14:10:26 707

原创 http request-03-Ajax 的替代方案 axios.js 入门介绍

Axios 是一个基于 promise 的 HTTP 库,可以用在浏览器和 node.js 中。

2024-08-18 14:09:46 565

原创 2024年JAVA面试题,终于整理完了

AQS是一个抽象类,可以用来构造锁和同步类,如ReentrantLock,Semaphore,CountDownLatch,CyclicBarrier。AQS的原理是,AQS内部有三个核心组件,一个是state代表加锁状态初始值为0,一个是获取到锁的线程,还有一个阻塞队列。当有线程想获取锁时,会以CAS的形式将state变为1,CAS成功后便将加锁线程设为自己。当其他线程来竞争锁时会判断state是不是0,不是0再判断加锁线程是不是自己,不是的话就把自己放入阻塞队列。这个阻塞队列是用双向链表实现的。

2024-08-18 14:08:44 955

原创 JUC 包中的 Atomic 原子类总结

get():获取当前值。:获取当前值并设置新值。:获取当前值并自增。:获取当前值并自减。:获取当前值并加上预期值。:如果当前值等于预期值,则以原子方式更新。:最终设置为新值,但可能更高效,允许其他线程在一段时间内读取旧值。get(int i):获取数组索引i处的元素值。:获取索引i处的值并设置新值。:获取索引i处的值并自增。:如果索引i处的值等于预期值,则以原子方式更新。与基本类型类似,提供get()set()等方法,用于操作对象引用。

2024-08-16 15:19:10 680

原创 Spring Boot集成Devtools实现热更新?

spring-boot-devtools使用了两个类加载器ClassLoader,一个ClassLoader加载不会发生更改的类(第三方jar包),另一个ClassLoader(restart ClassLoader)加载会更改的类(自定义的类)。为什么同样是重启应用,为什么不手动重启,而是建议使用spring-boot-devtools进行热部署重启?因为文件变动后,第三方jar包不再重新加载,只加载自定义的类,加载的类比较少,所以重启比较快。以上只是一些关键代码,所有代码请参见下面代码仓库。

2024-08-16 15:18:38 260

原创 设计模式之旅:实时更新的观察者模式

当一个对象状态的改变需要改变其他对象, 或实际对象是事先未知的或动态变化的,我们就可以使用观察者模式。当然我们具体使用的时候,肯定不是像上面那么简单,在使用的时候我们可以参考的实现思路。

2024-08-16 15:17:32 289

原创 【重写SpringFramework】配置类概述(chapter 3-5)

在早期的 Spring 项目中,使用 XML 文件进行配置。如下所示,在配置文件中,使用bean标签注册组件,使用标签批量扫描组件,使用import标签引入其他的 XML 文件,使用标签加载配置文件,等等。此外,有的标签带有前缀,需要引入相应的名称空间,操作起来异常繁琐。鉴于此,Spring 提供了一套声明式的解决方案,以配置类为核心,为我们提供了更加方便快捷、灵活多样的配置应用的方式。xml代码解读复制代码。

2024-08-16 15:16:13 950

原创 赶快收藏!全网最佳Set集合详解:HashSet、TreeSet!

面试官:那TreeSet要怎么定制排序?TreeSet的自定义排序我们要利用Comparator接口,通过向TreeSet传入自定义排序规则的Comparator来实现。官方源码是这么解释的,南友们看一看。java代码解读复制代码// 构造一个新的空树集,根据指定的比较器进行排序。// 插入到集合中的所有元素都必须能够通过指定的比较器相互比较: comparator. compare(e1, e2)不得对集合中的任何元素e1和e2抛出ClassCastException。

2024-08-16 15:14:07 334

空空如也

空空如也

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

TA关注的人

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