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

Java String 全解析:从底层存储到高效使用

String

  • 一、认识String
    • Strng的原理
    • String的构造
  • 二、字符串常量池(StringTable)
    • 字符串内存存储
  • 三、String对象比较
    • 1. 使用 == 比较
    • 2. 使用 equals() 方法比较
  • 四、常⽤⽅法
    • 获取相关方法
    • 判断相关方法
    • 判断相关方法
    • intern⽅法
  • 五、Java 中 String、StringBuffer 和 StringBuilder 的区别

一、认识String

Strng的原理

查看String源码,我们可以发现:String是引⽤类型,内部并不存储字符串本⾝

String的构造

// 使⽤字符串常量进⾏赋值Strings1="hello world";// 直接new String对象Strings2=newString("hello world");// 使⽤字符数组进⾏构造char[]array={'h','e','l','l','o','w','o','r','l','d'};Strings3=newString(array);//使⽤字节数组构造对象byte[]bytes={97,98,99,100};Strings4=newString(bytes);

二、字符串常量池(StringTable)

在 Java 语言中,字符串的使用非常广泛、频率极高,因此 Java 专门提供了 String 类 来对字符串进行统一的创建、管理和操作。
想要真正理解字符串在内存中的存储方式与底层布局,我们首先需要学习一块专门用于存放字符串的内存区域 ——字符串常量池
为此Java 专门为字符串开辟的一块内存区域,为字符串常量池,目的是为了让相同的字符串可以重复使用,避免重复创建、浪费内存

字符串内存存储

列子:

publicstaticvoidmain(String[]args){Strings1="hello";Strings2="hello";System.out.println(str1==str2);}


说明:

  • str1 存储 “abc” 时,会将 “abc” 存入字符串常量池。
  • str2 再次使用 “abc” 时,会先在常量池中查找;若存在则直接复用,不重复存储。

三、String对象比较

在 Java 中,String 是引用数据类型,比较时分为两种情况:

1. 使用 == 比较

publicstaticvoidmain(String[]args){Stringstr1="abc";Stringstr2="abc";Stringstr3=newString("abc");System.out.println(str1==str2);// true (地址相同)System.out.println(str1==str3);// false (地址不同)}

说明:

  • ==比较的是地址值,不是字符串内容。
  • 只要两个字符串对象指向的内存地址不同,结果就是 false。

equalsIgnoreCase () —— 忽略大小写比较

2. 使用 equals() 方法比较

publicstaticvoidmain(String[]args){Stringstr1="abc";Stringstr2="abc";Stringstr3=newString("abc");System.out.println(str1.equals(str1));// true (内容相同)System.out.println(str1.equals(str2));// true (内容相同)System.out.println(str1.equals(str3));// true (内容相同)}

说明:

  • 比较的是:两个字符串的内容是否完全一致
  • 只要字符、顺序相同,结果就为 true
  • 这是字符串内容比较的标准方式

equals ⽅法:按照字典序⽐较
字典序:字符⼤⼩的顺序
String类重写了⽗类Object中equals⽅法,Object中equals默认按照==⽐较,String重写equals⽅法

也可以使用compareTo ⽅法,与equals不同的是,equals返回的是boolean类型,⽽compareTo返回的是int类型。具体⽐较⽅式:

  1. 先按照字典次序⼤⼩⽐较,如果出现不等的字符,直接返回这两个字符的⼤⼩差值
  2. 如果前k个字符相等(k为两个字符⻓度最⼩值),返回值两个字符串⻓度差值

四、常⽤⽅法

获取相关方法

Stringstr="hello world";// 1. length():获取字符串长度System.out.println(str.length());// 11// 2. charAt(int index):获取指定索引处的字符System.out.println(str.charAt(1));// e// 3. indexOf():获取子串第一次出现的索引System.out.println(str.indexOf("l"));// 2// 4. lastIndexOf():获取子串最后一次出现的索引System.out.println(str.lastIndexOf("l"));// 9

判断相关方法

Stringstr="hello world";// 1. contains():判断是否包含指定子串System.out.println(str.contains("world"));// true// 2. startsWith():判断是否以指定字符串开头System.out.println(str.startsWith("he"));// true// 3. endsWith():判断是否以指定字符串结尾System.out.println(str.endsWith("ld"));// true// 4. isEmpty():判断字符串是否为空System.out.println("".isEmpty());// true

判断相关方法

Stringstr="hello world";// 1. contains():判断是否包含指定子串System.out.println(str.contains("world"));// true// 2. startsWith():判断是否以指定字符串开头System.out.println(str.startsWith("he"));// true// 3. endsWith():判断是否以指定字符串结尾System.out.println(str.endsWith("ld"));// true// 4. isEmpty():判断字符串是否为空System.out.println("".isEmpty());// true

intern⽅法

intern ()是 String 类提供的本地方法,作用是手动把字符串加入字符串常量池,并返回常量池中的对象引用
示例:
在不使用intern⽅法下,比较String

publicclassTest{publicstaticvoidmain(String[]args){Stringstr1=newString("abc");// String str2 = str1.intern();Stringstr3="abc";System.out.println(str1==str3);// false}}

说明:

  • == 比较的是两个引用的内存地址
  • str1 的地址是 0x123456(堆中对象),str3 的地址是 0x112233(常量池对象)
  • 地址不同,所以结果是false
    示例:
    在使用intern⽅法下,比较String
publicclassTest{publicstaticvoidmain(String[]args){Stringstr1=newString("abc");Stringstr2=str1.intern();Stringstr3="abc";System.out.println(str2==str3);// true}}


说明:

  • str1.intern() 会检查常量池中是否已有 “abc”。因为已经存在,所以它直接返回常量池中 “abc” 的地址 0x112233。
  • 所以 str2 和 str3 都指向常量池中的同一个对象,str2 == str3 的结果就是 true。

五、Java 中 String、StringBuffer 和 StringBuilder 的区别

在 Java 中,String、StringBuffer 和 StringBuilder 都是用于处理字符串的类,它们的核心区别体现在可变性和线程安全上

  • String:是不可变类,底层的字符数组被 final 修饰,一旦创建,其内容就无法修改。每次进行拼接、替换等操作,都会生成一个全新的字符串对象,而原对象保持不变。
  • StringBuffer 和 StringBuilder:都是可变类,底层使用一个可扩容的数组来存储字符,修改操作直接在数组上进行,不会频繁创建新对象。两者的区别在于:
    • StringBuffer 的所有公共方法都加了 synchronized 同步锁,是线程安全的,适合在多线程环境下使用。
    • StringBuilder 没有加锁,在单线程环境下性能更高,但不保证线程安全。

注意:String和StringBuilder类不能直接转换。如果要想互相转换,可以采⽤如下原则:
• String变为StringBuilder: 利⽤StringBuilder的构造⽅法或append()⽅法
• StringBuilder变为String: 调⽤toString()⽅法

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

相关文章:

  • 教育行业在线平台如何用Vue3实现课程资料文件夹的秒传与版本回溯?
  • Winform resx文件介绍
  • AI前沿技术日更简报 - 2026-03-07
  • 新手也能上手AI论文平台,千笔 VS 文途AI,专科生写作更轻松!
  • 想找靠谱重庆小程序定制团队?就选这家!
  • 亲测排行真火燃木壁炉厂家分享
  • 微信小程序 python+AI 寻物启事 失物招领认领系统
  • 拖延症福音 9个AI论文网站测评:研究生毕业论文+开题报告写作神器推荐
  • 大数据微信小程序 python+AI 小型超市仓储进销存管理系统
  • 大模型应用开发学习路线:小白程序员必备,收藏这份高效指南!
  • 多模态多语言GLM-4V量化模型[特殊字符]
  • 企业级在线文档:ONLYOFFICE 核心优势深度解读与测评体验
  • AQS的智慧:短暂自旋 + 深度阻塞
  • 分布式鲁棒优化matlab编程:大规模清洁能源接入电网的含风-光-水-火多能源分布鲁棒动态最优...
  • 科学启蒙APP大揭秘!谁家才是孩子的最佳科学导师? - 品牌测评鉴赏家
  • ROS文件解读(package .xml--CMakeLists.txt)
  • 2026年数据恢复行业TOP5揭秘:谁才是性价比之王?
  • 计算机毕业设计之springboot基于Java的研究生导师管理信息系统的设计与实现
  • 航空航天项目如何用HTML5保障卫星数据文件夹分片上传的完整性?
  • 对比一圈后,更贴合继续教育的AI论文网站,千笔ai写作 VS 文途AI
  • 【Openclaw】初始配置
  • 位置服务平台解决的问题、适用人群,以及为何能够成立
  • 基于Cruise平台的P2构型并联混合动力汽车精准仿真模型 该模型集成了再生制动、最优制动力分...
  • JDK,Tomcat下载安装与环境变量配置以及启动IDEA
  • 计算机毕业设计springboot农产品批发市场管理系统 基于SpringBoot的农产品集散中心信息化管理平台 基于SpringBoot的生鲜农贸流通智慧监管系统
  • 项目3 | muduo网络库面试
  • 本期分享三家宝藏建站公司:需要搭建企业网站看过来
  • 2026NMN 行业标杆:W + 端粒塔凭硬核实力领跑,实测效果获高度认可 - 速递信息
  • 性别识别 _ VIT模型实现98.7%准确率的人脸性别分类检测[特殊字符][特殊字符]
  • ABC448