在本文中,我们将帮助您理解 Java 中的子字符串。 我们不仅会给您理论解释,还会给您真实的代码示例来帮助您可视化。 我们将教您如何创建子字符串并帮助您在字符串中查找子字符串。
但在学习它们之前,我们必须了解子串的基础知识。
目录
什么是字符串和子字符串?
在 Java 上下文中,字符串表示字符序列。 Java 中的每个字符串都是一个对象。 Java 中的字符串可以包含字符、符号,甚至空格。 另一方面,Java 中的子字符串是 Java 字符串的一部分或子集。
例如,“Geek”是“techblik.com”的子字符串。 子字符串可帮助您获取字符串的特定部分。
如果您有名字“John Doe”并且您只想要名字“John”,则可以通过子字符串轻松获取它。 此外,考虑到你有一个名字列表“John,Jack,Jolly”,并且你想找出“John”是否在其中,你也可以使用子字符串来完成。 这些仅是示例。 一旦我们理解了子字符串,我们就可以在各种操作中使用它们。
现在我们已经了解了 Java 中子字符串的概念,现在让我们了解如何在 Java 中创建和使用子字符串。
#1. 使用“substring()”方法
‘substring()’ 方法让我们可以非常轻松地创建子字符串。 它最多需要两个参数作为输入 – startIndex 或 startIndex 和 endIndex 并返回我们想要的子字符串。
根据参数的数量,我们可以通过两种方式使用它。 现在,让我们详细了解它们。
子字符串(int startIndex)
首先,我们可以使用“substring(startIndex)”形式的方法。 这里,该方法接受一个整数值作为输入,其中输入是子字符串的起始位置。 它返回一个从提供的起始索引开始直到原始字符串末尾的字符串。
作为示例,让我们看一下以下代码:
public class Substrings{ public static void main(String args[]){ String str="techblik.com"; System.out.println("Given String: " + str); System.out.println("Substring: " +str.substring(4)); //index of strings start from 0 } }
输出:
Given String: techblik.com Substring: Flare
从输出中我们看到输入字符串是“techblik.com”,返回值是子字符串“Flare”。 它从给定索引 (4) 生成一个子字符串,即从位置 5 到字符串末尾。
子字符串(int startIndex,int endIndex)
这是使用 String 类的 substring 方法的另一种方式。 我们可以将两个整数传递给 substring 方法。 起始索引和结束索引。 要使用它,我们必须使用“substring(startIndex,endIndex)”格式的方法。
为了进一步理解它,让我们看一些示例代码:
public class Substrings{ public static void main(String args[]){ String str="GeekFlareFans"; System.out.println("Given String: " + str); System.out.println("Substring: " +str.substring(4,9)); //You get a substring starting from index no. 4 to index 8. } }
输出:
Given String: GeekFlareFans Substring: Flare
正如我们所看到的,给定字符串“GeekFlareFans”,它输出子字符串“Flare”。 我们给出的起始索引为 4,结束索引为 9。它从索引为 4 的元素开始,到 9 之前结束。我们必须注意,它不会打印结束索引的元素。 它为我们提供了一个子字符串,其中包含结束索引之前的所有元素,但不包括结束索引的元素。
#2. 使用“split()”方法
“split()”是 Java 中 String 类的另一个方法,可以帮助我们创建子字符串。 当多条信息存储在一个具有公共分隔符的字符串中时,它非常有用。
语法中提到了术语“正则表达式”,这对您来说可能有点吓人,所以在继续之前让我们先了解一下正则表达式是什么。 正则表达式是“正则表达式”的简称。 正则表达式是描述字符串或文本内模式的字符序列。 在 split 方法的上下文中,正则表达式是我们的分隔符。
“split()”方法最多可以接受两个变量作为输入,它们是正则表达式字符串和限制整数。 正则表达式是分隔符,找到它后,会将原始字符串分成两部分 – 正则表达式之前的部分和正则表达式之后的部分。
例如,假设您尝试将字符串“abcdef”与“bcd”拆分为正则表达式。 我们将得到子字符串“a”和“ef”作为结果。
该方法返回一个包含分隔字符串的数组。 我们可以仅指定正则表达式,也可以同时指定正则表达式和限制。 我们来一一了解一下该方法的多种调用方式。
分割(字符串正则表达式)
第一个方法仅接收“split(regex)”格式的正则表达式字符串。 它没有限制变量; 因此返回数组中所有分隔的子字符串。
让我们通过一些代码来清楚地理解:
public class Substrings{ public static void main(String args[]){ String str="Geek%Flare"; String[] substrings=str.split("%"); System.out.println("Given String: " + str); System.out.println("First Substring: " + substrings[0]); System.out.println("Second Substring: " + substrings[1]); } }
输出:
Given String: Geek%Flare First Substring: Geek Second Substring: Flare
正如我们从代码中观察到的,给定的字符串有一个分隔符正则表达式“%”。 它不必是单个字符,它可以是具有任意数量字符的任何字符串。 “split()”方法忽略此正则表达式,并为我们提供由此正则表达式分隔的所有字符串。 子字符串存储在数组内。
在代码中,给定的字符串是“Geek%Flare”。 因此,我们得到一个包含两个元素的数组,即“Geek”和“Flare”。 后来我们使用它们各自的索引(分别为 0,1)访问它们,并将“Geek”和“Flare”打印到控制台。
这里我们还应该注意,如果没有参数传递给该方法,它只会抛出一个错误。 但是如果我们给出一个空字符串(“”)作为正则表达式,我们将得到每个单独的字符作为子字符串。 让我们看一下示例来形象化。
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare"; String[] substrings=str.split(""); System.out.println(Arrays.toString(substrings)); } }
输出:
[G, e, e, k, %, F, l, a, r, e]
从示例中可以看出,正则表达式参数是一个空字符串,它返回所有字符作为单独的子字符串,我们可以通过打印“split()”方法的输出数组清楚地看到这一点。
split(字符串正则表达式,int限制)
使用此方法的第二个变体,我们可以更好地控制输出,并且可以进一步微调“split()”方法的输出。 这里,“split()”方法采用两个变量作为输入。 在这种情况下,除了正则表达式之外,我们还以指定格式“split(regex, limit)”给出一个限制参数。
“限制”是输出的结果字符串的数量。 根据限制的值,可能存在三种可能性:
情况 1:如果 limit>0,则结果数组将包含输出,但最多会应用 split (limit-1) 次。 在这里,结果数组所包含的元素不会超过指定的限制,并且所有未拆分的剩余字符串将按原样存储。 让我们用一些代码让它更容易理解。
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%the%best"; String[] substrings=str.split("%",2); System.out.println(Arrays.toString(substrings)); } }
输出:
[Geek, Flare%is%the%best]
在输出中查看结果数组中只有两个元素,即 limit 参数中给出的数字。 另请注意,拆分仅应用一次,因此 (limit-1) 次。
但是,如果正则表达式连续出现两次(“%%”),则它将有空子字符串。 查看这段代码可以更好地理解它。
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%%the%best%%%"; String[] substrings=str.split("%",5); System.out.println(Arrays.toString(substrings)); } }
输出:
[Geek, Flare, is, , the%best%%%]
基本上,如果“%”后面跟着另一个“%”或字符串末尾,它就会转换为空子字符串。
情况 2:如果 limit<0,则分割操作将应用尽可能多的次数,对数组大小没有限制,但如果正则表达式连续出现两次(“%%”),则数组将包含空子字符串。
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%%the%best%%%"; String[] substrings=str.split("%",-1); System.out.println(Arrays.toString(substrings)); } }
输出:
[Geek, Flare, is, , the, best, , , ]
从输出中可以看出,分割被应用了尽可能多的次数,并且还存在空子字符串。
情况 3:如果 limit=0,分割操作也会尽可能多次地应用,但这里字符串末尾的所有空子字符串都将从数组中丢弃。
import java.util.Arrays; public class Substrings{ public static void main(String args[]){ String str="Geek%Flare%is%%the%best%%%"; String[] substrings=str.split("%",0); System.out.println(Arrays.toString(substrings)); } }
输出:
[Geek, Flare, is, , the, best]
我们可以看到当 limit=-1 和 limit=0 时的输出非常相似,但没有尾随空子字符串。 换句话说,子字符串数组末尾的空子字符串将被忽略。
另请注意,如果字符串中不存在正则表达式,它将返回整个原始字符串作为结果。
查找字符串是否包含子字符串
除了从现有字符串创建子字符串之外,我们还可以指定一个子字符串并查找该子字符串是否存在于字符串中。 这是查询子字符串的一种快速且简单的方法,在许多用例中都很有用。 但我们该怎么做呢? 有多种方法可以帮助我们实现这一目标。 让我们一一分析一下。
使用“contains()”方法:
我们可以使用“contains()”方法很容易地找到子字符串的存在。 String 类的这个方法接受一个字符串作为输入,这是我们的子字符串,并返回一个布尔值,检查子字符串是否在字符串内部。 此方法可以在 if-else 块、一元运算符和其他各种地方使用来实现复杂逻辑。
让我们进一步了解一下这个方法。
public class Substrings{ public static void main(String args[]){ String str="techblik.com"; System.out.println("Does it contain Flare? n"+ str.contains("Flare")); } }
输出:
Does it contain Flare? true
该代码检查字符串“techblik.com”中是否有单词“Flare”,成功找到后,它返回一个布尔值“true”,从而确认子字符串的存在。
public class Substrings{ public static void main(String args[]){ String str="techblik.com"; System.out.println("Does it contain Flare? n"+ str.contains("Flare1")); } }
输出:
Does it contain Flare? false
从示例中我们了解到,如果子字符串不在字符串内部,该方法将返回 false 以表示其不存在。 这样我们就可以很容易地确定子字符串是否存在。
查找子串的位置
#1. 使用“indexOf()”:
‘indexOf()’ 方法可用于查找子字符串是否存在以及查找其索引。 该方法将字符串或字符作为输入,并给出其第一次出现的位置。 但它只能给我们第一次出现的索引,无法确认是否存在其他出现的情况。 这里还要注意的另一件事是,如果子字符串不存在,则该方法返回-1。
那么让我们进一步探讨一下这个方法。
public class Substrings{ public static void main(String args[]){ String str="GeekFlareGeekFlare"; System.out.println("Index of Flare: "+ str.indexOf("Flare")); } }
输出:
Index of Flare: 4
在示例中,子字符串“Flare”的第一次出现从字符串“GeekFlareGeekFlare”中的索引 4 开始。 因此,正如预期的那样,该函数返回了索引。
#2. 使用“lastIndexOf()”:
“lastIndexOf()”与“indexOf()”非常相似。 这两种方法都将子字符串作为输入并返回其位置的索引。 当它在指定字符串中找不到子字符串时,它甚至具有相同的返回值。 如果查找不成功,这两种方法都会返回 -1。
但是,“indexOf()”返回子字符串第一次出现的索引,而“lastIndexOf()”则返回最后一个出现的位置。
让我们通过代码看看它的实际效果:
public class Substrings{ public static void main(String args[]){ String str="GeekFlareGeekFlare"; System.out.println("Last index of Flare: "+ str.lastIndexOf("Flare")); } }
输出:
Last index of Flare:13
观察此输出,我们了解到方法“lastIndexOf()”的行为符合预期,并且我们获得了字符串“GeekFlareGeekFlare”中最后一次出现的子字符串“Flare”的索引。
常见问题解答
如何使用“split()”方法创建非空子字符串?
如果主字符串中有多个正则表达式字符串的正则表达式实例(“Hello%%Hi”,其中正则表达式为“%”),则“split()”方法将第一个实例视为中断字符,其余实例输出空字符串。 为了缓解这种情况,我们可以将 limit 参数指定为 0。因此它只会给出非空字符串作为输出。
‘indexOf()’ 是否返回子字符串所有实例的索引?
不,“indexOf()”不会返回子字符串所有实例的索引。 使用“indexOf()”,我们得到一个整数返回值,其中包含子字符串第一次出现的索引。 但如果找不到子字符串,该方法将返回-1。
如果字符串中不存在给定的索引,“substring()”方法会返回什么?
如果字符串中不存在给定的起始索引和结束索引,编译器将抛出错误。 错误应该是“java.lang.StringIndexOutOfBoundsException:”,并且它根本不会执行。
结论
在本文中,我们讨论了开始使用子字符串的各种方法和要点。 我们讨论了创建子字符串并检查字符串中子字符串是否存在。 这将使您更好地理解如何使用子字符串。 按照示例进行更多练习,以全面了解子字符串。
接下来,您可以查看我们的 Java 面试问题列表。