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

Java String 类笔记

在 Java 中,String是最常用也是最重要的类之一。无论是处理文本、构建日志,还是作为参数传递,String 都无处不在。本文将深入浅出地介绍 String 的常用方法,辨析 String、StringBuffer、StringBuilder 三者的区别,并解释 String 为何设计为不可变。

一、String 的常用方法

String 类提供了丰富的方法来操作字符串。下面列举了最常用的一些方法,并附有简单示例。

1. 获取长度

  • int length():返回字符串的长度(字符个数)。

    String str = "Hello"; System.out.println(str.length()); // 5

2. 判断内容是否相等

  • boolean equals(Object obj):比较两个字符串的内容是否完全相同(区分大小写)。

  • boolean equalsIgnoreCase(String another):忽略大小写比较内容。

    String s1 = "Java"; String s2 = "java"; System.out.println(s1.equals(s2)); // false System.out.println(s1.equalsIgnoreCase(s2)); // true

3. 截取子串

  • String substring(int beginIndex):从指定索引开始截取到末尾。

  • String substring(int beginIndex, int endIndex):截取 [beginIndex, endIndex) 范围内的子串。

    String str = "Hello World"; System.out.println(str.substring(6)); // World System.out.println(str.substring(0, 5)); // Hello

4. 去除首尾空格

  • String trim():去除字符串首尾的空白字符(空格、制表符等)。

    String str = " Hello "; System.out.println(str.trim()); // "Hello"

5. 替换字符或子串

  • String replace(char oldChar, char newChar):替换所有指定字符。

  • String replace(CharSequence target, CharSequence replacement):替换所有指定子串。

    String str = "hello world"; System.out.println(str.replace('l', 'L')); // heLLo worLd System.out.println(str.replace("world", "Java")); // hello Java

6. 判断是否为空字符串

  • boolean isEmpty():判断字符串长度是否为 0。注意:如果字符串为null,调用此方法会抛出 NullPointerException,因此需要先判空。

    String s1 = ""; String s2 = null; System.out.println(s1.isEmpty()); // true // System.out.println(s2.isEmpty()); // 报错!

7. 其他常用方法

  • char charAt(int index):返回指定索引处的字符。

  • int indexOf(String str):返回指定子串第一次出现的索引。

  • String[] split(String regex):根据正则表达式分割字符串。

  • String toLowerCase() / toUpperCase():转换为小写/大写。

  • boolean startsWith(String prefix) / endsWith(String suffix):判断是否以指定前缀/后缀开头/结尾。

二、String、StringBuffer、StringBuilder 的区别与联系

在 Java 中,处理字符串有三种主要的类:StringStringBufferStringBuilder。它们的主要区别在于可变性线程安全性性能

特性StringStringBufferStringBuilder
可变性不可变(Immutable)可变(Mutable)可变(Mutable)
线程安全安全(不可变天然安全)安全(方法使用 synchronized)不安全
性能低(频繁修改产生大量对象)中等(有同步开销)最高(无同步)
适用场景字符串内容不变或很少变化多线程环境下频繁修改单线程环境下频繁修改

1. 为什么要有三个类?

  • String适用于内容固定的场景,例如常量、少量拼接。由于其不可变性,它天然支持常量池,且作为 Map 的键非常安全。

  • StringBuilder是 JDK 1.5 引入的,用于替代 StringBuffer 的单线程版本,性能更高。

  • StringBuffer是早期版本就存在的,线程安全但性能较低,现在主要用于多线程环境。

2. 示例对比

// String 拼接:每次都会生成新对象 String s = "a"; s += "b"; // 实际上创建了新的 String 对象 // StringBuilder 拼接:在原有对象上修改 StringBuilder sb = new StringBuilder("a"); sb.append("b"); // 修改同一个对象

三、String 为什么是不可变的?

String 被设计为不可变类,即一旦创建,其内容就不能被改变。这是出于多方面考虑的精心设计。

1. 源码层面

String 类的源码中,存储字符的数组被声明为private final char value[]

  • final保证了 value 引用不可变(即不能指向另一个数组)。

  • private且没有提供修改数组内容的方法,确保了外部无法修改数组元素。

2. 设计原因

  • 线程安全:不可变对象天生线程安全,可以在多线程环境中自由共享,无需同步。

  • 字符串常量池:JVM 维护了一个字符串常量池,当使用字面量创建字符串时,如果池中已存在相同内容的字符串,则直接返回池中的引用,从而节省内存。如果 String 可变,那么修改一个引用会影响所有引用该字符串的对象,导致混乱。

  • 哈希缓存:String 的哈希码在创建时计算并缓存(通过hash字段),因为不可变,所以哈希值不会改变,这提高了作为 HashMap 键的效率。

  • 安全性:String 常被用作参数(如网络连接、文件路径等),如果可变,可能会被篡改,带来安全风险。

3. 不可变的优点总结

  • 线程安全

  • 支持字符串常量池,节约内存

  • 哈希值可缓存,提高效率

  • 防止参数被篡改,增强安全性

4. 不可变的缺点

  • 频繁修改字符串时会产生大量临时对象,增加 GC 负担。此时应使用 StringBuilder 或 StringBuffer。

四、总结

  • String是不可变、线程安全的,适用于内容不变的场景。

  • StringBuilder是可变、非线程安全的,适用于单线程下频繁修改。

  • StringBuffer是可变、线程安全的,适用于多线程下频繁修改。

  • String 的不可变性带来了安全、高效、节省内存等诸多好处,是 Java 设计中的经典范例。

http://www.jsqmd.com/news/477934/

相关文章:

  • STM32F103+ESP8266 AP模式实战:TCP/UDP通信与网络调试全流程解析
  • 2.0 ARP欺骗攻击(基础版)
  • CosyVoice2-0.5B声音克隆效果展示:四川话/英文/日文多语种真实案例集
  • 【C++】STL详解(三)—vector使用手册:不看你会后悔
  • Hibernate与JPA方言配置:跨数据库开发的统一接口
  • 分布式事务解决方案全景指南:2PC、TCC、SAGA 与 Seata 实战
  • 【Windows】Dify + Ollama/Xinference/GPUStack:一站式AI开发环境搭建指南
  • 硬件设计之电源反接防护:从基础二极管到高效MOS管的选型实战
  • 跨微服务的“数据孤岛”解法:利用声明式 API 构建去中心化的数据联邦
  • SecGPT-14B步骤详解:Chainlit前端对接vLLM服务全流程
  • 从零到精通:UNIX BENCH性能基准测试全流程实战
  • 深入解析HDMI中的EDID与E-EDID:从基础结构到实际应用
  • StructBERT中文句子相似度WebUI实战手册:Websocket实时结果推送实验
  • 01-SA8155P 冷启动EDL模式硬件配置与常见问题解析
  • 泰山派嵌入式Linux驱动开发基础入门篇
  • L2-006 数的遍历(递归经典 ,图论 )
  • Phi-3-Mini-128K部署优化:bfloat16 vs float16显存与推理速度实测对比
  • Qwen3-TTS问题解决:常见部署错误排查,快速搞定语音合成
  • DAMO-YOLO快速体验:开箱即用的赛博朋克AI视觉工具
  • 从零构建认知:数据库系统核心概念与演进脉络深度解析
  • C++与区块链智能合约
  • 全面解读 Databricks:从架构、引擎到优化策略
  • java零碎知识(更新中)
  • Xiaojie雷达之路---毫米波雷达实战解析---相位差在速度测量中的关键作用
  • 基于SGL8022W的MOSS环形触摸灯硬件设计
  • 3步解锁音乐自由:NCMconverter全功能解析与实战指南
  • re2
  • 3步实现空间信息解析:开源号码定位工具全流程指南
  • Llama-3.2V-11B-cot开源可部署价值:替代商业API的私有化视觉推理方案
  • 多维动态规划 技巧(精选答案)