Java字符串入门:API入门+String类核心

🏠个人主页:黎雁

🎬作者简介:C/C++/JAVA后端开发学习者

❄️个人专栏:C语言数据结构(C语言)EasyXJAVA游戏规划程序人生

✨ 从来绝巘须孤往,万里同尘即玉京

文章目录

  • [✨Java字符串入门:API入门+String类核心|从底层原理到实战用法 吃透字符串基础 ✅](#✨Java字符串入门:API入门+String类核心|从底层原理到实战用法 吃透字符串基础 ✅)
    • [📌 文章摘要](#📌 文章摘要)
      • [🕒 阅读时长:约18分钟](#🕒 阅读时长:约18分钟)
      • [✅ 适用人群 & 阅读重点](#✅ 适用人群 & 阅读重点)
    • [📖 知识回顾(入门铺垫)](#📖 知识回顾(入门铺垫))
    • [一、API基础认知 📚 解锁Java预定义工具的正确姿势](#一、API基础认知 📚 解锁Java预定义工具的正确姿势)
      • [1.1 什么是API?(入门必懂)](#1.1 什么是API?(入门必懂))
      • [1.2 API帮助文档:Java开发者的字典 📖](#1.2 API帮助文档:Java开发者的字典 📖)
        • [✔ API帮助文档使用步骤(标准化流程)](#✔ API帮助文档使用步骤(标准化流程))
    • [二、String类核心精讲 🔥 字符串的本质与核心用法](#二、String类核心精讲 🔥 字符串的本质与核心用法)
    • [三、核心考点提炼 📝 笔试/面试必记](#三、核心考点提炼 📝 笔试/面试必记)
      • [✅ 核心考点1:String的不可变特性](#✅ 核心考点1:String的不可变特性)
      • [✅ 核心考点2:串池(StringTable)规则](#✅ 核心考点2:串池(StringTable)规则)
      • [✅ 核心考点3:比较规则](#✅ 核心考点3:比较规则)
      • [✅ 核心考点4:常用方法易错点](#✅ 核心考点4:常用方法易错点)
      • [✅ 经典面试题解析](#✅ 经典面试题解析)
    • [✍️ 写在最后](#✍️ 写在最后)
    • [💡 下期预告](#💡 下期预告)

✨Java字符串入门:API入门+String类核心|从底层原理到实战用法 吃透字符串基础 ✅

📌 文章摘要

本文是Java字符串系列第一篇核心内容,从API基础概念切入,系统讲解String类的核心知识点:包括String类的本质特性、多种创建方式、内存存储逻辑(串池)、字符串比较规则及高频实用方法(charAt、length、截取、替换)。全文结合底层原理分析+实战代码示例,拆解字符串"不可变"特性、串池复用机制、==equals的核心区别等易混淆点,内容由浅入深、考点明确、注释详尽。零基础可快速掌握String类基础用法,在校生能吃透笔试高频考点,入门者可夯实字符串底层认知,是攻克Java字符串基础的必备篇章。

🕒 阅读时长:约18分钟

✅ 适用人群 & 阅读重点

▫️ Java零基础入门者 :重点看String类创建方式、常用方法的代码示例与注释,跟着敲写代码,掌握字符串基础操作。

▫️ 在校学生/笔试备考者 :吃透字符串内存分析(串池)、==equals区别、编译期优化等面试/笔试高频考点

▫️ 开发入门夯实基础者 :聚焦String类"不可变"特性的底层逻辑,理解为何拼接字符串建议用StringBuilder。

▫️ 字符串基础薄弱者 :重点看知识点拆解与示例,理清"直接赋值"与"new创建"的内存差异,打通基础认知闭环。

▫️ 复习巩固者:直接看「核心考点提炼+面试题解析」,快速梳理String类核心考点,查漏补缺。

📖 知识回顾(入门铺垫)

在Java基础语法学习阶段,我们已经接触过字符串的简单使用(如直接赋值String s = "abc"),但并未深入理解其底层原理与核心特性。字符串是Java开发中使用频率最高的数据类型之一,从控制台输入输出、业务数据处理到接口参数传递,几乎所有场景都离不开字符串操作。

而要真正掌握字符串,首先要理解Java提供的字符串相关API(Application Programming Interface)------这些是JDK预定义的工具类,能帮我们高效实现字符串的创建、比较、截取、替换等操作。本篇作为字符串系列开篇,先从API基础概念入手,再深入剖析核心的String类,为后续学习StringBuilderStringJoiner打下坚实基础。

一、API基础认知 📚 解锁Java预定义工具的正确姿势

1.1 什么是API?(入门必懂)

💡 API(Application Programming Interface) :中文译为"应用程序编程接口",可以简单理解为:别人已经写好的、可直接调用的功能代码

你无需关心这些代码的底层实现细节(比如字符串如何存储、比较逻辑如何编写),只需要学习"如何调用"就能实现对应的功能。比如要比较两个字符串的内容,直接调用equals()方法即可,不用自己写循环对比每个字符。

Java API :特指JDK中提供的所有Java类(如StringScannerArrayList等),这些类封装了底层实现,我们只需调用其方法/属性,就能快速实现各种功能,是Java开发的核心工具库。

1.2 API帮助文档:Java开发者的字典 📖

API帮助文档是查询、学习Java API的官方工具(常用版本如JDK_API_1_6_zh_CN.CHM),能帮我们快速找到类的包路径、构造方法、成员方法及使用说明。

⚠️ 小提示:中文帮助文档多为机器翻译,部分术语可能不够精准,但不影响核心用法理解。

✔ API帮助文档使用步骤(标准化流程)
  1. 打开文档 → 点击「显示」→ 选择「索引」;
  2. 在输入框中输入要查询的类名(如String)→ 点击「显示」;
  3. 查看类的包路径 (如Stringjava.lang包下,无需导包)和类的描述(核心特性);
  4. 查看类的构造方法 (如何创建对象)和成员方法(可调用的功能)。

核心技巧:重点关注方法的「参数类型」「返回值类型」「方法说明」,这是正确调用的关键。

二、String类核心精讲 🔥 字符串的本质与核心用法

2.1 String类概述(必背核心)

  • java.lang.String类代表字符串,Java程序中所有双引号包裹的字符串文字 (如"abc""得鹿梦鱼")都是String类的对象;
  • java.lang是Java核心包,使用该包下的类无需手动导包
  • ✨ 最关键特性:字符串的内容一旦创建就不可改变(对象在创建后,字符序列不能被修改)。
示例:理解字符串不可变特性
java 复制代码
// 示例1:字符串拼接
String name = "王哥";
String newName = "得鹿梦鱼";
System.out.println(name + newName); // 输出:王哥得鹿梦鱼
// 说明:name本身还是"王哥",newName还是"得鹿梦鱼",拼接只是生成了新字符串,原字符串未变

// 示例2:变量引用变更
String name = "王哥";
name = "得鹿梦鱼";
// 说明:不是"王哥"这个字符串对象变了,而是name变量的引用从"王哥"指向了新的字符串对象"得鹿梦鱼"

核心总结:字符串对象本身不可变,可变的是指向字符串的变量引用。

2.2 创建String对象的两种核心方式(笔试高频)

创建String对象有两种核心方式,对应不同的内存逻辑,是笔试/面试的必考考点:

✔ 方式一:直接赋值(推荐,复用串池对象)

语法:String 变量名 = "字符串内容";

示例:String s1 = "得鹿梦鱼";

✔ 方式二:通过new关键字调用构造方法

String类提供了多个构造方法,常用的如下:

构造方法 说明 适用场景
public String() 创建空白字符串(无任何内容) 临时存储空字符串
public String(String original) 根据传入的字符串创建新对象 复制已有字符串(极少用)
public String(char[] chs) 根据字符数组创建字符串 需要修改字符串内容时(字符数组可变)
public String(byte[] chs) 根据字节数组创建字符串 网络传输/文件读取时(字节转字符串)
完整示例代码:
java 复制代码
public class StringCreateDemo {
    public static void main(String[] args) {
        // 方式1:直接赋值
        String s1 = "abc";
        System.out.println(s1); // 输出:abc

        // 方式2:调用构造方法
        // 2.1 空参构造:创建空白字符串
        String s2 = new String();
        System.out.println("@" + s2 + "!"); // 输出:@!(中间无内容)

        // 2.2 传入字符串:创建新的字符串对象
        String s3 = new String("abc");
        System.out.println(s3); // 输出:abc

        // 2.3 传入字符数组:灵活构建字符串(字符数组可变)
        char[] chs = {'a', 'b', 'c', 'd'};
        String s4 = new String(chs);
        System.out.println(s4); // 输出:abcd

        // 2.4 传入字节数组:字节转字符串(网络/文件场景)
        byte[] bytes = {97, 98, 99, 100}; // ASCII码:97→a,98→b,99→c,100→d
        String s5 = new String(bytes);
        System.out.println(s5); // 输出:abcd
    }
}

2.3 String内存分析:串池(StringTable)核心逻辑

要理解String的内存机制,首先要掌握字符串常量池(StringTable/串池)

  • 串池是JVM为字符串开辟的专门内存区域,用于存储字符串常量;
  • JDK 7及以后,串池从"方法区"迁移到"堆内存";
  • 核心规则:直接赋值的字符串会存入串池,重复赋值时复用已有对象;new创建的字符串不会复用,每次都新建对象
场景1:直接赋值的内存逻辑
java 复制代码
String s1 = "abc";
String s2 = "abc";
// 内存过程:
// 1. JVM检查串池,发现没有"abc",创建该对象并存入串池;
// 2. s1指向串池中的"abc";
// 3. 创建s2时,JVM检查串池存在"abc",直接让s2指向该对象(复用);
// 4. s1和s2指向同一个对象,地址值相同。
场景2:new创建的内存逻辑(以字符数组为例)
java 复制代码
char[] chs = {'a', 'b', 'c'};
String s1 = new String(chs);
String s2 = new String(chs);
// 内存过程:
// 1. 字符数组chs存储在堆内存;
// 2. new String(chs)时,会在堆内存新建一个String对象,指向chs的字符序列;
// 3. s1和s2是两个不同的对象,地址值不同(即使内容相同);
// 4. 这种方式不会复用串池中的对象,会浪费内存。

核心结论:直接赋值的字符串效率更高(复用串池),new创建的字符串会产生冗余对象,非必要不使用。

2.4 字符串比较:== vs equals(面试必考)

字符串比较是高频考点,核心要区分"=="和"equals"的本质区别:

第一步:明确数据类型的比较规则
数据类型 比较方式 示例 结果分析
基本数据类型(int、char等) 比较具体的值 int a=10; int b=20; System.out.println(a==b); false(值不同)
引用数据类型(String、数组等) 比较地址值 String s1=new String("abc"); String s2=new String("abc"); System.out.println(s1==s2); false(地址不同)
第二步:String类的比较方法(比较内容)

为了实现"比较字符串内容"的需求,String类提供了两个核心方法:

  1. public boolean equals(Object anObject):严格比较内容(区分大小写),内容完全一致返回true;
  2. public boolean equalsIgnoreCase(String anotherString):忽略大小写比较内容,适合验证码、用户名等场景。
示例代码:
java 复制代码
public class StringCompareDemo {
    public static void main(String[] args) {
        String s1 = new String("abc");
        String s2 = "ABC";
        String s3 = "abc";

        // == 比较:地址值
        System.out.println(s1 == s3); // false(s1是new的,s3在串池)
        System.out.println(s1 == s2); // false(地址+内容都不同)

        // equals:区分大小写比较内容
        boolean result1 = s1.equals(s2);
        System.out.println(result1); // false

        // equalsIgnoreCase:忽略大小写比较内容
        boolean result2 = s1.equalsIgnoreCase(s2);
        System.out.println(result2); // true
    }
}

开发规范:只要想比较字符串的内容,就用equals/equalsIgnoreCase,永远不要用==(键盘录入的字符串也是new出来的,==比较必错)。

2.5 String类高频实用方法(开发必备)

String类提供了大量方法,以下是最常用的核心方法,必须熟练掌握:

方法1:charAt(int index) → 根据索引获取字符
  • 作用:返回字符串中指定索引位置的字符;
  • 注意:字符串索引从0开始,越界会抛出StringIndexOutOfBoundsException
方法2:length() → 获取字符串长度
  • 作用:返回字符串的字符个数;
  • 注意:字符串长度是length()方法,数组长度是length属性(易混淆考点)。
示例:遍历字符串的每个字符
java 复制代码
import java.util.Scanner;

public class StringCharDemo {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("请输入一个字符串:");
        String str = sc.next(); // 示例输入:得鹿梦鱼

        // 遍历每个字符
        for (int i = 0; i < str.length(); i++) {
            char c = str.charAt(i);
            System.out.println("索引" + i + "的字符:" + c);
        }
        // 输出:
        // 索引0的字符:得
        // 索引1的字符:鹿
        // 索引2的字符:梦
        // 索引3的字符:鱼
    }
}
方法3:substring() → 截取字符串(两个重载)
  • String substring(int beginIndex):从指定索引截取到字符串末尾;
  • String substring(int beginIndex, int endIndex):从beginIndex截取到endIndex(包前不包后/左闭右开);
  • 核心:返回新字符串,原字符串不变(符合"不可变"特性)。
示例:手机号脱敏(中间4位替换为****)
java 复制代码
public class StringSubDemo {
    public static void main(String[] args) {
        String phone = "18315729850"; // 11位手机号
        // 截取前3位:0~3(包0不包3)
        String prefix = phone.substring(0, 3);
        // 截取后4位:从索引7开始到末尾
        String suffix = phone.substring(7);
        // 拼接脱敏结果
        String hidePhone = prefix + "****" + suffix;
        System.out.println(hidePhone); // 输出:183****9850
    }
}
方法4:replace() → 替换字符串内容
  • 方法:String replace(CharSequence target, CharSequence replacement)
  • 作用:将原字符串中的target替换为replacement,返回新字符串;
  • 核心:原字符串不变,替换结果通过返回值接收。
示例:敏感词替换
java 复制代码
public class StringReplaceDemo {
    public static void main(String[] args) {
        String talk = "abc这个词是敏感词,不能出现在内容中";
        // 替换敏感词
        String newTalk = talk.replace("abc", "***");
        System.out.println(newTalk); // 输出:***这个词是敏感词,不能出现在内容中
    }
}

拓展:更多方法(如contains()startsWith()split()等)可通过API帮助文档查询,核心是掌握"方法参数、返回值、功能"三个关键点。

三、核心考点提炼 📝 笔试/面试必记

✅ 核心考点1:String的不可变特性

字符串对象创建后内容不可变,变量的"修改"本质是指向新对象,会产生冗余对象(拼接时尤其明显)。

✅ 核心考点2:串池(StringTable)规则

  • 直接赋值:字符串存入串池,重复赋值复用对象(地址相同);
  • new创建:堆内存新建对象,不复用串池(地址不同)。

✅ 核心考点3:比较规则

  • ==:基本类型比数值,引用类型比地址;
  • equals:String类重写后比内容(区分大小写);
  • equalsIgnoreCase:忽略大小写比内容。

✅ 核心考点4:常用方法易错点

  • length()是方法(字符串),length是属性(数组);
  • substring(begin, end)包前不包后,索引从0开始;
  • 所有修改字符串的方法(如replace()substring())都返回新字符串,原字符串不变。

✅ 经典面试题解析

面试题1:
java 复制代码
public class StringTest1 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "ab";
        String s3 = s2 + "c";
        System.out.println(s1 == s3); // 输出:false
    }
}

解析

  • s2是变量,拼接时会触发运行时创建新对象(而非编译期优化);
  • s1在串池,s3是new出来的对象,地址不同,故==返回false。
面试题2:
java 复制代码
public class StringTest2 {
    public static void main(String[] args) {
        String s1 = "abc";
        String s2 = "a" + "b" + "c";
        System.out.println(s1 == s2); // 输出:true
    }
}

解析

  • 拼接的都是字符串常量,触发编译期优化,直接编译为"abc";
  • s2复用串池中的s1对象,地址相同,故==返回true。

✍️ 写在最后

本篇我们吃透了Java字符串的核心基础------String类的本质、创建方式、内存逻辑、比较规则及常用方法。String类的"不可变"特性是理解后续StringBuilderStringJoiner的关键:正因为String不可变,拼接时会产生大量冗余对象,才需要StringBuilder来优化效率。

字符串是Java开发的基础中的基础,也是笔试/面试的高频考点,尤其是串池、==与equals的区别、编译期优化这些知识点,一定要理解透彻,而非死记硬背。

作为字符串系列的第一篇,我们完成了基础认知的搭建,下一篇将聚焦StringBuilder类,讲解如何解决字符串拼接效率低的问题,同时深入剖析其底层扩容机制,实现从"会用"到"懂原理"的进阶。

Java学习之路,基础不牢,地动山摇。愿你把每个知识点学透,一步一个脚印夯实基础!✨

💡 下期预告

Java字符串精讲(二):StringBuilder类核心|底层扩容原理+高效拼接/反转实战,吃透字符串优化技巧!

本文为Java字符串系列第一篇,案例均经过实测可运行,代码规范贴合企业开发。如果对你有帮助,欢迎点赞+收藏+关注,后续会持续更新Java字符串核心知识点与实战案例!有问题可在评论区留言,逐一回复解答~

相关推荐
leikooo2 小时前
Spring AI 工具调用回调与流式前端展示的完整落地方案
java·spring·ai·ai编程
vx1_Biye_Design2 小时前
基于web的物流管理系统的设计与实现-计算机毕业设计源码44333
java·前端·spring boot·spring·eclipse·tomcat·maven
哈哈不让取名字2 小时前
用Pygame开发你的第一个小游戏
jvm·数据库·python
程序员敲代码吗2 小时前
Python异步编程入门:Asyncio库的使用
jvm·数据库·python
MediaTea2 小时前
Python:MRO 解密 —— C3 线性化算法
java·开发语言
sunfove2 小时前
Python小游戏:在 2048 游戏中实现基于线性插值(Lerp)的平滑动画
开发语言·python·游戏
tqs_123452 小时前
倒排索引数据结构
java·前端·算法
2501_944526422 小时前
Flutter for OpenHarmony 万能游戏库App实战 - 抽牌游戏实现
android·开发语言·python·flutter·游戏
a程序小傲2 小时前
听说前端又死了?
开发语言·前端·mysql·算法·postgresql·深度优先