
Java基础
文章平均质量分 91
java
程序猿进阶
要做就做第一,就算结果不是第一,也会是一个好成绩。 加油!我的未来不是梦。
展开
-
到底应不应该使用@Builder
大多数同学使用@Builder无非就是为了链式编程,然而@Builder并不是链式编程的最佳实践,它会额外创建内部类,存在继承关系时还需要使用@SuperBuilder注解,设置默认值时也需要额外的@Builder.Default去设置默认值,无疑增加了很多不必要的复杂度。原创 2025-01-19 20:57:14 · 14950 阅读 · 11 评论 -
Reactor 错误重试使用分享
在使用 Reactor 进行响应式编程时,错误处理和重试机制是非常重要的部分。Reactor 提供了多种方式来处理错误和实现重试机制。【1】使用 retry 操作符retry 操作符可以在发生错误时重新订阅序列。你可以指定重试的次数。.retry(3);上面的代码会在发生错误时重试 3 次。【2】使用 retryWhen 操作符retryWhen 操作符提供了更灵活的重试机制,可以根据特定条件或延迟策略进行重试。上面的代码会在发生错误时,每隔 1 秒重试一次,共重试 3 次。原创 2024-12-26 05:30:00 · 11987 阅读 · 4 评论 -
Reactor 错误处理
命令式编程的最后一个相似之处是清理,可以通过使用“使用块finally来清理资源”或使用“Java 7 try-with-resource 构造”来完成,doFinallyonComplete是关于当序列终止(使用或)或取消时要执行的副作用onError。后备方法:如果您想要的不仅仅是一个默认值,而且您有另一种(更安全)的方式来处理数据,那么您可以使用onErrorResume。类似onErrorReturn,onErrorComplete具有允许您根据异常的类或过滤要回退的异常的变体Predicate。原创 2024-12-24 05:30:00 · 6390 阅读 · 7 评论 -
可视化逻辑表达式编辑器
QueryBuilder 是一个用于创建查询和过滤器的 UI 组件。QueryBuilder的特点1、支持的输入属性丰富,常见的 字符串,整数,浮点数,布尔类型,日期类型,数组列表等都支持2、高度可定制。QueryBuilder是由规则以及规则组组合而成的查询以及过滤组件,规则以及规则组可以层层嵌套,所以复杂的规则也可以配置出来。3、支持的生成脚本语句多。QueryBuilder的最终目的是,通过配置规则树,最终把规则树转化为我们想要的脚本语句。原创 2024-12-11 05:30:00 · 10077 阅读 · 64 评论 -
异常场景分析
* 讲师 前端控制器*原创 2024-10-04 05:30:00 · 11742 阅读 · 87 评论 -
内存占用估算方法
通过掌握每种数据类型的大小,就可以更准确地预测对象和数据的内存消耗。原创 2024-10-01 05:15:00 · 2120 阅读 · 61 评论 -
TreeMap源码详解
背景:昨天有人问我,他想将Map中的Key按照顺序进行遍历,我说直接使用keySet方法获取到Set集合,因为它是集成Collection接口,所以包含了sort方法后遍历取value值即可。但当看到TreeMap的那一刻,我发现自己错了。【1】TreeMap的key不能为nullvalue可以为null;【2】HashMap的key可以为nullvalue可以为null;【3】和HashTable的key和value都不可以为null;原创 2024-09-26 05:30:00 · 1970 阅读 · 77 评论 -
ArrayList 源码解析
Fail-FastArrayList也采用了快速失败的机制,通过记录modCount参数来实现。在面对并发的修改时,迭代器很快就会完全失败,而不是冒着在将来某个不确定时间发生任意不确定行为的风险。原创 2024-09-16 05:30:00 · 1518 阅读 · 46 评论 -
Java 强/软/弱/虚引用
时回收该对象,让其超出对象的生命周期范围或者设置引用指向null,并且会执行对象的`finalize 函数。当jvm扫描到虚引用的对象时,会先将此对象放入关联的队列中,因此我们可以通过判断队列中是否存这个对象,来进行回收前的一些处理。认为强引用的对象是用户正在使用的对象,它无法分辨出到底该回收哪个,强行回收有可能导致系统严重错误。强引用是最普遍的引用,一般把一个对象赋给一个引用变量,这个引用变量就是强引用。虚拟机就会把这个软引用加入到与之关联的引用队列中。虚引用和没有引用是一样的,需要和队列。原创 2024-08-16 05:30:00 · 1139 阅读 · 64 评论 -
Spock Unit Test in Java
Spock是一个基于Groovy语言的测试和规范框架,使得测试代码更简介,得益于Spock兼容大部分IDE和测试框架等。基于BDD行为驱动开发,功能非常强大。提供了各种标签,并采用简单、通用、结构话描述语言,让编写测试代码更加简介、高效。官方文档为什么要使用Spock:因为它优美而富有表现力的规范语言。Spock的灵感来自JUnitRSpecjMockMockitoGroovyScalaVulcans。主流单元测试框架比较特性/框架JUnitMockitoPowerMockJMock。原创 2024-07-30 09:51:47 · 1568 阅读 · 45 评论 -
CodeReview 规范及实施
你的代码整体结构清晰,逻辑合理,很容易理解。随着业务压力增大,引发代码质量下降,代码质量的下降导致了开发效率的降低,维护成功高等问题,开发效率下降后又加重了业务压力,最终陷入了死亡三角的内耗之中。,因为开发者比你更了解整个系统的业务逻辑和架构,你的意见可能不适合该系统或架构,因此需要友好的交流,让他们知道他们的代码是对的,继续保持,自己则更进一步的了解整个系统和架构,避免第二次犯同样的错误。代码评审是一个学习的机会,通过审查他人的代码,可以学习到新的编码技巧和最佳实践,同时也可以分享自己的知识和经验。原创 2024-03-11 05:00:00 · 8643 阅读 · 134 评论 -
ThreadLocal :在 Java中隱匿的魔法之力
ThreadLocal 并不是一个Thread,而是 ThreadLocalVariable(线程局部变量)。也许把它命名为 ThreadLocalVar更加合适。线程局部变量就是为每一个使用该变量的线程都提供一个变量值的副本,是 Java中一种较为特殊的线程绑定机制,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。ThreadLocal是除了加锁这种同步方式之外的另一种保证多线程访问出现线程不安全的方式。原创 2024-03-08 05:00:00 · 8117 阅读 · 103 评论 -
Java 泛型
的区别:基本泛型T是用于定义,将数据类型参数化,不能用于实例化。上下界通配符其实涉及到 Java 的多态属性,上下转型的可行性,子类实例可以转换成父类实例,但是父类实例却不一定能转换成子类实例,只有本身就是该子类实例向上转型的父类实例才可以向下转型为子类实例。创建在放方法上的泛型是在真正调用方法时确定,一般都由传入的参数确定,包含这个方法的类创建对象时,并不会确定方法上的类型,一定在调用方法时确定。super A>限制类型的下限,只能向下转型,可以写,但是没法读,因为父类型不确定,没法向上转型。原创 2024-02-24 05:00:00 · 7066 阅读 · 77 评论 -
Java 反射机制
更多内容,前往反射Reflection被视为动态语言的关键,反射机制允许程序在执行期间借助于取得任何类的内部信息,并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构造者,而不是应用程序员。如果仅对设计应用程序感兴趣,而对构造工具不感兴趣,就没有学习的必要。原创 2024-02-28 05:00:00 · 6230 阅读 · 81 评论 -
Java面试——锁
在并发环境中,每个线程在获取锁时会先查看此锁维护的队列,如果为空,或者当前线程是等待队列的第一个,就占有锁,否则就会加入到等待队列中,以后会按照 FIFO 的规则从队列中取到自己。指多个线程获取锁的顺序并不是按照申请锁的顺序,上来就尝试占有锁,如果尝试失败,就再采用类似公平锁的方式获取锁。【4】不适合计算密集型任务:如果任务主要是计算密集型的,使用自旋锁可能会导致性能下降,因为自旋锁会占用CPU资源,而在计算密集型任务中,减少锁的使用可能是更优的选择。类型来得到公平锁或非公平锁,默认是。原创 2024-02-26 05:00:00 · 6204 阅读 · 79 评论 -
枚举类(enum)
为什么需要枚举类?【1】有些类的实例有限且固定,需要有一种特定且方便的方式来表示这种类。【2】使用枚举类可以使程序更加健壮,避免创建对象的随意性。【3】避免一些常量值的意义不明确(这个在下面会有具体示例)。//枚举类//1.提供类的属性,声明为private final//2.声明为final的属性,在构造器中初始化。//3.通过公共的方法来调用属性//4.创建枚举类的对象:将类的对象声明public static final。原创 2024-02-21 05:00:00 · 1392 阅读 · 61 评论 -
自定义异常处理演示
为了防止黑客从前台异常信息,对系统进行攻击。同时,为了提高用户体验,我们都会都抛出的异常进行拦截处理。原创 2024-02-20 05:00:00 · 1306 阅读 · 79 评论 -
IO 流分类
磁盘与内存之间的数据交互,可以看做是一种数据的流动,按照流动方向,以内存为基准,分为输入 input 和输出 output,即流向内存的是输入流,流出内存的是输出流。Java IO操作主要是指使用 java.io包下的内容,进行输入、输出操作。输入也叫读取数据,输出也叫写出数据。根据数据的流向分为:输入流和输出流。根据数据的类型分为:字节流(以字节为单位)和字符流(以字符为单位)。输入流输出流字节流字符流ReaderWriter。原创 2024-02-19 05:00:00 · 13189 阅读 · 59 评论 -
JDK8 升级至JDK19
优质博文目前部分项目使用JDK8,部分项目使用JDK19因此,环境变量中还是保持JDK8,只需要下载JDK19免安装版本,通过配置IDEA就可以完成本地开发。原创 2024-02-18 12:54:48 · 12154 阅读 · 59 评论 -
UML类图
统一建模语言:用来设计软件的可视化建模语言,能够表达软件设计中的动态与静态信息。UML定义了用例图、类图、对象图、状态图、活动图、时序图、协作图、构件图、部署图等9种图。是显示了模型的静态结构,特别是模型中存在的类、类的内部结构以及它们与其他类的关系等。类图不显示暂时性的信息。类图是面向对象建模的主要组成部分。1、在软件工程中,类图是一种静态的结构图,描述了系统的类的集合,类的属性和类之间的关系,可以简化了人们对系统的理解;2、类图是系统分析和设计阶段的重要产物,是系统编码和测试的重要模型。原创 2024-02-17 13:11:07 · 1273 阅读 · 31 评论 -
Lombok 高级说明
优质博文:IT-BLOG-CN【1】代码臃肿:中的等;【2】样板式代码:流的关闭操作等;是一个可以通过注解简化代码开发的工具,能够在我们编译源码的时候自动帮我们生成代码,如等;官网GitHub【1】反射: 注解处理器在编译期间会生成一些代码,其中包括和方法、构造函数等。这些代码在运行时可以通过反射来访问和调用。使用反射会带来性能问题:反射调用方法的性能通常比直接调用方法要慢得多,因为反射需要进行额外的操作来查找和调用方法。安全问题:反射可以访问和调用私有方法和字段,这可能会导致安全问题。可维护性问题:由原创 2024-02-09 11:30:00 · 1479 阅读 · 19 评论 -
MapStruct
做了很多优化,整体性能提升了不少,不过还是使用反射实现,针对复杂场景支持能力不足。之间的转换,编写映射转化代码是一个繁琐重复还易出错的工作。中不会只包含基本数据类型,其中往往会包含其它类。工具时,对于字段名不一致和嵌套类型不一致时,需要手动编写。,运行期间直接调用实现类,不会在运行期间使用发射进行转换。接口更新如下:如果两个属性中包含相同的字段时,需要通过。,编译通过之后,运行期间就不会报错。的依赖注入来创建,就不需要在接口中添加。,该插件会在构建时生成对应的代码。如何取值,都将始终使用常量值,如果。原创 2023-09-04 00:06:51 · 1729 阅读 · 2 评论 -
Java8 Function接口详解
Java8为函数式接口引入了一个新注解,主要用于编译级错误检查,加上该注解,当接口不符合函数式接口定义的时候,编译器会报错。对于接口是不是函数式接口没有影响,该注解只是提醒编译器去检查该接口是否仅包含一个抽象方法。。函数式接口就是一个有且仅有一个抽象方法,但是可以有多个非抽象方法的接口。对于Stream流大家常用的方法中集合个所有的Function类型,下面逐个介绍条件筛选对单个item对象转换操作对item对象操作,并返回一个新的Stream流循环遍历条件筛选,整个集合item有一个为条件筛选,全部。原创 2023-04-29 19:25:25 · 2977 阅读 · 2 评论 -
Java 9 Reactive Streams
反应式编程的思想最近得到了广泛的流行。 在 Java 平台上有流行的反应式 库 RxJava 和 R eactor。反应式流规范的出发点是提供一个带非阻塞负压( non-blocking backpressure ) 的异步流处理规范。反应式流规范的核心接口已经添加到了 Java9 中的 java.util.concurrent.Flow 类中。原创 2022-11-24 08:58:32 · 1441 阅读 · 2 评论 -
Java Reactor Stream
一、Reactor 概念“具有非阻塞负压功能的异步流处理系统” 的标准以及API。1、Reactive Streams 核心接口2、Flux 与 Mono【1】Flux 对象代表一个包含0-N个元素的响应式序列;【2】Mono 对象代表一个包含0-1个元素的响应式序列;3、Reactor 操作符二、Reacotr 基本原理......原创 2022-04-17 23:49:20 · 2274 阅读 · 7 评论 -
Java 性能优化
存储定理存储性能优化法则优化法则归纳为4个层次:【1】减少数据访问(减少磁盘访问)【2】返回更少数据(减少网络传输或磁盘访问)【3】减少交互次数(减少网络传输)【4】减少服务器 CPU开销(减少CPU及内存开销)数据库优化法则代码示例案例一:通过遍历List从数据库中获取数据进行处理,应当直接传入 List从数据库中一次性获取数据。 list.forEach( l -> { ... // 从数据库中获取数据 Object o = dal.getIn原创 2022-03-06 14:23:40 · 1027 阅读 · 1 评论 -
异常处理与实践
超时作者:孟鸿志超时设置应该被重视,因为超时设置的问题,已经引发了多起 P3 以上级别的事件。通过配置合理的超时时间,可以防止出现某服务的依赖服务超时时间太长而响应慢,以致自己响应慢甚至崩溃。从一个请求到最终响应,整个链路中有多处有独立的超时设置:代理层超时与重试:如 Proxy、Nginx,这些组件实现代理功能,如 Nginx 可以实现请求的负载均衡。需要设置代理与后端真实服务器之间的网络连接/读/写超时时间。Web 容器超时:如 Tomcat、Jetty 等,提供 HTTP 服务运行环境的。原创 2022-02-08 20:52:55 · 1342 阅读 · 1 评论 -
Java面试——Java基础
一、JAVA中的几种基本数据类型Java语言中一共提供了8种原始的数据类型(byte,short,int,long,float,double,char,boolean),这些数据类型不是对象,而是 Java语言中不同于类的特殊类型,这些基本类型的数据变量在声明之后就会立刻在栈上被分配内存空间。除了这8种基本的数据类型外,其他类型都是引用类型(例如类、接口、数组等),引用类型类似于C++中的引用或指针的概念,它以特殊的方式指向对象实体,此类变量在声明时不会被分配内存空间,只是存储了一个内存地址而已。.原创 2021-04-06 23:39:25 · 1902 阅读 · 2 评论 -
Web请求过程
一、B/S网络架构概述B/S网络架构基于统一的应用层协议 HTTP来交互数据,与大多数的传统 C/S互联网应用程序采用的长连接的交互模式不同,HTTP采用无状态的短连接的通信方式。一次请求就完成一次数据交互,然后通信就断开。采用这种方式能够同时服务更多的用户,因为当前互联网应用每天都会处理上亿的用户请求,不可能每个用户访问一次后就一直保持这个链接。B/S架构设计如下:既要满足海量用户的访问请求,又要保持用户请求的快速响应。(当浏览器解析服务器返回的数据时,会发现还有一些静态资源,如:CSS/JS/ima原创 2021-03-30 22:53:45 · 1488 阅读 · 1 评论 -
HashMap 与 ConcurrentHashMap 底层实现
一、HashMap 底层源码JDK7 版本(数组+链表)我们存放的 hashMap 都会封装成一个节点对象 Entry(key,value),然后将此节点对象存放到一个数组中,存放前首先需要确定存放的数组下标:① 通过 hash(key) 算法得到 key 的 hashcode,并通过 hashcode的高16位和低16位进行异或操作(如果两个相应bit位相同,则结果为0,否则为1)得到32位的 int值,首先将高16位无符号右移16位与低十六位做异或运算。如果不这样做,而是直接做&运算(相原创 2021-03-30 22:50:52 · 10658 阅读 · 48 评论 -
Java8 新特性
Java8 优势:速度快、代码更少(增加了新的语法 Lambda 表达式)、强大的 Stream API、便于并行、最大化减少空指针异常 Optional;一、Lambda 表达式Lambda 是一个匿名函数,我们可以把 Lambda 表达式理解为是一段可以传递的代码(将代码像数据一样进行传递)。可以取代大部分的匿名内部类,可以写出更简洁、更灵活的代码。尤其在集合的遍历和其他集合操作中,可以极大地优化代码结构。作为一种更紧凑的代码风格,使 Java 的语言表达能力得到提升。JDK 也提供了大量的.原创 2021-03-30 22:42:47 · 1382 阅读 · 0 评论 -
Java 注解机制
注解是 JDK1.5版本开始引入的一个特性,用于对代码进行说明,可以对包、类、接口、字段、方法参数、局部变量等进行注解。它主要的作用有以下四方面:【1】生成文档:通过代码里标识的元数据生成 javadoc文档。【2】编译检查:通过代码里标识的元数据让编译器在编译期间进行检查验证。【3】编译时动态处理:编译时通过代码里标识的元数据动态处理,例如动态生成代码。【4】运行时动态处理:运行时通过代码里标识的元数据动态处理,例如使用反射注入实例。这么来说是比较抽象的,我们具体看下注解的常见分类:【1】Java自带原创 2021-03-29 22:34:40 · 1394 阅读 · 0 评论 -
接口限流常见的四种算法
固定窗口计数器将时间划分为多个窗口,窗口内出现一次请求就将计数器加一,如果计数器超过了限制数量,则本窗口内后续请求都被丢弃当,时间到达下一个窗口时,计数器重置。固定窗口计数器是最为简单的算法,但这个算法有时会出现通过请求量允许为限制的两倍。考虑如下情况:限制 1 秒内最多通过 5 个请求,在第一个窗口的最后半秒内通过了 5 个请求,第二个窗口的前半秒内又通过了 5 个请求。这样看来就是在 1 秒内通过了10 个请求。滑动窗口计数器将时间划分为多个区间,在每个区间内每有一次请求就将计数器加一维原创 2021-03-29 22:20:58 · 1476 阅读 · 0 评论 -
Unsafe 类的应用
Unsafe是位于 sun.misc包下的一个类,主要提供一些用于执行低级别、不安全操作的方法,如直接访问系统内存资源、自主管理内存资源等,这些方法在提升 Java运行效率、增强 Java语言底层资源操作能力方面起到了很大的作用。但由于 Unsafe类使 Java语言拥有了类似 C语言指针一样操作内存空间的能力,这无疑也增加了程序发生相关指针问题的风险。在程序中过度、不正确使用 Unsafe类会使得程序出错的概率变大,使得 Java这种安全的语言变得不再“安全”,因此对 Unsafe的使用一定要慎重。基原创 2021-03-29 22:20:07 · 10685 阅读 · 63 评论 -
HashMap详解
HashMapJDK1.8对HashMap底层的实现进行了优化,引入红黑树的数据结构和扩容的优化。Java为数据结构中的映射定义了一个接口java.util.Map,此接口主要有四个常用的实现类,分别是HashMap、Hashtable、LinkedHashMap和TreeMap,类继承关系如下图所示:下面针对各个实现类的特点做一些说明:(1) HashMap:它根据键的hashCode值存储数据,大多数情况下可以直接定位到它的值,因而具有很快的访问速度,但遍历顺序却是不确定的。 HashMap最原创 2021-01-27 22:42:33 · 5048 阅读 · 2 评论