Java 基础:final 关键字 + String 核心原理

张开发
2026/4/20 8:34:21 15 分钟阅读

分享文章

Java 基础:final 关键字 + String 核心原理
一、final 关键字前置知识Java 数据类型分类基本数据类型byte/short/int/long/float/double/char/boolean直接存储数据值引用数据类型类、接口、数组、字符串等存储的是对象的内存地址1. final 修饰变量常量核心规则基本数据类型赋值后值不可修改引用数据类型引用地址不可修改但对象内部内容可修改赋值规则成员变量声明时赋值 / 构造方法赋值 / 代码块赋值三选一局部变量可先声明使用前赋值即可public class FinalDemo { // 1. final修饰成员变量基本数据类型 private final int NUM 10; // 2. final修饰引用数据类型数组 private final int[] ARR {1,2,3}; public void test() { // 基本数据类型常量无法修改值 // NUM 20; 编译报错 // 引用类型地址不能改内部元素可以改 // ARR new int[5]; 编译报错 ARR[0] 100; // 正常运行 // final修饰局部变量使用前赋值即可 final String NAME; NAME Java; // NAME Python; 编译报错 } }2. final 修饰方法特性不能被子类重写但可以被继承和调用作用保护核心业务逻辑防止子类篡改class Parent { // final方法禁止重写 public final void work() { System.out.println(核心工作逻辑); } } class Child extends Parent { // 编译报错无法重写final方法 // public void work() {} }3. final 修饰类特性不能被继承没有子类典型案例String、StringBuffer、Integer等包装类final class FinalClass {} // 编译报错无法继承final类 // class SubClass extends FinalClass {}二、String 类1. 底层数据结构演进JDK 版本底层存储结构优势1.8 及以前private final char value[]兼容所有字符1.9 及以后private final byte value[]节省内存提升性能2. String 不可变性的双重保障类被 final 修饰杜绝继承防止通过子类破坏不可变性底层数组被 private final 修饰final数组地址不可变private外部无法直接访问修改数组元素3. 不可变性的核心优势线程安全多线程环境下无需加锁直接使用字符串常量池复用相同内容的字符串只存一份节约内存三、字符串拼接与可变字符串类1. String 拼接的缺陷String 不可变每次拼接都会创建新的 String 对象效率极低编译期优化纯字面量拼接会直接合并不创建多余对象// 编译期优化直接生成 ab无中间对象 String s1 a b; // 变量拼接会创建新对象效率低 String a a; String b b; String s2 a b;2. 可变字符串类对比核心类名线程安全效率使用场景StringBuilder非安全最高单线程大量拼接StringBuffer安全较低多线程字符串操作代码示例可变字符串拼接public class StringBuildTest { public static void main(String[] args) { // 推荐单线程使用StringBuilder StringBuilder sb new StringBuilder(); sb.append(Hello); sb.append( ); sb.append(Java); String result sb.toString(); System.out.println(result); // Hello Java } }四、常用 API1. String 对象创建机制直接赋值String s abc仅在字符串常量池中创建 1 个对象new 关键字String s new String(abc)堆中创建 1 个对象常量池中不存在则再创建 1 个总共最多 2 个2. 与 equals 的区别符号 / 方法基本数据类型引用数据类型比较值比较内存地址equals()不使用Object比较地址String重写后比较内容String s1 abc; String s2 new String(abc); System.out.println(s1 s2); // false地址不同 System.out.println(s1.equals(s2)); // true内容相同3. String 常用 API基础操作String str helloJava; // 1. 获取指定下标字符 char c str.charAt(2); // l // 2. 获取字符串长度 int len str.length(); // 9字符串处理// 1. 分割字符串 String[] arr a,b,c.split(,); // [a,b,c] // 2. 替换字符 String replaceStr hello.replace(l, x); // hexxo // 3. 截取字符串 [begin, end) String sub str.substring(2, 5); // llo类型转换String str abc; // 字符串转字节数组网络IO、编码常用 byte[] bytes str.getBytes();

更多文章