1.StringTokenizer
类
现在还有一些涉及使用字符串的常见场景。你如何将一个字符串分成几个部分?做这件事有很多种方法。
split()
方法
将字符串拆分为多个部分的第一种方法是使用split()
方法。定义特殊分隔字符串的正则表达式必须作为参数传递。您将在Java 多线程任务中了解什么是正则表达式。
例子:
代码 | 结果 |
---|---|
|
结果将是一个包含三个字符串的数组:
|
很简单,但有时这种方法是多余的。如果有很多定界符(例如,空格、换行符、制表符、句点),那么您必须构造一个相当复杂的正则表达式。它很难阅读,因此也很难修改。
StringTokenizer
班级
Java 有一个特殊的类,它的全部工作就是将字符串拆分为子字符串。
此类不使用正则表达式:相反,您只需传入一个由定界符组成的字符串。这种方法的优点是它不会一次将整个字符串分解成多个部分,而是一次从头到尾移动一步。
该类有一个构造函数和两个重要的方法。我们向构造函数传递一个我们拆分成多个部分的字符串,以及一个由一组定界字符组成的字符串。
方法 | 描述 |
---|---|
|
返回下一个子字符串 |
|
检查是否有更多的子字符串。 |
这个类在某种程度上让人想起 Scanner 类,它也有nextLine()
和hasNextLine()
方法。
您可以使用以下命令创建StringTokenizer
对象:
StringTokenizer name = new StringTokenizer(string, delimiters);
string
要分割的字符串在哪里。anddelimiters
是一个字符串,其中的每个字符都被视为分隔符。例子:
代码 | 控制台输出 |
---|---|
|
|
请注意,作为第二个字符串传递给StringTokenizer
构造函数的字符串中的每个字符都被视为分隔符。
2.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$d
%d
代码 | 结果 |
---|---|
|
s 等于"a=13, b=12, c=11" |
%3$d
将获得第三个参数,%2$d
将获得第二个参数,并将%d
获得第一个参数。和格式说明符引用参数,而不管说明符%s
如或%d
%3$d
%2$s
3.字符串池
StringPool
在程序运行时,代码中指定为字符串文字的每个字符串都存储在称为 的内存区域中。StringPool
是一个存放字符串的特殊数组。其目的是优化字符串存储:
首先,代码中指定的字符串必须存储在某个地方,对吗?代码由命令组成,但数据(尤其是大字符串)必须与代码分开存储在内存中。只有对字符串对象的引用才会出现在代码中。
其次,所有相同的字符串文字必须仅在内存中存储一次。这就是它的工作原理。当您的类代码被 Java 机器加载时,所有字符串文字都会添加到StringPool
if 它们还不存在。如果它们已经存在,那么我们只需使用StringPool
.
因此,如果您将相同的文字分配给String
代码中的多个变量,那么这些变量将包含相同的引用。文字将被添加到StringPool
唯一一次。在所有其他情况下,代码将获得对已加载到StringPool
.
以下是它的大致工作原理:
代码 | 使用字符串池 |
---|---|
|
|
这就是为什么a
和b
变量将存储相同的引用。
intern()
方法
最好的部分是您可以通过编程方式将任何字符串添加到StringPool
. 为此,您只需调用String
变量的intern()
方法。
intern()
如果该字符串StringPool
不存在,该方法会将其添加到 中,并返回对 中字符串的引用StringPool
。
如果将两个相同的字符串添加到StringPool
usingintern()
方法中,则该方法返回相同的引用。这可用于通过引用比较字符串。例子:
代码 | 笔记 |
---|---|
|
|
|
|
你不太可能经常使用这种方法,但人们喜欢在面试中询问它。所以知道它总比不知道好。