String类教程:如何在Java中使用字符串操作

news2024/11/27 16:47:12

在这里插入图片描述

  咦咦咦,各位小可爱,我是你们的好伙伴——bug菌,今天又来给大家普及Java SE相关知识点了,别躲起来啊,听我讲干货还不快点赞,赞多了我就有动力讲得更嗨啦!所以呀,养成先点赞后阅读的好习惯,别被干货淹没了哦~


🏆本文收录于「滚雪球学Java」专栏,专业攻坚指数级提升,助你一臂之力,带你早日登顶🚀,欢迎大家关注&&收藏!持续更新中,up!up!up!!

环境说明:Windows 10 + IntelliJ IDEA 2021.3.2 + Jdk 1.8

文章目录:

  • 前言
  • 摘要
  • String类
    • 概念
    • 优缺点分析
      • 优点:
      • 缺点:
    • 应用场景
    • 源码分析
    • 常用方法
    • 具体方法介绍
      • 如何创建字符串
      • 字符串比较
      • 字符串连接
      • 字符串长度
      • 提取子串
      • 替换字符串
      • 分割字符串
      • 字符串搜索
    • 测试用例
      • 测试代码
      • 测试结果
      • 测试用例代码分析
    • 小结
    • 附录源码
    • 结语
  • ☀️建议/推荐你
  • 📣关于我

前言

  String类是Java中最常用的类之一,它提供了许多方便的方法来操作字符串。本教程将深入讲解String类的使用方法,包括创建字符串、字符串的比较、连接、子串、替换、分割等操作。

摘要

本教程主要包括以下内容:

  • String类概述
  • String类源码解析
  • String类常用方法介绍
  • String类方法使用介绍
    • 如何创建字符串
    • 字符串比较
    • 字符串连接
    • 提取子串
    • 替换字符串
    • 分割字符串
    • 字符串长度
    • 字符串搜索
  • 测试用例
    • 测试代码
    • 测试结果
    • 测试代码分析
  • 小结

String类

概念

  String类是Java中最常用的类之一,它表示字符串类型的数据。字符串是由一系列字符组成的,可以用双引号括起来表示,例如:“Hello World”。Java中的String类是不可变的,一旦被创建,它的值就不能被改变。这意味着每次对一个字符串进行操作时,都需要创建一个新的字符串对象。

优缺点分析

优点:

  1. 不可变性:String对象创建后,其内容不能被修改,这就保证了程序中的某些变量在被赋值后不能再被修改,从而保证了程序的正确性和健壮性;
  2. 可重用性:String对象可以被多个变量引用,因为其内容不可变,所以可以在程序中多次使用同一个String对象来表示相同的字符串,这就提高了程序的性能;
  3. 安全性:由于String对象的不可变性,程序在使用字符串时不需要担心修改原始数据的风险,从而保证了程序的安全性;
  4. 常量池:Java中的字符串常量会被存储在常量池中,相同字符串只会在内存中存储一份,从而节省了内存空间。

缺点:

  1. 可能会产生大量的临时对象:由于字符串的不可变性,每次字符串的拼接、切割等操作都会产生新的String对象,如果频繁进行这些操作,可能会导致大量的临时对象被创建,从而影响程序的性能;
  2. 比较操作不高效:由于String对象的比较操作是逐字符比较的,如果比较的字符串过长,比较操作可能会很耗时。

应用场景

应用场景:

  1. 字符串处理:String类是Java中最常用的字符串处理类,通常用于存储和处理文本,如读取文件、解析XML等;
  2. 数据库操作:在Java中进行数据库操作时,经常需要使用字符串来表示SQL语句、表名、字段名等;
  3. 网络通信:在网络通信中,很多协议都是基于字符串的,例如HTTP协议、FTP协议等,使用String类可以方便地表示和处理这些通信协议。

源码分析

下面是Java中String类的部分源码:

public final class String
    implements java.io.Serializable, Comparable<String>, CharSequence {
    
    // 字符串的值,底层是一个字符数组
    private final char value[];
    
    // 字符串的长度
    private final int count;
    
    // 缓存hash值,默认为0
    private int hash; 

    // 构造函数,传入一个字符数组
    public String(char value[]) {
        this.value = Arrays.copyOf(value, value.length);
        this.count = value.length;
     }

     // 返回字符串的长度
     public int length() {
        return count;
     }

    // 返回指定索引位置的字符
    public char charAt(int index) {
        if ((index < 0) || (index >= count)) {
            throw new StringIndexOutOfBoundsException(index);
        }
        return value[index];
    }

    // 返回从beginIndex到endIndex-1位置的子字符串
    public String substring(int beginIndex, int endIndex) {
        if (beginIndex < 0) {
            throw new StringIndexOutOfBoundsException(beginIndex);
        }
        if (endIndex > count) {
            throw new StringIndexOutOfBoundsException(endIndex);
        }
        if (beginIndex > endIndex) {
            throw new StringIndexOutOfBoundsException(endIndex - beginIndex);
        }
        return ((beginIndex == 0) && (endIndex == count)) ? this :
            new String(value, beginIndex, endIndex - beginIndex);
    }

    // 比较字符串的内容是否相等
    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String)anObject;
            int n = count;
            if (n == anotherString.count) {
                char v1[] = value;
                char v2[] = anotherString.value;
                int i = 0;
                while (n-- != 0) {
                    if (v1[i] != v2[i])
                        return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

    // 判断字符串是否包含指定的字符序列
    public boolean contains(CharSequence s) {
        return indexOf(s.toString()) > -1;
    }

}

  从上述代码中可以看出,String类是不可变的,即一旦被创建,其值不可更改。在构造函数中,传入一个字符数组,并将其复制到类中的value数组中,最终得到一个完整的字符串。String类中包含了多个常用的方法,例如length()charAt()substring()equals()contains()等方法。这些方法都对字符串进行了不同程度的操作,例如返回字符串的长度、返回指定索引位置的字符、返回子字符串、比较字符串的内容是否相等、判断字符串是否包含指定的字符序列等。

常用方法

在String类中,包含了多个常用的方法,例如:

  1. length():返回字符串的长度。
  2. charAt(int index):返回指定索引位置的字符。
  3. substring(int beginIndex, int endIndex):返回从beginIndexendIndex-1位置的子字符串。
  4. equals(Object anObject):比较字符串的内容是否相等。
  5. contains(CharSequence s):判断字符串是否包含指定的字符序列。

具体方法介绍

如何创建字符串

在Java中创建字符串有两种方式。第一种是使用字符串字面值,例如:

String str = "Hello World";

第二种是使用String类的构造方法,例如:

String str = new String("Hello World");

  第二种方式比较消耗资源,因为它会在堆中创建一个新的字符串对象。建议使用第一种方式创建字符串。

字符串比较

在Java中比较字符串可以使用equals()方法或==运算符。例如:

String str1 = "Hello World";
String str2 = "Hello World";
String str3 = new String("Hello World");

System.out.println(str1.equals(str2)); // true
System.out.println(str1 == str2); // true
System.out.println(str1.equals(str3)); // true
System.out.println(str1 == str3); // false

  需要注意的是,equals()方法比较的是两个字符串的值是否相等;==运算符比较的是两个字符串的引用是否相等。

字符串连接

在Java中可以使用+运算符或concat()方法连接两个字符串。例如:

String str1 = "Hello";
String str2 = "World";
String str3 = str1 + " " + str2;
String str4 = str1.concat(" ").concat(str2);

System.out.println(str3); // "Hello World"
System.out.println(str4); // "Hello World"

  需要注意的是,每次连接字符串都会创建一个新的字符串对象,因此在连接多个字符串时应该使用StringBuilderStringBuffer类。

字符串长度

可以使用length()方法获取字符串的长度,如下:

String str = "Hello World";
int len = str.length();

提取子串

在Java中可以使用substring()方法提取字符串的子串。例如:

String str1 = "Hello World";
String str2 = str1.substring(6); // "World"
String str3 = str1.substring(0, 5); // "Hello"

System.out.println(str2);
System.out.println(str3);

  其中,substring(int beginIndex)方法用于提取从指定位置开始到字符串末尾的子串;substring(int beginIndex, int endIndex)方法用于提取从指定位置开始到指定位置结束的子串。

替换字符串

在Java中可以使用replace()方法或replaceAll()方法替换字符串中的内容。例如:

    //替换字符串
    public static void testReplace() {
        String str1 = "Hello World";
        String str2 = str1.replace("World", "Java"); // "Hello Java"
        String str3 = str1.replaceAll("o", "O"); // "HellO WOrld"

        System.out.println(str2);
        System.out.println(str3);
    }

执行结果截图如下:

在这里插入图片描述

  其中,replace(CharSequence oldChar, CharSequence newChar)方法用于替换字符串中的指定字符或字符串;replaceAll(String regex, String replacement)方法用于替换字符串中的正则表达式匹配项。

分割字符串

在Java中可以使用split()方法将字符串分割成字符串数组。例如:

    //分割字符串
    public static void testSplit() {
        String str1 = "Hello,World,Java";
        String[] str2 = str1.split(","); // {"Hello", "World", "Java"}

        for (String str : str2) {
            System.out.println(str);
        }
    }

执行结果截图如下:

在这里插入图片描述

  需要注意的是,split()方法的参数可以是一个正则表达式。如果分割符是一个普通字符,可以使用Pattern.quote()方法将其转义。

字符串搜索

  可以使用indexOf()方法和lastIndexOf()方法来查找子字符串在字符串中的位置,如下:

    //字符串搜索
    public static void testIndexOf() {
        String str = "Hello World";
        int index1 = str.indexOf("o");         // 4
        int index2 = str.lastIndexOf("o");     // 7
        System.out.println("index1:" + index1);
        System.out.println("index2:" + index2);
    }

    public static void main(String[] args) {
        testIndexOf();
    }

执行结果截图如下:

在这里插入图片描述

测试用例

如下我将实际运用如上方法进行简单演示,以帮助同学们更好的理解与使用。

测试代码

如下:

public class StringTest {
    public static void main(String[] args) {
        String str1 = "Hello";
        String str2 = "hello";

        // test string equality with case sensitive
        if (str1.equals(str2)) {
            System.out.println("The two strings are equal.");
        } else {
            System.out.println("The two strings are not equal.");
        }

        // test string equality with case insensitive
        if (str1.compareToIgnoreCase(str2) == 0) {
            System.out.println("The two strings are equal.");
        } else {
            System.out.println("The two strings are not equal.");
        }

        // test substring
        String str = "Hello World";
        String str3 = str.substring(0, 5);
        String str4 = str.substring(6);
        System.out.println(str3 + " " + str4);

        // test string length
        int len = str.length();
        System.out.println(len);

        // test string concatenation
        String str5 = "Java";
        String str6 = str1 + " " + str5;
        System.out.println(str6);

        // test string replace
        String newStr = str.replace("World", "Java");
        System.out.println(newStr);
    }
}

测试结果

执行如上测试用例,结果如下:

在这里插入图片描述

测试用例代码分析

该代码演示了 Java 中 String 类的常用方法,主要包括:

  1. equals() 方法用于比较两个字符串是否相等,区分大小写;
  2. compareToIgnoreCase() 方法用于比较两个字符串是否相等,不区分大小写;
  3. substring() 方法用于截取字符串中的子串;
  4. length()方法用于获取字符串的长度;
  5. 字符串拼接使用 + 号;
  6. replace() 方法用于替换字符串中的字符或子串。

在该代码中,需要注意以下几点:

  1. 字符串比较使用 equals()compareToIgnoreCase() 方法;
  2. 截取子串使用 substring()方法,指定起始位置和结束位置;
  3. 构造新字符串使用 + 号;
  4. 替换字符或子串使用 replace() 方法,指定要替换的字符或子串和替换后的字符或子串。

小结

  本教程介绍了Java中String类的使用方法,包括创建字符串、字符串的比较、连接、子串、替换、分割等操作。需要注意的是,由于每次操作都会创建一个新的字符串对象,因此在进行大量字符串操作时应该使用StringBuilder或StringBuffer类。在实际开发中,String类是非常常用的一个类,掌握好它的使用方法对于编写高效的Java程序非常重要。

附录源码

  如上涉及所有源码均已上传同步在「Gitee」,提供给同学们一对一参考学习,辅助你更迅速的掌握。

结语

本篇文章对Java中String类的基础内容进行了详细的讲解,希望能够帮助读者更好地掌握Java语言中字符串的操作方法。

☀️建议/推荐你


  无论你是计算机专业的学生,还是对编程有兴趣的小伙伴,都建议直接毫无顾忌的学习此专栏「滚雪球学Java」,bug菌郑重承诺,凡是学习此专栏的同学,均能获取到所需的知识和技能,全网最快速入门Java编程,就像滚雪球一样,越滚越大,指数级提升。

  最后,如果这篇文章对你有所帮助,帮忙给作者来个一键三连,关注、点赞、收藏,您的支持就是我坚持写作最大的动力。

  同时欢迎大家关注公众号:「猿圈奇妙屋」 ,以便学习更多同类型的技术文章,免费白嫖最新BAT互联网公司面试题、4000G pdf电子书籍、简历模板、技术文章Markdown文档等海量资料。

📣关于我

我是bug菌,CSDN | 掘金 | InfoQ | 51CTO | 华为云 | 阿里云 | 腾讯云 等社区博客专家,C站博客之星Top30,华为云2023年度十佳博主,掘金多年度人气作者Top40,51CTO年度博主Top12,掘金/InfoQ/51CTO等社区优质创作者;全网粉丝合计 20w+;硬核微信公众号「猿圈奇妙屋」,欢迎你的加入!免费白嫖最新BAT互联网公司面试真题、4000G PDF电子书籍、简历模板等海量资料,你想要的我都有,关键是你不来拿。


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1562826.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【洛谷】P9240 [蓝桥杯 2023 省 B] 冶炼金属

题目链接 P9240 [蓝桥杯 2023 省 B] 冶炼金属 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn) 思路 这道题可以用数学的方法去做&#xff0c;但是我想不到&#x1f607;有兴趣的可以去看看数学的题解 比较简单的思路就是二分查找&#xff0c;轻松简单不费脑&#xff0c;带你…

深信服超融合虚拟机的导入方法

以从vmware虚拟机导出的虚拟机为例。 1 进入虚拟机页面点【新增】&#xff0c;选择【导入虚拟机】 2 以文件类型为ovf、mf、vmdk为例导入 选择文件类型&#xff0c;选择那三个导出的虚拟机的文件&#xff0c;选择分组&#xff0c;存储位置和运行位置默认&#xff0c;操作系统…

翻译学习(英译汉)

2024-04-02 翻译词组&#xff1a;shrinking deficits 我的练习&#xff1a;财政赤字 问题 1&#xff1a;shrinking deficits 怎么理解&#xff0c;在中文应该怎么称呼 问题 2&#xff1a;Shrinking deficits 可以译为中文多种句式吗 AI助手 Kimi.ai - 帮你看更大的世界 (…

Python抓取京东、淘宝商品数据(属性详情,sku价格抓取)

抓取京东、淘宝等电商平台的商品数据&#xff08;包括属性详情、SKU价格等&#xff09;通常涉及到网络爬虫技术。这些平台都有自己的反爬虫机制&#xff0c;因此抓取数据需要谨慎操作&#xff0c;避免对平台造成不必要的负担或违反其使用条款。 公共参数 名称类型必须描述key…

Leetcode-2810-故障键盘-c++

题目详见https://leetcode.cn/problems/faulty-keyboard/ 题解 这道题的关键是如何合理地使用STL&#xff0c;毕竟是一道简单题。 之前常用到的Vector容器是单向开口的连续内存空间 deque则是一种双向开口的连续线性空间&#xff0c;又称双端动态数组。所谓的双向开口&#x…

RAG已死,Gemini当立!AI技术革新带来颠覆性变革

简单的RAG系统可能即将被淘汰&#xff0c;但更个性化的版本将继续存在。 我最近在深入研究Genimi 1.5 Pro&#xff0c;作为一名AI领域的创业者&#xff0c;我有一些见解想要与你分享。 RAG是一种搜索技术&#xff0c;它通过比较信息的相似度来检索所需内容。 鉴于RAG主要用于…

【SQL Server】2. 将数据导入导出到Excel表格当中

最开始&#xff0c;博主介绍一下自己的环境&#xff1a;SQL Sever 2008 R2 SQL Sever 大致都差不多 1. 通过自带软件的方式 首先找到下载SQL Sever中提供的导入导出工具 如果开始界面没有找到自己下载的路径 C:\Program Files\Microsoft SQL Server\100\DTS\Binn下的DTSWiz…

投资回收期

投资回收期 利率与贴现率 贴现率是指将未来支付改变为现值所使用的利率&#xff0c;简单而言&#xff0c;就是将来的钱折算到现值&#xff0c;少掉或多出的那部分钱与将来的钱的比值。 利率是指一定时期内利息额与本金的比率&#xff0c;通常以一年期利息与本金…

testbench中一些常用的系统命令

前言 记录一下自己仿真过程中用到过的一些用于testbench的系统命令&#xff0c;根据自己用到的情况不定时进行补充。 文件操作 $fopen 用于打开文件的命令&#xff0c;格式如下 file $fopen("file_name","mode") file_name&#xff1a;要打开的文件…

CTK插件框架学习-事件监听(04)

CTK插件框架学习-插件注册调用(03)https://mp.csdn.net/mp_blog/creation/editor/136989802 一、主要流程 发送者注册消息事件接收者订阅消息事件接收者相应消息事件 事件监听比插件接口调用耦合性更弱&#xff0c;事件由框架维护&#xff0c;不需要指定发送方和接收方 二、…

“创新强基·应用强链”2024第104届上海电子展会

2024第104届上海电子展会 2024 Shanghai electron Expo 时间:2024年11月18--20日 地点:上海新国际博览中心 主题:创新强基应用强链 上海与长三角各地产业协同发展&#xff0c;到2025年&#xff0c;初步建成具有全球影响力和竞争力的世界级电子信息产业集群。产业链稳定性和韧…

如何在Facebook直播?手把手教你进行Facebook Live!

做跨境电商和外贸的朋友们&#xff0c;你们有试过用直播来卖货吗&#xff1f;现在有很多海外直播带货平台&#xff0c;像TikTok、YouTube等平台就受到许多卖家青睐。但是&#xff0c;作为社媒营销主阵地之一的 Facebook&#xff0c;它的直播功能 Facebook Live 却常常被许多卖家…

全氟化合物的变异系数

采用变异系数&#xff08;the coefficient of variation&#xff1b;CV&#xff09;来评价PFAAs的离散程度[1]。CV≤10%表示弱变异水平&#xff0c;10% < CV≤100%表示培养中等变异&#xff0c;CV > 100%表示强变异。CV的计算方法如下&#xff1a; 其中&#xff0c;s为标…

python爬虫----了解爬虫(十一天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

【云服务选购指南】4月 阿里云99续费统计 集体降价20% 京东云全网保价 博客建站 游戏服务器 2-64G大盘点

本文纯原创&#xff0c;侵权必究 【云服务器推荐】价格对比&#xff01;阿里云 京东云 腾讯云 选购指南视频截图 《最新对比表》已更新在文章头部—腾讯云文档&#xff0c;文章具有时效性&#xff0c;请以腾讯文档为准&#xff01; 【腾讯文档实时更新】2024年-幻兽帕鲁服务器…

computed计算属性、watch侦听器、生命周期

计算属性 点击查看 Vue文档 基础语法 多次使用计算属性&#xff0c;计算属性方法也只执行一次&#xff0c; 调用计算属性的方法不能加() 直接修改计算数学的值 计算属性不能通过双向绑定修改&#xff08;默认不能改&#xff09; 想要修改计算属性&#xff0c;就必须使用计…

如何防止亚马逊账户关联问题?

亚马逊风险控制是亚马逊为了防止买家账户欺诈而实施的规则。具体的风险控制算法是亚马逊技术部门的少数人所独有的&#xff0c;因此我们难以获知其中的细节。为了提高销量&#xff0c;一些卖家可能会采取一些措施&#xff0c;但是由于风控措施的严格&#xff0c;许多卖家深感头…

使用CMake搭建简单的Qt程序

目录结构 代码 CMakeLists.txt&#xff1a; cmake_minimum_required(VERSION 3.15)set(CMAKE_AUTOUIC ON) set(CMAKE_AUTOMOC ON) set(CMAKE_AUTORCC ON)# set the project name project(xxx)# 设置Qt的路径 # 例如 E:/Qt/Qt/aaa/msvc2019_64 # aaa 为Qt的版本号 set(QT_PATH…

如何生成一个指定长度的空数组?

简便写法&#xff1a;使用constructor构造函数进行创建&#xff0c;第一个空数组 [ ] 表示创建一个空数组&#xff0c;然后调用 constructor 属性并传入参数指定数组长度。 [].constructor(17)可用于遍历&#xff0c;例如使用ngFor进行单纯的遍历&#xff0c;参数为遍历次数。

常见的设备通讯协议分析

不同的通信协议根据其设计目的和应用场景&#xff0c;各有其优缺点。在选择通信协议时&#xff0c;需要根据具体的应用需求和场景&#xff0c;权衡各种协议的优缺点&#xff0c;选择最适合的协议。例如&#xff0c;对于实时性要求高的工业控制系统&#xff0c;可能会选择CAN或M…