随笔分类 -  Java

摘要:Java 中的异步 I/O 简称 AIO, A 即 Asynchronous。AIO 在 JDK1.7 时引入,基于操作系统提供的异步 I/O 通信模型,封装了一些进行异步 I/O 操作的 API。 1. 异步 I/O 模型 学习 Java I/O 相关操作之前应该先了解其背后的 I/O 模型。Ja 阅读全文
posted @ 2022-01-19 20:35 Robothy 阅读(1089) 评论(0) 推荐(0) 编辑
摘要:一个中大型的 Java 基础框架项目往往包含许多 JAR 包,如果将这些 JAR 包单独发布给业务开发使用,这些不同版本 JAR 包间的兼容性维护将变得十分麻烦。为了解决这个问题,可以让一个特殊的模块引用这些 JAR 包,将一组 JAR 包兼容的版本号定义在这个模块中,对外发布时只发布这个特殊模块。 阅读全文
posted @ 2021-04-19 15:18 Robothy 阅读(2206) 评论(0) 推荐(0) 编辑
摘要:选择器 Selector 是 I/O 多路复用模型的核心组件,它可以监控实现了 SelectableChannel 接口的通道的就绪情况。基于多路复用(multiplexing) I/O 模型,单线程的 Java 程序能够处理数万个连接,极大提高了系统的并发数。 1. 多路复用 I/O 模型 I/O 阅读全文
posted @ 2021-01-15 14:30 Robothy 阅读(1793) 评论(0) 推荐(1) 编辑
摘要:FileChannel 提供了一种通过通道来访问文件的方式,它可以通过带参数 position(int) 方法定位到文件的任意位置开始进行操作,还能够将文件映射到直接内存,提高大文件的访问效率。本文将介绍其详细用法和原理。 1. 通道获取 FileChannel 可以通过 FileInputStre 阅读全文
posted @ 2021-01-13 11:35 Robothy 阅读(13751) 评论(0) 推荐(5) 编辑
摘要:Channel 是 NIO 的核心概念,它表示一个打开的连接,这个连接可以连接到 I/O 设备(例如:磁盘文件,Socket)或者一个支持 I/O 访问的应用程序。Java NIO 使用缓冲区和通道来进行数据传输。 Java 应用IO设备缓冲区通道 一个通道在创建的时候被打开,可以调用 isOpen 阅读全文
posted @ 2021-01-11 17:16 Robothy 阅读(1783) 评论(8) 推荐(2) 编辑
摘要:缓冲区 Buffer 是 Java NIO 中一个核心概念,它是一个线性结构,容量有限,存放原始类型数据(boolean 除外)的容器。 1. Buffer 中可以存放的数据类型 java.nio.Buffer 是一个接口,有 7 个重要的子类,对应着 7 种(除 boolean 外)原始数据类型: 阅读全文
posted @ 2021-01-02 17:28 Robothy 阅读(780) 评论(0) 推荐(1) 编辑
摘要:Java socket 封装了传输层的实现细节,开发人员可以基于 socket 实现应用层。本文介绍了 Java socket 简单用法。 1. 传输层协议 传输层包含了两种协议,分别是 TCP (Transmission Control Protocol,传输控制协议) 和 UDP (User D 阅读全文
posted @ 2020-12-31 10:09 Robothy 阅读(8660) 评论(0) 推荐(1) 编辑
摘要:HashMap 是 Java 中最常见数据结构之一,它能够在 O(1) 时间复杂度存储键值对和根据键取值。本文将分析其内部实现原理(基于 jdk1.8.0_231)。 1. 数据结构 HashMap 是基于哈希值的一种映射,所谓映射,即可以根据 key 获取到相应的 value。例如:数组是一种的映 阅读全文
posted @ 2020-12-29 15:50 Robothy 阅读(368) 评论(0) 推荐(0) 编辑
摘要:ArrayDeque 是双端队列的动态数组实现,可以当作栈和队列来使用。作为栈时,它的效率比 Stack 更高,作为队列时,效率比 LinkedList 更高。ArrayDeque 大部分操作的时间复杂度都是 O(1)。本文将介绍 ArrayDeque 的核心 API 以及其内部实现的算法。 1. 阅读全文
posted @ 2020-12-15 13:22 Robothy 阅读(624) 评论(0) 推荐(0) 编辑
摘要:Deque 是一种支持在两端进行操作的线性结构,包含了栈和队列的功能。Java 中建议使用 Dqueue 的实现来替代遗留的 Stack 类。本文将介绍 Deque 提供的主要 API。 阅读全文
posted @ 2020-12-14 16:10 Robothy 阅读(801) 评论(0) 推荐(0) 编辑
摘要:LinkedList 是 List 接口和 Deque 接口的双向链表实现,它所有的 API 调用都是基于对双向链表的操作。本文将介绍 LinkedList 的数据结构和分析 API 中的算法。 数据结构 LinkedList 的数据结构是一个双向链表,它有两个成员变量:first 和 last,分 阅读全文
posted @ 2020-12-14 16:02 Robothy 阅读(638) 评论(0) 推荐(0) 编辑
摘要:ArraysList 基于动态数组实现了 List 接口。实现了所有的列表相关操作,它允许操作所有的元素(包括 null)。ArrayList 几乎和 Vector 一样,区别在于 ArrayList 是非线程安全的。本文从源码的角度分析 ArrayList 的实现细节。 jdk1.8.0_231 阅读全文
posted @ 2020-11-23 23:37 Robothy 阅读(226) 评论(0) 推荐(0) 编辑
摘要:第一感觉是一样的,盲猜后者调用了前者,并传入参数 0。但无论是 Java 7 还是 Java 8,这两个方法构造的结果都是不一样的。JDK 开发人员在一些方面作了优化。 阅读全文
posted @ 2020-11-14 19:14 Robothy 阅读(1533) 评论(0) 推荐(0) 编辑
摘要:泛型是 Java 开发中常用的技术,了解泛型的几种形式和实现泛型的基本原理,有助于写出更优质的代码。本文总结了 Java 泛型的三种形式以及泛型实现原理。 1. 泛型 泛型的本质是对类型进行参数化,在代码逻辑不关注具体的数据类型时使用。例如:实现一个通用的排序算法,此时关注的是算法本身,而非排序的对 阅读全文
posted @ 2020-11-09 23:30 Robothy 阅读(6407) 评论(0) 推荐(5) 编辑
摘要:equals() 和 hashCode() 在 Object 类中以本地方法的形式存在,Java 中所有的类都继承了 Object 类,因此所有的类中都包含了这两个方法。这两个方法在 Java 开发中使用及其频繁,熟系这两个方法的使用是掌握 Java 语言的必要条件。这里总结了重写这两个方法的两点原 阅读全文
posted @ 2020-11-06 16:43 Robothy 阅读(192) 评论(0) 推荐(0) 编辑
摘要:基于 JDK 1.8.0_151 StringBuilder 和 StringBuffer 均继承自 AbstractStringBuilder,而 StringBuilder 在 StringBuffer 之后出现。按照顺序逐个进行分析 AbstractStringBuilder,StringBu 阅读全文
posted @ 2020-10-29 15:28 Robothy 阅读(172) 评论(0) 推荐(0) 编辑
摘要:对于 StringBuilder 和 StringBuffer 的源码会发现,StringBuffer 中有一个叫 toStringCache 的成员变量,用来缓存 toString() 方法返回字符串对应的字符数组,而在 StringBuilder 里面却没有。 先看一下代码。 StringBuf 阅读全文
posted @ 2020-10-29 15:23 Robothy 阅读(1304) 评论(1) 推荐(2) 编辑
摘要:计划任务功能在应用程序及其常见,使用Spring Boot的@Scheduled 注解可以很方便的定义一个计划任务。然而在实际开发过程当中还应该注意它的计划任务默认是放在容量为1个线程的线程池中执行,即任务与任务之间是串行执行的。如果没有注意这个问题,开发的应用可能出现不按照设定计划执行的情况。本文 阅读全文
posted @ 2020-01-02 16:32 Robothy 阅读(1835) 评论(0) 推荐(0) 编辑
摘要:在研究Executors提供的线程池时自然会想到标题这个问题,既然已经有了newFixedThreadPool,为什么还要存在newSingleThreadExecutor这个方法。难道newFixedThreadPool(1)不是只有一个线程(Single Thread)的?本文将通过分析JDK中 阅读全文
posted @ 2019-12-31 16:40 Robothy 阅读(7172) 评论(0) 推荐(1) 编辑
摘要:在执行一系列带有IO操作(例如下载文件),且互不相关的异步任务时,采用多线程可以很极大的提高运行效率。线程池包含了一系列的线程,并且可以管理这些线程。例如:创建线程,销毁线程等。本文将介绍如何使用Java中的线程池执行任务。 1. 任务类型 在使用线程池执行任务之前,我们弄清楚什么任务可以被线程池调 阅读全文
posted @ 2019-12-30 17:07 Robothy 阅读(16213) 评论(1) 推荐(1) 编辑