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

java基础:String字符串的用法详解

目录

      • 一、String的本质
      • 二、创建String的3种方式
      • 三、核心方法详解
        • 字符串比较
        • 字符串查找
        • 字符串操作
        • 类型转换
      • 四、性能优化技巧
      • 五、String vs StringBuilder vs StringBuffer
      • 六、字符串比较示例
      • 七、底层原理进阶

String 是Java基础中非常重要的一个类,也是使用最频繁的类之一,它代表一个不可变的字符序列。以下是Java中 String类的用法详解:


一、String的本质

  1. 不可变性(Immutability)

    • 字符串一旦创建,内容不可修改
    • 所有修改操作(如concat()/replace())都返回新对象
    String s = "Hi";
    s.concat(" Java");  // 返回新对象"Hi Java",原s仍为"Hi"
    
  2. 存储机制

    • 字符串常量池(String Pool):位于堆内存,避免重复创建
    String s1 = "Fly";      // 存入常量池
    String s2 = "Fly";      // 复用常量池对象(s1 == s2)
    String s3 = new String("Fly"); // 强制在堆中创建新对象(s1 != s3)
    

二、创建String的3种方式

方式内存位置是否复用常量池
String s = "abc";常量池
new String("abc")堆内存否(新对象)
new String(char[])堆内存

三、核心方法详解

字符串比较
// 1. 内容相等比较(重要!)
"java".equals("Java");      // false(区分大小写)
"java".equalsIgnoreCase("Java"); // true// 2. 字典序比较
"apple".compareTo("banana"); // 返回负数(a在b前)
"zoo".compareTo("apple");    // 返回正数// 3. 地址比较(慎用)
String s1 = new String("Hi");
String s2 = "Hi";
s1 == s2; // false(地址不同)
字符串查找
String text = "Java编程指南";// 1. 索引查找
text.indexOf("编程");     // 返回4(首次出现位置)
text.lastIndexOf('a');   // 返回3(最后出现位置)// 2. 前缀/后缀检查
text.startsWith("Java"); // true
text.endsWith("指南");    // true// 3. 包含判断
text.contains("编程");    // true
字符串操作
// 1. 截取子串
"HelloWorld".substring(5);     // "World"(从索引5开始)
"HelloWorld".substring(0,5);   // "Hello"([0,5)区间)// 2. 拼接(实际开发用"+"更常见)
String.join("-", "A","B","C"); // "A-B-C"// 3. 替换
"abac".replace('a', 'X');      // "XbXc"
"Java".replace("av", "**");    // "J**a"// 4. 大小写转换
"Java".toUpperCase();          // "JAVA"
"JAVA".toLowerCase();          // "java"// 5. 去除空白
"  Hello  ".trim();            // "Hello"(去首尾空格)
"  Hi  ".strip();              // "Hi"(JDK11+,支持全角空格)
类型转换
// 1. 其他类型 → String
String.valueOf(123);       // "123"
String.valueOf(true);      // "true"// 2. String → 数组
char[] chars = "Java".toCharArray(); // {'J','a','v','a'}
byte[] bytes = "Java".getBytes();    // UTF-8字节数组// 3. String → 数字
int num = Integer.parseInt("100");   // 100
double d = Double.parseDouble("3.14"); // 3.14

四、性能优化技巧

  1. 避免循环内拼接字符串

    //  低效(每次循环创建新对象)
    String result = "";
    for (int i=0; i<1000; i++) {result += i;
    }//  使用StringBuilder(减少对象创建)
    StringBuilder sb = new StringBuilder();
    for (int i=0; i<1000; i++) {sb.append(i);
    }
    String result = sb.toString();
    
  2. 复用常量池对象

    • 优先使用字面量赋值:String s = "text";

    • 调用intern()方法主动入池:

      String s1 = new String("Hi").intern(); // 指向常量池对象
      String s2 = "Hi";
      s1 == s2; // true
      

五、String vs StringBuilder vs StringBuffer

特性StringStringBuilderStringBuffer
可变性不可变可变可变
线程安全(天然安全)(非线程安全)(synchronized)
性能修改操作慢修改操作快修改操作中等
使用场景常量字符串单线程字符串操作多线程字符串操作

六、字符串比较示例

String s1 = new String("Hi").intern(); // 指向常量池对象
String s2 = new String("Hi");
String s3 = "Hi";
System.out.println("s1 == s2 : " + (s1 == s2));
System.out.println("s1 == s3 : " + (s1 == s3));
System.out.println("s2 == s3 : " + (s2 == s3));

运行结果
在这里插入图片描述

intern()方法可以将内容放入常量池(如果池中没有),并返回池中对象的引用
s2是在堆中创建了一个新的String对象
s3指向常量池中的对象,固 s1==s3为true

七、底层原理进阶

  1. Java 9+的存储优化
    • 旧版:char[](每个字符2字节)
    • 新版:`byte[] +编码标记**(拉丁字符用1字节存储,节省内存)
  2. 字符串常量池位置
    • JDK7前:位于永久代(PermGen)
    • JDK7+:移至堆内存(避免永久代溢出)

http://www.dtcms.com/a/520171.html

相关文章:

  • 唐河网站制作品牌推广文案
  • VSCode/PyCharm解决“无法加载文件 ***\WindowsPowerShell\profile.ps1,因为在此系统上禁止运行脚本”
  • 做设计的需要网站下载素材吗wordpress菜单添加图标
  • HTML游戏开发:使用视频作为特效自动播放的方法
  • 单芯片USB拓展坞+百兆网卡+读卡器+100W快充芯片CH336F
  • 考研数学——一元函数微分学篇
  • MATLAB基于改进灰色聚类的装备技术风险评估方法
  • 最佳经验网站wordpress大学百度云
  • AI服务器工作之显卡测试
  • C++仿mudo库高并发服务器项目:Socket模块
  • 找人帮忙做网站吉林市百姓网免费发布信息网
  • HTTP与HTTPS协议区别及应用场景
  • HTTP 206状态码:部分内容传输核心技术
  • Vue3 -- 第一个vue项目
  • 收钱码合并的网站怎么做电商网站产品模块
  • Vitis HLS 学习指南与实践教程
  • FBH公司开发了200 MHz GaN降压变换器模块
  • SpiderDemo题解系列——第3篇:调试拦截与非对称加密挑战 — JS逆向调试实战(第23题)
  • 机器学习之数字识别
  • 网站开发群安阳网站设计多少钱
  • 7. Prometheus告警配置-alertmanger
  • 自动签到之实现掘金模拟签到
  • 【探寻C++之旅】C++11 深度解析:重塑现代 C++ 的关键特性
  • 【unity】运行时加载并修改ScriptableObject类型资源对象的值会怎样
  • Spring Boot 实现 DOCX 转 PDF(基于 docx4j 的轻量级开源方案)
  • 服装企业官方网站建设网站运营收入
  • Spring Boot Actuator深度解析与实战
  • 如何做 行业社交类网站网站 建设在作用
  • 线程3 JavaEE(阻塞队列,线程池)
  • K8s中,deployment 是如何从 yaml 文件最终部署成功 pod 的