Java 模块系统
Java 模块系统概述 Java 模块系统(Java Platform Module System,简称 JPMS)是 Java 9(2017 年发布)引入的一项重大特性,也被称为 Project Jigsaw。该系统旨在解决 Java 早期版本中类路径(classpath)管理的痛点,如 JAR Hell(依赖冲突)、模块化不足和封装性弱等问题。通过模块化,Java 应用可以更好地组织代码、提高安全性、减少依赖并提升性能。下面我将详细解释 Java 模块的核心概念、语法、用法以及优势与注意事项。 1. 什么是 Java 模块? 基本定义:模块(Module)是 Java 中一种新的代码组织单位,它是一组相关包(packages)的集合,加上一个模块描述文件(module-info.java)。模块可以明确定义其依赖的其他模块、导出的包(exposed packages),以及对反射的访问权限。 与包(Package)的区别:包是命名空间,用于组织类;模块是包的更高层抽象,用于组织应用或库的整体结构。模块可以包含多个包,但一个包只能属于一个模块。 模块类型: 命名模块(Nam...
Cpp Asio
Asio 是一个跨平台的 C++ 库,用于网络和低级 I/O 编程,提供了一套异步操作的框架。Boost.Asio 是其最知名的版本,但独立(standalone)版本的 Asio 允许在不依赖 Boost 的情况下使用。 1. Asio 库概述 Standalone Asio 是一个轻量级的网络编程库,设计目标是提供高效、异步的 I/O 操作。它支持以下功能: 网络编程:TCP、UDP、ICMP 等协议的客户端和服务器开发。 异步 I/O:通过回调、协程(C++20 起支持)或 Future/Promise 模型处理异步操作。 跨平台:支持 Windows、Linux、macOS 等操作系统。 低级 I/O:文件操作、串口通信、定时器等。 与 Boost.Asio 相比,standalone Asio 不依赖 Boost 的其他组件(如 Boost.System),因此更轻量,适合需要减少依赖的场景。 2. 安装与配置 下载 Standalone Asio 可从 GitHub 或其官方网站(think-async.com)获取最新版本。下载后,解压到项目目录。 配置 头文...
sort summary
好的,这里为您总结了 C++、Java、Python、Golang 和 Rust 这些主流语言的排序方法,特别是自定义排序的实现方式。 概述 语言 内置排序方法 主要特点 自定义排序核心 C++ std::sort 非常高效,通常是 IntroSort 函数对象 (Functor)、Lambda、普通函数 Java Arrays.sort(), Collections.sort() 对象使用 TimSort,基础类型使用快速排序 Comparator 接口(Lambda 或匿名类) Python sorted(), list.sort() 稳定,使用 TimSort key 函数 或 cmp 函数(老式,不推荐) Golang sort.Sort(), sort.Slice() 使用快速排序 实现 sort.Interface 或使用 sort.Slice 与 Less 函数 Rust slice.sort(), vec.sort() 稳定,使用归并排序(TimSort 变种) 闭包 (Closure) 传递给 sort_by 或实现 Ord/Par...
Java Concurrency
Java的线程是Java并发编程的核心,允许程序同时执行多个任务。 虚拟线程相关内容 1. 线程概述 线程(Thread)是操作系统能够进行运算调度的最小单位。在Java中,线程是JVM(Java虚拟机)管理的轻量级执行单元,多个线程共享同一进程的内存空间(如堆、方法区),但每个线程有自己的栈空间(如局部变量和方法调用栈)。 Java通过java.lang.Thread类和java.lang.Runnable接口提供线程支持。Java的线程模型基于操作系统的原生线程,依赖于底层操作系统的线程实现。 2 线程的创建 Java中创建线程主要有以下几种方式: 2.1 继承Thread类 通过继承Thread类并重写run()方法来定义线程的执行逻辑。 class MyThread extends Thread { @Override public void run() { System.out.println("Thread running: " + Thread.currentThread().getName()); ...
Java Stream
Java Stream 是 Java 8 引入的一个功能强大的工具,用于处理集合数据(如 List、Set 等)或数组的声明式操作。它提供了一种函数式编程风格的方式,让开发者能够以简洁、可读性高且高效的方式处理数据。Stream 的核心思想是将数据操作分为一系列中间操作和终端操作,通过链式调用实现复杂的处理逻辑,同时支持并行处理以提高性能。 1. Stream 的核心概念 Stream 的设计灵感来源于函数式编程,强调数据的不可变性和声明式操作。以下是 Stream 的核心概念: Stream(流): Stream 是一个抽象的数据处理管道,表示数据的序列,但并不存储数据本身。 Stream 可以看作是对数据源(如集合、数组)的“视图”,支持对其进行操作(如过滤、映射、排序等)。 Stream 不修改原始数据源,操作的结果通常是生成新的 Stream 或最终的结果。 数据源: Stream 的数据源可以是集合(Collection,如 List、Set)、数组、文件、I/O 通道或其他数据结构。 常见创建 Stream 的方式:List<String> li...
Java lambda
Java Lambda 表达式是 Java 8 引入的一项重要特性,用于简化函数式编程的实现。它允许开发者以更简洁的方式编写代码,特别是在处理集合操作、事件监听或函数式接口时。 1. 什么是 Lambda 表达式? Lambda 表达式是一种匿名函数,它提供了一种简洁的方式来表示函数式接口(Functional Interface)的实例。函数式接口是只包含一个抽象方法的接口,例如 Runnable、Comparator 或 Function。 Lambda 表达式的核心目的是: 简化代码:减少样板代码(如匿名内部类的冗长写法)。 支持函数式编程:使 Java 更适合处理函数式编程范式,例如流式操作(Stream API)。 2. Lambda 表达式的语法 Lambda 表达式的基本语法如下: (参数列表) -> { 方法体 } 参数列表:可以为空,也可以包含多个参数。如果只有一个参数,可以省略括号。 箭头操作符(->):分隔参数列表和方法体。 方法体:包含执行逻辑,可以是单行表达式或多行语句块。如果是单行表达式,可以省略大括号和 return ...
Java Virtual Threads
Java 虚拟线程(Virtual Threads)是 Java 19 引入的一项特性,并在 Java 21 成为正式特性。虚拟线程是轻量级的线程实现,旨在提高 Java 程序在高并发场景下的性能和可扩展性,特别适合处理大量并发任务(如 I/O 密集型任务)。它通过将用户线程与平台线程(OS 线程)解耦,极大降低了线程创建和管理的开销。 一、虚拟线程的核心概念 什么是虚拟线程? 虚拟线程是 JVM 管理的轻量级线程, 不直接绑定到操作系统线程(称为平台线程)。 虚拟线程由 JVM 的调度器管理, 运行在少量的平台线程(称为载体线程, carrier threads)上,JVM 通过协程机制在平台线程上多路复用大量虚拟线程。 一个 Java 应用程序可以创建数百万个虚拟线程,而不会导致显著的性能开销。 虚拟线程 vs 平台线程 特性 虚拟线程 平台线程 资源占用 轻量级, 内存占用低(KB 级别,一般2KB) 重量级,内存占用高(MB 级别) 创建成本 低, 几乎无限制(可创建百万级) 高,受限于 OS 资源 调度方式 JVM 调度, 基于协程 O...
C++ optional & expected
在 C++ 中,std::optional 和 std::expected 是两个用于处理可能不存在的值或可能失败的操作的现代工具,它们在 C++17 和 C++23 中分别引入,提供了更安全和表达力更强的错误处理机制。以下是对它们的详细说明,包括定义、用途、特性、用法、差异以及实际代码示例。 1. std::optional 定义 std::optional 是 C++17 引入的标准库组件,定义在 <optional> 头文件中。它表示一个可能存在或不存在的值,类似于“可能有值,也可能为空”的概念。std::optional<T> 可以包含类型为 T 的值,或者为空(std::nullopt)。 用途 用于表示函数可能返回一个值,也可能不返回任何值。 替代传统的“特殊值”(如 nullptr、-1 等)来表示无值的情况,增强代码的可读性和类型安全性。 常用于需要明确区分“无值”和“有值”的场景,如查找操作、初始化状态等。 关键特性 类型安全:std::optional 明确表示值是否有效,避免了隐式的“魔法值”问题。 值语义:std::optio...
C++ RTTI
下面把 C++ 的 RTTI(Run-Time Type Information,运行时类型信息)系统一次讲清楚,覆盖原理、用法、细节与坑,并给出精简示例。内容“精准”,不绕弯。 什么是 RTTI RTTI 是编译器在多态场景下,为对象保留其动态类型信息,以便在运行时查询和安全转换。标准接口主要有两件事: typeid:拿到对象(或类型)的类型描述 std::type_info。 dynamic_cast:做安全的向下转型(downcast)/交叉转型(cross-cast)。 触发条件:多态类(类里至少有一个 virtual 函数)。非多态类也能用 typeid(T) 或对非多态表达式用 typeid(expr)(这时只给静态类型)。 两个核心工具 1. typeid 语义: typeid(T):返回编译期类型 T 的 type_info(无运行期开销)。 typeid(expr): 若 expr 是多态类型的左值/泛左值,结果是动态类型。 否则结果是静态类型,不求值 expr(无副作用)。 返回 const std::type_info&...
C++ Const Pointer
在 C/C++ 中,const 关键字与指针结合使用时,会产生不同的效果,主要是 const 指针 和 指向 const 的指针 两种情况。这两者在语法、含义和使用场景上有着明显的区别。以下是对这两种指针的详细讲解: 1. 指向 const 的指针 定义:指向 const 对象的指针,表示指针指向的内存中的数据是只读的(不能通过该指针修改)。但指针本身的值(即指向的地址)是可以改变的。 语法: const T *ptr; // 或 T const *ptr; T 是数据类型(如 int, char 等)。 const 修饰的是 *ptr,表示指针指向的内容是常量。 这种指针可以指向任何 T 类型的数据(包括非 const 数据),但通过该指针无法修改指向的数据。 特点: 不能通过指针修改指向的数据:*ptr = value 会导致编译错误。 指针本身可以改变:可以让 ptr 指向其他地址。 可以指向非 const 数据:即使指向非 const 数据,也只能以只读方式访问。 示例代码: #include <stdio.h> int main() { ...





