
Java 基础
文章平均质量分 87
谈谈1974
火萎了,我也准备走了
展开
专栏收录文章
- 默认排序
- 最新发布
- 最早发布
- 最多阅读
- 最少阅读
-
Java 细节汇总(5)-Comparator#compare() 升降序确定
方法的实现可以决定排序元素的升序降序,但是许多人对升降序的确定依据是比较模糊的。降序的判断分析与此类似,不再赘述。原创 2023-05-16 15:03:47 · 1705 阅读 · 2 评论 -
Java 8 ConcurrentHashMap 源码分析
JDK 1.8 的 ConcurrentHashMap 底层数据结构与 HashMap 基本相同,二者在容量机制、Entry 的 hash 值计算及数组 index 下标定位等方面几乎完全一致,这部分读者如感兴趣可参考 Java 8 HashMap 详解 方法源码如下,从中可以看到其处理有以下几个关键步骤: 方法逻辑比较简单,重要逻辑如下: 方法逻辑比较简练,首先判断底层数组的长度是否小于 64,如是则调用 方法尝试 2 倍扩容;其次如果当前数组下标的第一个元素仍然是链表节点,则锁住该节点,将原创 2023-05-12 17:58:41 · 1046 阅读 · 0 评论 -
Java 脚本引擎的使用
Java 6 版本就已经引入了 Rhino 引擎用以支持脚本代码运行,而从 Java 8 开始 Nashorn 取代 Rhino 成为 Java 内嵌的 JavaScript 引擎。Nashorn 引擎允许开发人员将 JavaScript 代码嵌入到 Java 中执行,这个特性在复杂的配置系统中有比较大的应用价值,可以满足特定场景下的灵活性要求。原创 2023-01-10 15:05:47 · 1344 阅读 · 1 评论 -
Java Aho Corasick 自动机的使用
AC 自动机是一种用于字符串多模式匹配的算法,其算法实现的底层数据结构多为字典树,其中一种实现的具体信息读者可参考Aho Corasick 自动机结合 DoubleArrayTrie 极速多模式匹配。在实际开发中 AC 自动机常用于关键词识别提取的场景,以下是相关使用示例。原创 2022-12-24 15:28:03 · 1592 阅读 · 0 评论 -
Java 使用 FreeMarker 模版动态生成内容
FreeMarker是一款模板引擎,可用来生成输出形式丰富的文本内容,其模板编写语言为,非常简单易用。日常开发时常会有邮件发送特定表格的需求,这样的需求就非常适合使用 FreeMarker 来完成,以下内容是一个使用示例。原创 2022-12-20 15:29:31 · 1812 阅读 · 0 评论 -
Java 对象内存布局详解
如果逃逸分析证明一个对象不会被其他线程访问到,并且这个对象可以再分,那么创建的时候就不会创建这个对象,而是使用若干个基本类型的标量数据来替换它。JVM 堆中所有对象分配的内存字节总数必须是 8N,如果对象头和实例数据占用的总大小不满足要求,则需要通过对齐数据来填满。不过继承自父类的私有成员变量也需要初始化,子类对象创建的时候会调用父类构造方法来完成这部分工作,但不会创建出父类对象。是对象头中非常关键的一部分,其在 JVM 中结构如下图所示,读者如感兴趣可以参考。在JVM 1.8 版本后,虚拟机默认开启。原创 2022-08-23 16:14:46 · 3004 阅读 · 1 评论 -
Java 同步锁使用时的性能优化方案
性能优化的需求实现中,如果使用了多线程并行来提高程序运行效率,那么一个很难绕开的部分就是。同步锁会将多线程并行执行强制合流为串行执行,通常会成为整个程序的性能瓶颈所在,所以锁性能的优化必不可少。一般来说,优化锁性能的关键如下:要降低锁竞争发生的概率,一个非常直观的思路是,核心思想是将大的全局锁分割为一个个范围精确的小锁,使线程的竞争对象从全局锁变更为小锁,从而减少锁竞争发生这种思想的典型实践就是通常所说的,实现上就是将全部数据分割成多个部分,为每个部分分配一把锁,而不是使用一把锁锁住全部数据。分段锁应用场景原创 2022-06-21 15:28:24 · 857 阅读 · 0 评论 -
Java 关于 Lock#lock() 的加锁位置
最近在做项目的性能优化,需要将原本单线程跑的程序改造成多线程并行以提高性能。然而业务资源池子是定量的,多线程并行势必涉及到共享资源抢占的问题,。这种需求采用同步锁是毋庸置疑的,但是在加锁的位置上却有一些细节,例如加锁操作是否可以放在 try 代码块里面呢?先给出结论,加锁操作推荐放在 try 代码块外部第一行,以下是 JDK 文档 给出的 Lock 使用示例,可以注意到两点:2.1 加锁在 try 内部可能的问题以下是将加锁操作放在 try 内部的代码示例,仔细考虑就能发现问题点:2.2 加锁在 tr原创 2022-06-11 22:09:45 · 1464 阅读 · 1 评论 -
Java 最优雅方式校验时间段重叠
项目开发过程中经常碰到需要校验一连串时间段是否有重叠的问题,通常直观的解决方式是采用两层循环,从头至尾依次将集合中的时间段元素两两比较即可得出结果。这种方式虽然可行,但从实现上来看着实算不上优雅,只是能 work 而已。笔者花了一些时间分析,发现要校验时间段是否重叠其实只需要一点反向思维,即。基于此,以下用两个时间段 和 为例子进行分析:2. 解决方案经过上一节分析,3 种情况在笔者脑海中想到的处理方式是,于是最终有了以下方案:.........原创 2022-06-10 23:21:53 · 10592 阅读 · 7 评论 -
Java 深拷贝的使用
文章目录前言1. Cloneable 接口实现深拷贝2. 浅拷贝引发的问题2.1 fastjson 对象转化成 json 字符串出现 $ref2.2 多线程环境下的数据问题前言深拷贝是相对于浅拷贝而言的,二者的主要区别如下,在多线程和并发的场景中经常会涉及对象的拷贝问题,需多加注意浅拷贝复制的是对象的内存地址或者说引用,实际上和原对象指向同一块内存,因此修改原对象时,浅拷贝对象的相应属性也会跟着改变深拷贝将对象里的属性拷贝出来并放到一个新的对象,新对象与原对象二者相互独立,修改原对象属性不会原创 2021-08-28 15:40:46 · 1158 阅读 · 0 评论 -
Netty 对 Java NIO 空轮询问题的处理
文章目录1. Java NIO 在 Linux 平台的空轮询问题处理的思路1. Java NIO 新增状态2. 重建 Selector2. Netty 的处理1. Java NIO 在 Linux 平台的空轮询问题处理的思路1. Java NIO 新增状态2. 重建 Selector2. Netty 的处理...原创 2021-05-09 17:47:39 · 794 阅读 · 2 评论 -
java.lang.OutOfMemoryError: Metaspace 的解决
文章目录1. 起因2. Metaspace 的使用机制3. 解决方式4. Metaspace 参数汇总5. 总结1. 起因组内一个运营服务设计之初承载的业务数据量比较小,随着服务功能逐渐扩展业务量快速增长,最近时常出问题,甚至在告警中报出了 java.lang.OutOfMemoryError: Metaspace 错误我们都知道Metaspace 是 Java 8 以后的方法区实现,主要存储的就是JVM 加载到内存中的类相关数据,以及即时编译的代码等。很显然,这个错误的原因大概率是加载到内存中的 c原创 2021-02-25 17:41:13 · 38332 阅读 · 2 评论 -
Java synchronized 关键字(2)-JVM 的锁实现分析
文章目录1. 前言2. 偏向锁3. 轻量级锁4. 重量级锁4.2 重量级锁的竞争1. 前言在 synchronized 同步代码块实现原理 一节中2. 偏向锁3. 轻量级锁4. 重量级锁4.2 重量级锁的竞争该部分主要为重量级锁的竞争过程,可参考 Java 对象锁 Monitor 的实现...原创 2021-01-04 11:33:01 · 805 阅读 · 0 评论 -
Java agent 探针技术(2)-JVM 启动后 agentmain 进行类运行时转换
文章目录1. 简介2. 使用 agentmain 的步骤3. 使用示例3.1 创建实现 ClassFileTransformer 接口的类3.2 创建使用 ClassFileTransformer 的 agentmain 类3.3 打包代理 jar 包3.4 打包目标程序 jar 包3.5 编写 attach 处理程序3.6 测试1. 简介premain 的代理 jar 包需要在 Java 程序启动时指定,并且只能在类加载之前修改字节码,类被加载之后就无能为力了。这种使用方式使其在应用场景上有很大的限原创 2020-12-08 17:04:11 · 3523 阅读 · 8 评论 -
Java agent 探针技术(1)-JVM 启动时 premain 进行类加载期增强
文章目录1. 简介2. 使用 Java agent 的步骤3. 使用示例1. 简介在之前的文章 静态代理 一节中我们已经提到过 Java 探针技术,简单来说,在 JDK 1.5中 Java 引入了 java.lang.Instrument 包,该包提供了一些工具使得在类加载时期修改 Class 类成为了可能。这实际上就是提供了一种虚拟机级别的 AOP,其基本的原理可依据下图阐明:在 类加载过程 一文我们提到了类加载的过程,其第一步就是加载。其实从 Java 类完整的生命周期来看,从 Java 源文件原创 2020-12-06 17:21:01 · 5225 阅读 · 1 评论 -
响应式编程-Flux 发布订阅源码分析
文章目录1. 响应式关键组件1.1 发布器 Publisher1.2 订阅器 Subscriber1.3 数据容器 Subscription2. Flux 发布消费流程分析2.1 发布器的准备2.2 订阅器的消费1. 响应式关键组件1.1 发布器 Publisher1.2 订阅器 Subscriber1.3 数据容器 Subscription2. Flux 发布消费流程分析一个典型的响应式代码示例如下,下图为其源码流程示意Flux.range(1, 1000) .onBackpress原创 2020-11-19 17:42:32 · 5728 阅读 · 0 评论 -
Java 细节汇总(4)-Arrays 中的双轴快排
文章目录1. Arrays 中的双轴快排2. Java switch 支持字符串的原理1. Arrays 中的双轴快排2. Java switch 支持字符串的原理原创 2020-07-01 10:41:42 · 604 阅读 · 0 评论 -
Java UnSafe 类使用介绍
文章目录1. UnSafe 简介2. UnSafe 功能与使用示例2.1 操作对象属性2.2 操作数组元素2.3 CAS 操作2.4 线程挂起与恢复1. UnSafe 简介Unsafe是 Java 整个并发包底层实现的核心,它使 Java 拥有了像 C 的指针一样直接操作内存的能力,而这也就意味着其越过了 JVM 的限制。Unsafe 的特性如下,它虽然在一定程度上提升了效率,但是也带来了指针的不安全性Unsafe 不受 JVM 管理,也就无法被自动 GC,需要手动 GC,容易出现内存泄漏Uns原创 2020-06-04 15:23:08 · 1050 阅读 · 0 评论 -
Java 动态代理的底层原理
文章目录1. 动态代理使用2. 动态代理原理1. 动态代理使用2. 动态代理原理原创 2020-05-28 11:20:27 · 1556 阅读 · 0 评论 -
Java 8 Stream(2)-原理解析
文章目录1. Strem 组件结构1.1 操作分类1.22. Stream 实现原理2.1 Spliterator 可分割迭代器2.2 流处理流程1. Strem 组件结构1.1 操作分类1.22. Stream 实现原理2.1 Spliterator 可分割迭代器2.2 流处理流程原创 2020-05-15 22:33:16 · 1378 阅读 · 0 评论 -
Java IO 模型及示例
文章目录1. BIO(同步阻塞IO)2. NIO(同步非阻塞IO)3. AIO(异步非阻塞IO)1. BIO(同步阻塞IO)2. NIO(同步非阻塞IO)3. AIO(异步非阻塞IO)原创 2020-03-08 16:08:49 · 699 阅读 · 0 评论 -
Java 8 时间处理的使用
文章目录1. 日期 LocalDate2. 时间 LoaclDateTime1. 日期 LocalDate2. 时间 LoaclDateTime原创 2020-02-26 20:28:10 · 531 阅读 · 0 评论 -
Java 值传递与“引用传递”
文章目录1. Java 的值传递2. Java 的引用传递1. Java 的值传递通常认为Java 方法传参数都是值传递2. Java 的引用传递传入引用类型的数据,可以修改数据内容,但是在方法中对传入引用的再赋值不会生效...原创 2020-02-09 14:23:35 · 5744 阅读 · 6 评论 -
Java synchronized 关键字(3)-JVM 重量级锁 Monitor 的实现
文章目录1. Java 中的 Monitor2. Monitor 实现锁分配1. Java 中的 MonitorJava synchronized关键字 中介绍过synchronize的实现原理,其实无论是同步方法ACC_SYNCHRONIZED还是同步代码块 monitorenter、monitorexit都是基于Monitor实现的。2. Monitor 实现锁分配...原创 2020-01-23 23:54:17 · 2140 阅读 · 0 评论 -
Java if-else 多重嵌套的优化
文章目录1. if-else 多重嵌套的问题2. 解决方案2.1 使用 Map 缓存2.2 switch 简化条件1. if-else 多重嵌套的问题2. 解决方案2.1 使用 Map 缓存2.2 switch 简化条件原创 2020-01-03 21:15:26 · 5219 阅读 · 0 评论 -
Java 8 Stream(1)-流的使用及技巧
文章目录1. Stream 简介2. Stream 创建3. Stream 常用操作3.1 Stream 中间操作3.2 Stream 最终操作1. Stream 简介集合和数组是我们经常会用到的数据结构,需要经常对他们做增、删、改、查、聚合、统计、过滤等操作。在Java 8之前,集合和数组的处理并不是很便捷,不过Java 8 API添加了一个新的抽象称为流Stream,可以以一种声明的方式处...原创 2019-12-28 22:49:56 · 786 阅读 · 0 评论 -
Java 细节汇总(3)-YYYY-MM-dd 造成的日期错误
文章目录1. 使用 Long.parse() 时报错1. 使用 Long.parse() 时报错String a = "100.0";Long b=Long.parse(a);For input string: "100.00"java.lang.NumberFormatException: For input string: "100.00"Long是整形 parse 的数字字...原创 2019-12-19 22:38:29 · 2439 阅读 · 0 评论 -
Java synchronized 关键字(1)-使用全解
1. synchronized 的作用2. synchronized 的范围2.1 synchronized 锁静态方法2.2 synchronized 锁对象方法3. synchronized 的原理原创 2019-08-19 10:04:40 · 1074 阅读 · 0 评论 -
Java 基本排序算法
1. 算法的性能排序算法稳定性:假定在待排序的记录序列中,存在多个具有相同的关键字的记录,若经过排序,这些记录的相对次序保持不变,则称这种排序算法是稳定的.即在原序列中,array[i]==array[j],且 i<j,而在排序后的序列中,array[i] 仍在 array[j]之前。算法平均时间复杂度最好时间最坏时间空间复杂度稳定性冒泡O(n ^2)O...原创 2019-08-11 12:01:58 · 285 阅读 · 0 评论 -
Java volatile 关键字详细解析
1. volatile 的作用2. volatile 的原理内存屏障3.原创 2019-08-11 12:22:34 · 664 阅读 · 1 评论 -
Java ThreadLocal 源码全解
1. ThreadLocal 使用2. ThreadLocal 原理3. ThreadLocal 可能导致内存泄露原创 2019-08-11 12:25:43 · 529 阅读 · 2 评论 -
Java 8 HashMap 详解
文章目录1. HashMap 存储结构1.1 HashMap底层结构1.2 HashMap 为什么采用数组 + 链表Reference: 解决hash冲突的四种方法:1.2 HashMap 数组结构可否被替代1.3 HashMap 为何不直接使用红黑树1.4 HashMap 红黑树什么时候退化为链表2. HashMap 存取过程2.1 HashMap put()方法2.2 HashMap get(...原创 2019-08-29 17:24:21 · 4087 阅读 · 2 评论 -
Java 细节汇总(1)-线程多次调用 start 方法的问题
文章目录1. 线程多次调用 start 方法阻塞与等待的区别2. 顺序栈和链栈的区别3. sleep(n) 和 sleep(0)的区别4. 嵌套 for 循环性能比较5. Java 泛型实现6. 访问修饰符的访问权限1. 线程多次调用 start 方法从源码来看, 一个线程如果已经调用过 start 方法,那么再次调用 start 方法的时候会抛出 IllegalThreadStateExc...原创 2019-09-11 21:20:42 · 698 阅读 · 0 评论 -
Java 细节汇总(2)-String 的最大长度
文章目录1. String 的最大长度2. Integer 的缓冲池1. String 的最大长度从源码来看,String 其实就是由 char 数组实现,根据以下构造方法推断,count 是 int 类型,那么char value[]中最多应该可以保存 Integer.MAX_VALUE个字符,也就是2147483647字符但是实际编译的时候,String 中最多可以有65534个字符,如...原创 2019-09-12 12:39:53 · 4630 阅读 · 1 评论 -
数据结构 - 树的分类
文章目录1. 树的分类2. 二叉树2.1 红黑树3. 多叉树1. 树的分类根据树分支的数量限制,可以将树结构分为两类:二叉树:二叉树也就是一个节点只有两个子节点的树结构,比较有代表的如 红黑树多叉树:多叉树一个节点最少有两个子节点,根据不同的要求可以有多个子节点,典型如 B树2. 二叉树2.1 红黑树红黑树(Red-Black Tree,简称R-B Tree),是一种特殊的二叉查...原创 2019-09-20 16:45:42 · 5309 阅读 · 0 评论 -
Java String 类的不可变性
文章目录1. String 不可变的性质1.1 String 对象连接1.2 String 不可变实现2. String 不可变的目的1. String 不可变的性质如我们所知,String 对象通常被存在字符串常量池中,一旦一个 String 对象被创建出来,它就无法被修改。对 String 对象的所有修改操作其实都没有改变字符串本身的值,而是返回一个新的 String 对象1.1 Str...原创 2019-09-26 16:19:57 · 335 阅读 · 0 评论 -
Java 重写equals()方法后重写 hashCode() 方法的必要性
Java API文档中的规定如果两个对象通过调用equals方法是相等的,那么这两个对象调用hashCode方法必须返回相同的整数。Object中equals方法面试时很容易碰到的问题: equals方法与 == 运算符的区别, 许多人都会回答:equals比较的是对象的内容,而 == 比较的是对象的地址. 这种说法其实并不完全正确, 在 Object 类中 equals 方法的实现如下所...原创 2019-08-08 19:27:04 · 427 阅读 · 0 评论