Java中String的概念与应用

引言:

        在Java编程语言中,String(字符串)是一个非常重要且广泛使用的类。String类代表不可变的字符序列,它提供了一系列方法来操作字符串。本文将详细描述Java中String的概念、特性以及在实际开发中的应用。

一、String类的声明与初始化

在Java中,可以通过以下两种方式来声明和初始化String对象:

  1. 使用字符串字面值直接初始化
    String str1 = "Hello, Java!";
  2. 使用new关键字构造String对象:
    String str2 = new String("Hello, Java!");

无论使用哪种方式,我们都可以对String对象进行各种操作。

二、String的不可变性

        String类的一个重要特点就是不可变性,即一旦创建了String对象,就无法再修改它的值。这是因为String类是使用字符数组来存储字符串的,而数组的长度是固定的。如果需要修改字符串,实际上是创建一个新的String对象。

例如:

String str = "Hello";
str = str + ", Java!";

上述代码中,实际上创建了两个String对象,分别是"Hello"和"Hello, Java!"。这种不可变性的特点使得String对象在多线程环境下是安全的。

三、String对象的比较

        String对象的比较可以通过==运算符和equals()方法进行。这两种比较方式有一些不同之处。

1、==运算符

        用于比较两个String对象的引用是否相等,即它们是否指向同一个内存地址。当两个String对象使用==运算符进行比较时,比较的是它们的引用地址。

2、equals()方法

        用于比较两个String对象的内容是否相等。该方法会比较字符串的每一个字符,如果字符序列完全相同,则返回true;否则返回false

示例代码如下:

public class StringComparisonExample {public static void main(String[] args) {String str1 = "hello";String str2 = "hello";String str3 = new String("hello");// 使用==运算符进行比较System.out.println(str1 == str2); // 输出:true,因为str1和str2引用了同一个字符串常量池中的对象System.out.println(str1 == str3); // 输出:false,因为str3是通过new关键字创建的新对象// 使用equals()方法进行比较System.out.println(str1.equals(str2)); // 输出:true,因为字符串内容相同System.out.println(str1.equals(str3)); // 输出:true,因为字符串内容相同}
}

        在上面的示例中,我们创建了三个String对象:str1和str2直接赋值为相同的"hello"字符串,而str3使用new关键字创建了一个新的对象。然后我们使用==运算符和equals()方法进行比较。

        使用==运算符比较str1和str2时返回true,因为它们引用了同一个字符串常量池中的对象。而比较str1和str3时返回false,因为str3是通过new关键字创建的新对象。

        使用equals()方法比较str1和str2时返回true,因为它们的内容完全相同。比较str1和str3时也返回true,因为字符串内容相同,equals()方法比较的是字符串的内容。

        需要注意的是,在使用equals()方法比较之前,需要确保对象不为null,否则会抛出NullPointerException异常。

3、int compareTo(String s) 方法:按照字典序进行比较

        与equals不同的是,equals返回的是boolean类型,而compareTo返回的是int类型。具体比较方式:
        1. 先按照字典次序大小比较,如果出现不等的字符,直接返回这两个字符的大小差值
        2. 如果前k个字符相等(k为两个字符长度最小值),返回值两个字符串长度差值

public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("abc");String s4 = new String("abcdef");System.out.println(s1.compareTo(s2)); // 不同输出字符差值-1System.out.println(s1.compareTo(s3)); // 相同输出 0System.out.println(s1.compareTo(s4)); // 前k个字符完全相同,输出长度差值 -3
}


4. int compareToIgnoreCase(String str) 方法

        与compareTo方式相同,但是忽略大小写比较

public static void main(String[] args) {String s1 = new String("abc");String s2 = new String("ac");String s3 = new String("ABc");String s4 = new String("abcdef");System.out.println(s1.compareToIgnoreCase(s2)); // 不同输出字符差值-1System.out.println(s1.compareToIgnoreCase(s3)); // 相同输出 0System.out.println(s1.compareToIgnoreCase(s4)); // 前k个字符完全相同,输出长度差值 -3
}

四、字符串查找

字符串查找可以使用以下方法:

1、int indexOf(int ch)

返回指定字符在字符串中第一次出现处的索引。如果不存在该字符,则返回-1。

2、int indexOf(int ch, int fromIndex)

从指定的索引位置开始,返回指定字符在字符串中第一次出现处的索引。如果不存在该字符,则返回-1。

3、int indexOf(String str)

返回指定子字符串在字符串中第一次出现处的索引。如果不存在该字符串,则返回-1。

4、int indexOf(String str, int fromIndex)

从指定的索引位置开始,返回指定子字符串在字符串中第一次出现处的索引。如果不存在该字符串,则返回-1。

5、int lastIndexOf(int ch)

返回指定字符在字符串中最后一次出现处的索引。如果不存在该字符,则返回-1。

6、int lastIndexOf(int ch, int fromIndex)

从指定的索引位置开始,返回指定字符在字符串中最后一次出现处的索引。如果不存在该字符,则返回-1。

7、int lastIndexOf(String str)

返回指定子字符串在字符串中最后一次出现处的索引。如果不存在该子字符串,则返回-1。

8、int lastIndexOf(String str, int fromIndex)

从指定的索引位置开始,返回指定子字符串在字符串中最后一次出现处的索引。如果不存在该子字符串,则返回-1。

9、boolean contains(CharSequence s)

判断字符串是否包含指定的子字符串。如果包含,返回true;否则返回false。

10、char charAt(int index)

返回index位置上字符,如果index为负数或者越界,抛出 IndexOutOfBoundsException异常

示例代码如下:

public class StringSearchExample {public static void main(String[] args) {String str1 = "hello world";String str2 = "world";String str3 = "Java";// 使用 indexOf 方法查找字符和字符串System.out.println(str1.indexOf('l')); // 输出:2,因为第一个 'l' 的索引为 2System.out.println(str1.indexOf('z')); // 输出:-1,因为字符串中不存在字符 'z'System.out.println(str1.indexOf(str2)); // 输出:6,因为字符串 "world" 在字符串中的索引为 6System.out.println(str1.indexOf(str2, 7)); // 输出:-1,因为从索引 7 开始向后,字符串中不存在 "world"// 使用 lastIndexOf 方法查找字符和字符串System.out.println(str1.lastIndexOf('l')); // 输出:9,因为最后一个 'l' 的索引为 9System.out.println(str1.lastIndexOf('z')); // 输出:-1,因为字符串中不存在字符 'z'System.out.println(str1.lastIndexOf(str2)); // 输出:6,因为字符串 "world" 在字符串中的最后一个索引为 6System.out.println(str1.lastIndexOf(str2, 7)); // 输出:6,因为从索引 7 开始向前,最后一个 "world" 的索引为 6// 使用 contains 方法查找是否包含指定子字符串System.out.println(str1.contains(str3)); // 输出:false,因为字符串 "hello world" 中不包含子字符串 "Java"System.out.println(str1.contains(str2)); // 输出:true,因为字符串 "hello world" 中包含子字符串 "world"}
}

        在上述示例中,我们演示了如何使用Java提供的字符串查找方法。使用indexOf方法和lastIndexOf方法可以在字符串中查找指定的字符或子字符串,分别返回第一次出现和最后一次出现的索引位置。使用contains方法可以判断一个字符串是否包含指定的子字符串。

五、字符串转化

1、数值和字符串转化

将数值转为字符串:可以使用 String 类的静态方法 valueOf() 或数值类型对应的 toString() 方法。

int number = 123;
String str1 = String.valueOf(number);
String str2 = Integer.toString(number);
System.out.println(str1); // 输出: "123"
System.out.println(str2); // 输出: "123"

2、将字符串转为数值

可以使用 IntegerDoubleFloat 等包装类的 parseInt()parseDouble()parseFloat() 等静态方法来实现。

String str = "456";
int intValue = Integer.parseInt(str);
double doubleValue = Double.parseDouble(str);
System.out.println(intValue); // 输出: 456
System.out.println(doubleValue); // 输出: 456.0

3、大小写转换

将字符串转为大写:使用 toUpperCase() 方法。

String str = "hello world";
String uppercase = str.toUpperCase();
System.out.println(uppercase); // 输出: "HELLO WORLD"

将字符串转为小写:使用 toLowerCase() 方法。

String str = "HELLO WORLD";
String lowercase = str.toLowerCase();
System.out.println(lowercase); // 输出: "hello world"

4、字符串转数组

将字符串转为字符数组:使用 toCharArray() 方法。

String str = "Hello World";
char[] charArray = str.toCharArray();
System.out.println(charArray); // 输出: [H, e, l, l, o,  , W, o, r, l, d]

5、格式化

字符串格式化:可以使用 String 类的 format() 方法进行字符串格式化操作。它使用类似于 C 语言中的 printf 的格式化语法。

public static void main(String[] args) {
String s = String.format("%d-%d-%d", 2019, 9,14);
System.out.println(s);// 输出: 2019-9-14
}

六、字符串替换

对于字符串替换操作,可以使用 replace() 方法来实现。这个方法接受两个参数,第一个参数是要被替换的字符序列(可以是单个字符或字符串),第二个参数是用来替换的新字符序列(可以是单个字符或字符串)。

下面是一个简单的Java示例:

String originalString = "Hello, World! Hello, Java!";
String newString = originalString.replace("Hello", "Hi");
System.out.println(newString);  // 输出: "Hi, World! Hi, Java!"

在上面的示例中,原始字符串中的所有"Hello"都被替换为"Hi"。

        需要注意的是,replace() 方法返回一个新的字符串,原始字符串保持不变。如果你需要对原始字符串进行替换操作,可以直接将结果赋值给原始字符串变量。

七、字符串拆分

1、split()方法接受一个参数:String[] split(String regex)

        使用split()方法来将字符串拆分为子串,split()方法接受一个正则表达式作为参数,用以描述拆分字符串的规则。拆分后的子串将被放入一个字符串数组中返回。

以下是一个简单的示例,演示了如何使用split()方法将一个句子按照空格拆分成单词:

String sentence = "The quick brown fox";
String[] words = sentence.split(" "); // 使用空格作为分割符
for (String word : words) {System.out.println(word);
}

运行上述代码将输出如下内容:

The
quick
brown
fox

        如果要按照其他规则进行拆分,可以根据具体需要在split()方法中使用不同的正则表达式。例如,如果要按照逗号进行拆分,可以使用split(",")

        需要注意的是,split()方法返回的是一个字符串数组,你可以对其进行操作或遍历其中的元素以获取拆分后的子串。

2、split()方法接受两个个参数:String[] split(String regex, int limit)

  split()方法可以接受两个参数,第一个参数是用于拆分字符串的正则表达式,第二个参数是限制拆分后的子串数量的上限。这个参数限制了拆分后所得到的字符串数组的长度。

下面是split()方法带有两个参数的简单示例:

String str = "apple,banana,grape,orange";
String[] parts = str.split(",", 2); // 使用逗号作为分隔符,限制拆分出两段
for (String part : parts) {System.out.println(part);
}

在这个示例中,拆分的结果将会受到第二个参数的限制,只拆分出两段字符串:

apple
banana,grape,orange

这个功能在需要控制拆分后子串数量的场景中非常有用。

八、 字符串截取

   substring()方法来截取字符串的子串,它可以根据指定的索引位置来提取子串。substring()方法有两种重载形式:

1、substring(int beginIndex)

从指定的开始索引位置开始,提取到字符串的末尾。

2、substring(int beginIndex, int endIndex)

从指定的开始索引位置开始,提取到指定的结束索引位置(不包括结束索引位置对应的字符)。

以下是使用substring()方法截取字符串的示例:

String str = "Hello, World!";
String substr1 = str.substring(7); // 从索引位置7开始截取到末尾
String substr2 = str.substring(7, 12); // 从索引位置7开始截取到索引位置12(不包括12)
System.out.println(substr1); // 输出:World!
System.out.println(substr2); // 输出:World

        需要注意的是,在Java中,字符串的索引位置从0开始。例如,第一个字符的索引是0,第二个字符的索引是1,依此类推。

        另外,当传入的索引位置超出了字符串的范围时,将会抛出IndexOutOfBoundsException异常。因此,在实际使用时,请确保传入的索引值是有效的。

九、其他操作方法

   trim()方法被用于删除字符串的首尾空格。它返回一个新的字符串,去除了原始字符串首尾的空格。

以下是使用trim()方法去除字符串首尾空格的示例:

String str = "   Hello, World!   ";
String trimmedStr = str.trim();
System.out.println(trimmedStr); // 输出:Hello, World!

        在这个示例中,原始字符串" Hello, World! "trim()方法处理后,生成了一个新的字符串"Hello, World!",其中的首尾空格被删除了。

        需要注意的是,trim()方法仅会删除字符串首尾的空格,而不会删除字符串内部的空格。例如," Hello, World! "的首尾空格会被删除,但字符串内部的空格是保留的。

        

十、String与StringBuilder/StringBuffer的比较

        在大量的字符串拼接操作中,使用String的不可变性会导致频繁创建新的String对象,从而消耗大量的内存和系统资源。为了解决这个问题,Java还提供了StringBuilderStringBuffer两个类,它们都提供了可变的字符串操作。

       StringBuilderStringBuffer的用法基本相似,但StringBuilder的性能更好,因为它是非线程安全的,而StringBuffer是线程安全的。因此,在单线程环境下,我们通常使用StringBuilder类。

总结:
        String类是Java语言中非常重要且常用的类之一,它提供了许多方法来操作字符串。虽然String对象是不可变的,但我们可以通过使用StringBuilder或StringBuffer来实现可变的字符串操作。在实际应用中,根据需求选择合适的字符串操作方式,可以提高代码的效率和性能。

        希望本篇博客能够对Java中String的概念和应用有一个清晰的了解,以便在开发过程中更好地利用和操作字符串。如果您有任何问题或建议,欢迎留言交流!

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

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

相关文章

Linux运维

1. 请解释什么是Linux操作系统? Linux操作系统是一种自由和开放源代码的类UNIX操作系统。它是基于UNIX的一个克隆,由林纳斯托瓦兹在1991年首次发布。Linux操作系统遵循POSIX标准,这意味着它可以运行在各种硬件平台上,如x86、ARM等…

汽车制动系统技术分析概要

目录 1.基本功能概述 2. 基本工作原理分析 2.1 Two-Box系统架构(Bosch_IBooster) 2.2 One-Box系统架构(Bosch_IPB) 2.3 ​​​​​​​ABS技术 2.4 TCS技术 2.5 VDC技术 2.6 EPB技术 2.7 小结 3. 该场景应用发展趋势分析 1.基本功能概述 传统汽车的底盘主要由传动系、…

在DDD领域驱动下的微服务数据库的MVC设计思路(高度可行性)

在DDD领域驱动下的微服务架构中使用MVC设计思路来设计数据库是可行的,因为MVC是一种经典的软件架构模式,可以将应用程序分为三个主要部分:模型、视图和控制器。在微服务架构中,每个微服务可以看作是一个模块,可以使用M…

最全面的软考架构师复习资料(历时2年整理)

一、面向服务的架构 1.请分别用200字以内文字说明什么是面向服务架构(SOA)以及ESB在SOA的作用与特点 面向服务的体系架构(SOA)是一种粗粒度、松耦合的服务架构,服务之间通过简单、精确定义接口进行通信。他可以根据需求…

CSS3 多媒体查询、网格布局

一、CSS3多媒体查询: CSS3 多媒体查询继承了CSS2多媒体类型的所有思想,取代了查找设备的类型。CSS3根据设置自适应显示。 多媒体查询语法: media not|only mediatype and (expressions) { CSS 代码...; } not: not是用来排除掉某些特定…

论文笔记:SimiDTR: Deep Trajectory Recovery with Enhanced Trajectory Similarity

DASFFA 2023 1 intro 1.1 背景 由于设备和环境的限制(设备故障,信号缺失),许多轨迹以低采样率记录,或者存在缺失的位置,称为不完整轨迹 恢复不完整轨迹的缺失空间-时间点并降低它们的不确定性是非常重要…

RT-Thread构建与配置系统

简述 RT-Thread的构建与配置系统由以下几个部分组成: KConfig:kernel config配置文件(提供系统的配置裁剪功能)SCons:构建工具env工具:主要提供构建系统所需的各种环境变量以及软件包的管理 Kconfig在R…

【C++】this指针讲解超详细!!!

💐 🌸 🌷 🍀 🌹 🌻 🌺 🍁 🍃 🍂 🌿 🍄🍝 🍛 🍤 📃个人主页 :阿然成长日记 …

Zookeeper篇---第五篇

系列文章目录 文章目录 系列文章目录一、Zookeeper为什么要这么设计?二、你知道Zookeeper中有哪些角色?三、你熟悉Zookeeper节点ZNode和相关属性吗?一、Zookeeper为什么要这么设计? ZooKeeper设计的目的是提供高性能、高可用、顺序一致性的分布式协调服务、保证数据最终一…

ElasticSearch的集群、节点、索引、分片和副本

Elasticsearch是面向文档型数据库,一条数据在这里就是一个文档。为了方便大家理解,我们将Elasticsearch里存储文档数据和关系型数据库MySQL存储数据的概念进行一个类比 ES里的Index可以看做一个库,而Types相当于表,Documents则相当…

宠物社区系统宠物领养小程序,宠物救助小程序系统多少钱?

当前很多的宠物被抛弃和虐杀,它们没有选择权,我们强制性的把狗带进人类的生活中,然后又无情的抛弃,让它们无家可归,变成流浪狗,它们做错了什么?流浪动物被主人遗弃之后居无定所,时刻…

海康工业相机如何提高相机帧率

影响帧率的因素 相机参数 帧率限制使能 像素格式 曝光时间 数据包大小(网口) 相机默认参数 ADC位深 系统环境设置

HDU 1716:排列2 ← next_permutation()

【题目来源】http://acm.hdu.edu.cn/showproblem.php?pid1716【题目描述】 Ray又对数字的列产生了兴趣: 现有四张卡片,用这四张卡片能排列出很多不同的4位数,要求按从小到大的顺序输出这些4位数。【输入格式】 每组数据占一行,代…

相机内外参实践之点云投影矢量图

目录 概述 涉及到的坐标变换 深度值可视化 3D点云的2D投影实现 实现效果 参考文献 概述 Camer的内外参在多模态融合中主要涉及到坐标系变换,即像素坐标、相机坐标以及其他坐标系。这篇就针对点云到图像的投影与反投影做代码实践,来构建一张具有深度…

阿里云-maven私服idea访问私服与组件上传

1.进入aliyun制品仓库 2. 点击 生产库-release进入 根据以上步骤修改本地 m2/setting.xml文件 3.pom.xml文件 点击设置获取url 4. idea发布组件

【JAVA学习笔记】 68 - 网络——TCP编程、UDP编程

项目代码 https://github.com/yinhai1114/Java_Learning_Code/tree/main/IDEA_Chapter21/src 网络 一、网络相关概念 1.网络通讯 1.概念:两台设备之间通过网络实现数据传输 2.网络通信:将数据通过网络从一台设备传输到另一台设备 3. java.net包下提供了一系列的类或接口&a…

NFS文件系统共享服务器实战

架设一台NFS服务器,并按照以下要求配置 准备 两台Linux虚拟机一台作为服务端server,一台作为客户端client server IPV4:192.168.110.136/24 client IPV4:192.168.110.134/24 两台服务器都需要关闭防火墙和seLinux 服…

优化编辑距离以测量文本相似度

一、说明 编辑距离是一种文本相似度度量,用于测量 2 个单词之间的距离。它有许多方面应用,如文本自动完成和自动更正。 对于这两种用例中的任何一种,系统都会将用户输入的单词与字典中的单词进行比较,以找到最接近的匹配项&#x…

智慧城市数据中台建设方案:PPT全文51页,附下载

关键词:智慧城市解决方案,数据中台解决方案,智慧城市建设,数据中台技术架构,数据中台建设 一、智慧城市数据中台建设背景 智慧城市数据中台是在城市数字化转型和智能化升级的背景下提出的,旨在实现城市数…