当前位置: 首页 > news >正文

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

一、final 关键字

前置知识:Java 数据类型分类

  1. 基本数据类型:byte/short/int/long/float/double/char/boolean,直接存储数据值
  2. 引用数据类型:类、接口、数组、字符串等,存储的是对象的内存地址

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 修饰类

  • 特性:不能被继承,没有子类
  • 典型案例:StringStringBufferInteger等包装类
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 不可变性的双重保障

  1. 类被 final 修饰:杜绝继承,防止通过子类破坏不可变性
  2. 底层数组被 private + final 修饰
    • final:数组地址不可变
    • private:外部无法直接访问修改数组元素

3. 不可变性的核心优势

  1. 线程安全:多线程环境下无需加锁,直接使用
  2. 字符串常量池复用:相同内容的字符串只存一份,节约内存

三、字符串拼接与可变字符串类

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 } }

四、常用 API

1. String 对象创建机制

  1. 直接赋值String s = "abc"
    • 仅在字符串常量池中创建 1 个对象
  2. 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();
http://www.cnnetsun.cn/news/1990022.html

相关文章:

  • WarcraftHelper终极指南:5分钟让魔兽争霸3在现代电脑上焕发新生
  • 魔兽争霸III现代优化指南:WarcraftHelper让你的经典游戏焕发新生
  • 3种绝技:免费解锁城通网盘下载加速的终极方案
  • 造相-Z-Image-Turbo开发环境配置:从零开始搭建Python与PyTorch深度学习环境
  • 神经符号计算不是噱头:MIT、DeepMind、华为诺亚联合验证的6项关键指标提升(F1↑37.2%,推理链可追溯性达98.4%)
  • QMCDecode终极指南:3步解锁QQ音乐加密音频,让音乐真正属于你!
  • 3步搞定QQ音乐文件解密:qmcdump完整使用指南
  • Vue 3 组合式 API 到底香在哪?
  • Neo4j 5.x 安装后登录不上?别慌,这可能是默认密码策略在“搞鬼”
  • 如何用一行命令25分钟完成700+飞书文档智能导出:告别手动迁移的终极解决方案
  • 别再手动敲命令了!用Makefile一键搞定VCS+Verdi联合仿真(附完整脚本)
  • 从OID到密码套件:OpenSSL中国密算法的标识与协商实战
  • 别再手动算链路预算了!用 ADS Budget 控件快速评估你的射频系统性能(以超外差接收机为例)
  • Qwen2.5-Coder-1.5B惊艳效果:JSON Schema生成+对应验证代码同步产出
  • Windows Cleaner:完全免费的C盘清理神器,3步解决磁盘空间不足问题
  • LAV Filters架构深度解析:DirectShow媒体解码器实现原理与性能优化指南
  • 手把手教你用Verilog状态机驱动DHT11(附完整代码与SignalTap调试技巧)
  • 避开这3个误区,你的自动泊车路径规划才算入门(附A*算法实战)
  • 戴尔G15散热控制终极指南:免费开源工具轻松解决笔记本过热问题
  • mjpg-streamer进阶玩法:除了看监控,还能怎么用?实现拍照、RTSP推流与API调用
  • 【逆向实战】从算法到驱动:剖析学生机房管理助手7.8的进程隐藏与设备管控机制
  • 哔哩下载姬:专业级B站视频下载与媒体处理完全指南
  • 从零到显示:手把手教你用TC5020A恒流源芯片驱动大尺寸LED点阵屏(附STM32工程)
  • 别再暴力匹配了!用DBoW2词袋模型5分钟搞定ORB-SLAM2回环检测
  • 别让LaTeX投稿坑了你:BSPC、BMC等期刊的隐藏规则与文件提交全解析
  • 30天极限挑战:一人搞定H5/安卓/iOS三端斗地主游戏开发
  • 三、Prometheus企业级告警规则实战:rules.yml配置详解与最佳实践
  • 工业相机“心跳”监测脚本(C++版) 支持海康 / Basler / 堡盟工业相机
  • NLP学习笔记11:序列到序列模型——从 Encoder-Decoder 到 Attention
  • 嵌入式开发选型指南:Cortex-M3/M4项目中,ARM、Thumb、Thumb-2指令集到底该怎么选?