Java11 新特性
Java 11 是继 Java 8 之后的另一个长期支持(LTS)版本,于 2018 年 9 月 25 日发布,相对于 Java 8 引入了多项重要的语言特性、性能优化、API 改进和模块化支持。以下是对 Java 11 相比 Java 8 的主要新特性和提升的简洁总结,涵盖核心变化: 1. 语言特性改进 局部变量类型推断(var,JEP 323,Java 10 引入) 使用 var 关键字简化局部变量声明,编译器自动推断类型。 示例: var list = new ArrayList<String>(); *// 推断为 ArrayList<String>* var stream = list.stream(); *// 推断为 Stream<String>* Java 8 无此功能,需显式声明类型,代码较冗长。 Lambda 参数的局部变量语法(JEP 323,Java 11 扩展) 允许在 Lambda 表达式中使用 var。 (var x, var y) -> x + y Java 8 的 Lambda 表达式不支持 ...
Java8 新特性
Java 8 的主要新特性,深入每个特性的背景、用法、实际应用场景,并提供代码示例,力求全面且易懂。Java 8(2014年3月发布)是 Java 语言的一次重大升级,引入了函数式编程、现代化 API 和性能优化,极大地提升了开发效率和代码可读性。以下是详细内容: 1. Lambda 表达式 背景: Lambda 表达式是 Java 8 引入的函数式编程核心特性,旨在减少样板代码,允许将行为作为参数传递。之前,Java 处理匿名函数(如匿名内部类)时代码冗长,Lambda 简化了这一过程。 特性: 语法:(参数) -> 表达式 或 (参数) -> { 语句块; }。 无需显式声明参数类型(编译器可推断)。 可访问外部 final 或“有效 final”变量(即未被修改的变量)。 用于实现函数式接口(只有一个抽象方法的接口,如 Runnable, Comparator)。 代码示例: // 传统匿名内部类 Runnable r1 = new Runnable() { @Override public void run() { ...
Cpp Move Semantics
C++的移动语义(Move Semantics)是C++11引入的一项重要特性,它旨在优化资源管理(如动态分配的内存、文件句柄等)的传递方式。通过移动语义,我们可以避免不必要的拷贝操作,从而显著提升性能,尤其在处理大对象或容器时。以下我将从背景、核心概念、实现方式、示例、使用规则到实际益处进行详细说明。 1. 背景:为什么需要移动语义? 在C++98及更早版本中,对象的传递(例如函数参数、返回值)主要依赖拷贝语义(Copy Semantics)。这意味着: 当你返回一个局部对象时,会触发拷贝构造函数,复制所有资源。 对于大对象(如 std::vector 包含海量数据),拷贝开销巨大,甚至可能导致性能瓶颈或异常(如果资源不可拷贝)。 例如,假设有一个类 Resource,管理动态数组: class Resource { private: int* data; size_t size; public: Resource(size_t s) : size(s), data(new int[s]) {} // 分配资源 ~Resou...
golang tips
Go 的 gc Go 的垃圾回收器(Garbage Collector)是 Go 运行时的重要组成部分,它自动管理内存回收,让开发者无需手动释放内存。 核心特性 三色标记清除算法:Go 使用并发三色标记清除算法,在程序运行时并发执行垃圾回收,减少 STW(Stop-The-World)时间 并发标记:标记阶段与用户程序并发执行,只有短暂的停止阶段 分代回收:虽然不是严格分代,但会对新分配的对象给予更多关注 GC 调优参数 参数 说明 GOGC 控制 GC 频率,默认为 100(表示上次 GC 后内存增长 100% 时触发) GODEBUG=gctrace=1 输出 GC 追踪信息 GODEBUG=gctrace=1,schedtrace=1000 同时输出调度器信息 常见问题 GC 开销:高频率 GC 会影响性能,可通过调大 GOGC 减少 GC 频率 内存泄漏:即使有 GC,也要注意闭包、全局变量等导致的内存泄漏 对象池:使用 sync.Pool 复用对象,减少分配和 GC 压力 GC 追踪日志详解 通过 GODEBUG=gctrace=1 ...
Zig 基础语法详解
Zig 是一门现代化的系统级编程语言,由 Andrew Kelley 创建。它的设计理念强调显式优于隐式、编译时代码执行、零成本抽象以及与 C 语言的完美互操作性。本文将全面介绍 Zig 的基础语法。 1. 变量与常量 1.1 变量声明 Zig 使用 var 声明可变变量,使用 const 声明常量: const std = @import("std"); pub fn main() void { // 可变变量 var x: i32 = 10; x = 20; // 可以修改 // 常量 const y: i32 = 30; // y = 40; // 错误:不能修改常量 // 类型推断 var z = 50; // 自动推断为 comptime_int } 1.2 基本数据类型 Zig 提供了丰富的整数和浮点类型: // 有符号整数 const a: i8 = -128; // 8位 const b: i16 = 1000; // 16位 const c: i3...
C++ Alignment
内存对齐不是什么花里胡哨的理论玩意儿,它是硬件决定的铁律。忽略它,你的代码要么崩溃,要么性能烂到家。现代C++给了你工具,让你精确控制对齐,而不是祈祷编译器聪明。 1. 为什么对齐重要? 硬件要求:CPU从内存读取数据必须按特定边界(如4字节、8字节、16字节)。不对齐,访问非法,段错误伺候。 性能杀手:不对齐导致多次内存访问、缓存失效。SIMD指令(SSE/AVX)强制16/32字节对齐,否则零矢量惩罚。 缓存线:现代CPU缓存64字节。不对齐跨缓存线,延迟翻倍。 记住:对齐是优化,不是可选。过度对齐浪费空间,但不足齐更糟。 2. alignof:查询对齐需求 alignof(T) 返回类型T的最小对齐字节数。简单、直观。 #include <print> int main() { std::print("alignof(char): {}\n", alignof(char)); std::print("alignof(int): {}\n", alignof(int)); std::prin...
Java tips
一句话记住 PECS:Producer Extends, Consumer Super 往外读 → extends 往里写 → super 核心概念:箱子的只读/只写 把泛型容器想象成箱子: 通配符 记忆口诀 箱子特性 你能做什么 <? extends T> extends = 读取 里面可能是 T 的任何子类 只能拿出来(读),不能放进去 <? super T> super = 写入 里面可以装 T 的任何父类 只能放进去(写),拿出来只能是 Object <? extends T> - 上界通配符 含义:这个箱子装的是 T 或 T 的子类,但具体是什么不知道。 List<? extends Number> list = new ArrayList<Integer>(); // ✅ 可以读 - 拿出来肯定是 Number Number n = list.get(0); // ❌ 不能写 - 不知道箱子实际是 Integer、Double 还是其他 // list.add(10); // ...
C++特殊成员函数生成规则
什么是特殊成员函数 C++ 中的特殊成员函数是指编译器可以自动生成的六种成员函数: 默认构造函数 T() 析构函数 ~T() 拷贝构造函数 T(const T&) 拷贝赋值运算符 T& operator=(const T&) 移动构造函数 T(T&&) (C++11) 移动赋值运算符 T& operator=(T&&) (C++11) 这些函数之所以"特殊",是因为如果你不显式声明它们,编译器可能会自动为你生成。理解这些函数的生成规则对于编写正确的 C++ 类至关重要。 Rule of Zero/Three/Five 在深入生成规则之前,先了解经典的"规则": Rule of Three 如果类需要自定义以下任一函数,那么它很可能需要同时自定义全部三个: 析构函数 拷贝构造函数 拷贝赋值运算符 这通常意味着类管理着某种资源(如动态内存、文件句柄等)。 Rule of Five (C++11) 扩展 Rule of Three,加入移动语义: 析构函数 拷贝构造函数 拷...
Golang Generics
Go 1.18 引入的泛型(Generics)是 Go 历史上最具革命性的特性。它让代码复用和类型安全达到了新高度。 基本语法 泛型函数 // T 是类型参数,any 是约束(表示任意类型) func Map[T, U any](s []T, f func(T) U) []U { result := make([]U, len(s)) for i, v := range s { result[i] = f(v) } return result } // 使用 ints := []int{1, 2, 3} strings := Map(ints, func(i int) string { return fmt.Sprintf("#%d", i) }) // strings: []string{"#1", "#2", "#3"} 泛型类型 type Stack[T any] struct { items []T...
Rust Std Trait
Rust 的 trait 系统是其类型系统的核心。理解这些标准 trait 不是背文档,而是要明白它们背后的设计意图和实际使用场景。 核心 Trait 分类 Rust 标准库的 trait 可以分为几个层次: 标记 Trait - 编译器特殊处理,无实际方法 派生 Trait - 几乎总是用 #[derive] 自动生成 操作 Trait - 运算符重载和类型转换 迭代 Trait - 迭代器生态系统 I/O Trait - 输入输出抽象 标记 Trait(Marker Traits) 这些 trait 没有方法,纯粹用于向编译器传递类型信息。 Sized - 编译期已知大小 pub trait Sized { // 空 trait,编译器内置实现 } 关键点: 绝大多数类型都是 Sized ?Sized 表示"可能不是 Sized",用于 trait object 和切片 这是隐式 bound,不需要显式写出 // 这两个签名等价 fn foo<T>(x: T) {} fn foo<T: ...







