当前位置: 首页 > 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。理解字符串常量池和编码问题有助于写出高效且健壮的代码。

相关文章:

  • STM32实现循环队列
  • AutoDL租用服务器教程
  • uniapp引入七鱼客服微信小程序SDK
  • cache state
  • 自动化测试与功能测试详解
  • 杨校老师项目之基于SSM与JSP的鲜花销售系统-【成品设计含文档】
  • 趣谈Ai各种模型算法及应用
  • 大模型剪枝技术介绍
  • 深度策略梯度算法PPO
  • 基于STM32、HAL库的BMP581气压传感器 驱动程序设计
  • git如何将本地 dev 分支与远程 dev 分支同步
  • Excel表的导入与导出
  • 浙江大学 deepseek 公开课 第三季 第3期 - 陈喜群 教授 (附PPT下载) by 突破信息差
  • 【C++】cout的格式输出
  • 特斯拉AI布局:从自动驾驶到人形机器人的野心
  • (网络)应用层协议-HTTPS
  • 想实现一个基于MCP的pptx生成系统架构图【初版实现】
  • 前端面试宝典---webpack面试题
  • 链表面试题7之相交链表
  • bunsenlabs系统详解
  • 广西壮族自治区党委副书记、自治区政府主席蓝天立接受审查调查
  • 河南信阳:对违规吃喝问题不遮丑不护短,露头就打、反复敲打
  • 华东政法与复旦上医签署合作框架协议,医学与法学如何交叉融合?
  • 苏轼“胡为适南海”?
  • 美国务院批准向土耳其出售导弹及相关部件,价值3.04亿美元
  • 微软将在全球裁员6000人,目标之一为减少管理层