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

Java中String字符串

文章目录

  • java中String字符串
    • 1. 不可变性(Immutable)
      • 示例
      • 原理
    • 2. 字符串常量池(String Pool)
      • 示例
        • intern () 方法
    • 3. 字符串拼接
        • 常用方式
    • 4. 常用方法
    • 5. 字符串格式化
      • String.format()
      • 文本块(Java 15+)
    • 6. 编码与解码
      • 字符串转字节数组
      • 字节数组转字符串
    • 7. 常见面试问题
      • `String` vs `StringBuilder` vs `StringBuffer`
      • `==` vs `equals()
      • 字符串常量池的作用
    • 总结

java中String字符串

在 Java 中,String是一个非常重要且特殊的类,用于表示不可变的字符序列。以下是关于String的核心特性和常见用法:

1. 不可变性(Immutable)

String对象一旦创建,其值不能被修改。任何对String的操作(如concat()substring())都会返回一个新的String对象。

示例

String s1 = "Hello";
s1 = s1 + " World"; // 实际上创建了新的String对象 "Hello World"

原理

String内部使用final char[]存储字符,且类被声明为final,禁止被继承和修改。

2. 字符串常量池(String Pool)

Java 为了节省内存,会将字面量字符串放入常量池。相同内容的字面量会复用同一个对象。

示例

String s1 = "Hello"; // 常量池创建 "Hello"
String s2 = "Hello"; // 复用常量池中的对象
System.out.println(s1 == s2); // true(引用相同)String s3 = new String("Hello"); // 堆中创建新对象
System.out.println(s1 == s3); // false(引用不同)
System.out.println(s1.equals(s3)); // true(值相同)
intern () 方法

手动将String对象加入常量池:

String s4 = new String("Java").intern(); // 将堆中的"Java"加入常量池
System.out.println(s4 == "Java"); // true

3. 字符串拼接

常用方式
  • +操作符:编译时优化为StringBuilder

    String result = "Hello" + " " + "World"; // 编译后等价于:
    // String result = new StringBuilder("Hello").append(" ").append("World").toString();
    
  • StringBuilder:非线程安全,性能高(推荐循环拼接)。

    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < 10; i++) {sb.append(i);
    }
    String result = sb.toString(); // "0123456789"
    
  • StringBuffer:线程安全(内部方法加synchronized),性能较低。

4. 常用方法

String str = "Hello World";// 长度
int length = str.length(); // 11// 子串
String sub = str.substring(6); // "World"// 查找
int index = str.indexOf("World"); // 6// 替换
String replaced = str.replace("World", "Java"); // "Hello Java"// 分割
String[] parts = str.split(" "); // ["Hello", "World"]// 大小写转换
String upper = str.toUpperCase(); // "HELLO WORLD"// 去除首尾空格
String trimmed = "  abc  ".trim(); // "abc"// 判断开头/结尾
boolean startsWith = str.startsWith("Hello"); // true// 比较
boolean equals = str.equals("Hello World"); // true
boolean equalsIgnoreCase = str.equalsIgnoreCase("HELLO WORLD"); // true

5. 字符串格式化

String.format()

String name = "Alice";
int age = 25;
String formatted = String.format("Name: %s, Age: %d", name, age);
// "Name: Alice, Age: 25"

文本块(Java 15+)

String html = """<html><body><p>Hello, World!</p></body></html>
""";

6. 编码与解码

字符串转字节数组

String str = "你好";
byte[] utf8Bytes = str.getBytes("UTF-8"); // UTF-8编码
byte[] gbkBytes = str.getBytes("GBK");    // GBK编码

字节数组转字符串

String utf8Str = new String(utf8Bytes, "UTF-8");
String gbkStr = new String(gbkBytes, "GBK");

7. 常见面试问题

String vs StringBuilder vs StringBuffer

  • String:不可变,适合少量拼接。
  • StringBuilder:可变,非线程安全,适合单线程大量拼接。
  • StringBuffer:可变,线程安全,适合多线程大量拼接。

== vs `equals()

  • ==:比较引用地址。
  • equals():比较字符串内容。

字符串常量池的作用

减少内存开销,避免重复创建相同内容的字符串。

总结

String的不可变性保证了线程安全和字符串常量池的实现,但频繁拼接会产生大量临时对象,此时应使用StringBuilderStringBuffer。理解字符串常量池和编码问题有助于写出高效且健壮的代码。

http://www.xdnf.cn/news/413335.html

相关文章:

  • 【蓝桥杯嵌入式】【模块】二、LED相关配置及代码模板
  • 关于输入法重码率的计算
  • web 自动化之 Unittest 应用:测试报告装饰器断言
  • 基于大模型研究技术方案清单
  • 【markdown】介绍如何在markdown中绘制流程图
  • 在嵌入式调试中IAR提示Fatal error: CPU did not power up Session aborted!怎么回事?怎么解决?
  • C++中类中const知识应用详解
  • PyCharm历史版本下载说明
  • Java大师成长计划之第20天:Spring Framework基础
  • Qt/C++面试【速通笔记九】—视图框架机制
  • EHS 安全管理有效落地,五步实施方法解析
  • 基于SpringBoot的博客系统测试报告
  • slackel系统详解
  • MACH-ETH:汽车网络接口的卓越之选
  • steam OS详细讲解
  • yolov5s.pt这类的后续是pt的文件用什么软件可以打开看
  • STM32F103_LL库+寄存器学习笔记12.1 - 串口DMA高效收发实战:引入ringbuffer结构
  • STM32实现循环队列
  • 系统架构-通信系统架构设计
  • 如何理解“数组也是对象“——Java中的数组
  • old kali网站下载链接爬取-Kali linux 全部版本镜像下载--Index of /kali-images
  • 基于STM32、HAL库的DPS368XTSA1气压传感器 驱动程序设计
  • [Windows] Honeyview V5.53
  • 深度解析Crawl4AI:面向大模型的新一代智能爬虫
  • 2025系统架构师考试押题总结
  • 学习黑客Windows 任务管理器详解
  • 解决WSL、Ubuntu的.ico图标不正确显示缩略图
  • VBA会被Python代替吗
  • LeetCode:513、找树左下角的值
  • 滑动窗口/单调队列