作为 Codegym 大学课程一部分的导师授课片段。报名参加完整课程。
“嗨,阿米戈!今天我们将分析一些涉及字符串的更常见的场景。例如,你知道如何将字符串拆分成几个部分吗?”
“我不会马上告诉你,艾莉。但你会告诉我的,对吧?”
split()
方法
”有几种方法可以做到这一点。第一种方法是将一个字符串拆分成多个部分,使用方法。split()
必须将定义特殊分隔字符串的正则表达式作为参数传递。您将了解正则表达式是什么Java集合任务。
例子:
代码 | 结果 |
---|---|
|
结果将是一个包含三个字符串的数组:
|
很简单,但有时这种方法是多余的。如果有很多定界符(例如,空格、换行符、制表符、句点),那么您必须构建一个相当复杂的正则表达式。”
“好吧,当然。如果它难以阅读,那么就很难做出改变。
StringTokenizer
班级
作为 Codegym 大学课程一部分的导师授课片段。报名参加完整课程。
“Java 有一个特殊的类,它的全部工作就是将字符串拆分为子字符串。
“此类不使用正则表达式:相反,您只需传入一个由定界符组成的字符串。这种方法的优点是它不会一次将整个字符串分成几部分,而是从头到尾移动一个一步一步。
该类有一个构造函数和两个方法。我们向构造函数传递一个我们拆分成多个部分的字符串,以及一个由一组定界字符组成的字符串。
方法 | 描述 |
---|---|
|
返回下一个子字符串 |
|
检查是否有更多的子字符串。 |
“这个类让我想起了 Scanner 类,它也有nextLine()
和hashNextLine()
方法。
“你观察得很好。你可以StringTokenizer
用这个命令创建一个对象:
StringTokenizer name = new StringTokenizer(string, delimiters);
其中 string 是要分成几部分的字符串。而delimiters是一个字符串,其中的每一个字符都被当作一个分隔符。例子:
代码 | 控制台输出 |
---|---|
|
|
“请注意,在第二个字符串中传递给StringTokenizer
构造函数的字符串中的每个字符都被视为分隔符。
String.format()
方法和StringFormatter
类
“String 类的另一个有趣的方法是format()
。
“假设你有各种变量存储数据。你如何在一行中将它们显示在屏幕上?例如,我们有一些数据(左列)和所需的输出(右列):
代码 | 控制台输出 |
---|---|
|
|
此类程序的代码如下所示:
程序代码 |
---|
|
“你会同意我的看法,代码可读性不是很好。如果变量名更长,那么代码会变得更加困难:
程序代码 |
---|
|
“是的,这是一个艰难的阅读!”
”别着急,这在现实程序中很常见,所以我想告诉你一种方法,可以把这段代码写得更简单、更简洁。
String.format
“这个String
类有一个静态format()
方法:它让你指定一个模式来用数据组装一个字符串。命令的一般外观如下:
String name = String.format(pattern, parameters);
例子:
代码 | 结果 |
---|---|
|
|
|
|
|
|
“该方法的第一个参数是一个格式字符串,它包含所有需要的文本以及在需要插入数据的地方format()
称为格式说明符(例如%d
和)的特殊字符。%s
"该format()
方法将这些%s
和%d
格式说明符替换为参数列表中格式字符串后面的参数。如果我们要插入一个字符串,那么我们写。%s
如果我们要插入一个数字,那么格式说明符是%d
。示例:
代码 | 结果 |
---|---|
|
s 等于"a=1, b=4, c=3" |
“这是一个简短的格式说明符列表,可以在格式字符串中使用:
说明符 | 意义 |
---|---|
|
String |
|
整数:byte , short , int ,long |
|
实数:float ,double |
|
boolean |
|
char |
|
Date |
|
% 特点 |
"这些说明符指示数据的类型,但也有指示数据顺序的说明符。要通过其编号获取参数(编号从 1 开始),您需要编写"%1$d "而不是" %d ”。示例:
代码 | 结果 |
---|---|
|
s 等于"a=13, b=12, c=11" |
%3$d
将获得第三个参数,%2$d
将获得第二个参数,并将%d
获得第一个参数。和格式说明符引用参数,而不管说明符%s
如或%d
%3$d
%2$s
字符串池
StringPool
》在程序运行时,代码中指定的每一个字符串都存储在一个叫做 的内存区域中。StringPool
是一个专门存储字符串的数组。它的目的是优化字符串存储:
“首先,代码中指定的字符串必须存储在某个地方,对吗?代码由命令组成,但数据(尤其是大字符串)必须与代码分开存储在内存中。只有对字符串对象的引用才会出现在代码中。
“其次,所有相同的字符串文字只能在内存中存储一次。这就是它的工作原理。当您的类代码由 Java 机器加载时,如果所有字符串文字不存在,则将它们添加到内存中。如果它们StringPool
存在已经存在,那么我们只需使用来自StringPool
.
因此,如果您在代码中将相同的文字分配给多个 String 变量,那么这些变量将包含相同的引用。文字将被添加到StringPool
唯一一次。在所有其他情况下,代码将获得对已加载到StringPool
.
以下是它的大致工作原理:
代码 | 使用 StringPoll |
---|---|
|
|
“这就是为什么a
和b
变量将存储相同的引用。”
“我希望我理解正确。
intern()
方法。
“最好的部分是您可以通过编程方式将任何字符串添加到StringPool
. 为此,您只需要调用String
变量的intern()
方法。
“如果intern()
字符串StringPool
不存在,该方法会将字符串添加到StringPool
.
StringPool
“如果使用该方法添加两个相同的字符串会发生什么intern()
?”
“该方法将返回相同的引用。这可用于通过引用比较字符串。示例:
代码 | 笔记 |
---|---|
|
|
|
|
您不太可能经常使用此方法。也就是说,人们喜欢在工作面试中询问它。
“所以,知道总比不知道好。谢谢,艾莉!”
GO TO FULL VERSION