Java中的字符串String

从概念上讲,Java字符串就是Unicode字符序列。例如,串“Java\u2122”由5个Unicode字符J、a、v、a和TM。
Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然的叫做String。每个用引号
括起来的字符串都是String类的一个实例:
String e = ""; // an empty string
String greeting = "hello";

1)子串
String类的substring方法可以从一个较大的字符串提取出一个子串。例如:
String greeting = "Hello";
String s = greeting.substring(0, 3);

创建了一个由字符“Hel”组成的字符串。


图1
substring方法的第二个参数是不想复制的第一个位置。这里要复制位置为0、1和2的字符。在substring中从0开始
计数,直到3为止,但不包含3。
substring的工作方式有一个优点:容易计算子串的长度。字符串s.substring(a, b)的长度为b-a。

2)拼接
与大多数的程序设计语言一样,Java语言允许使用+号连接(拼接)两个字符串。
String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;
上述代码将“Expletivedeleted”赋给变量message(注意,单词间没有空格,+号按给定次序将两个字符串拼接起来)。
当将一个字符串与一个非字符串的值进行拼接时,后者被转换成字符串。例如
int age = 13;
String rating = "PG" + age;
rating设置为“PG13”。
任何一个Java对象都可以转换成字符串,这种特性通常用在输出语句中。例如:
System.out.println("The answer is " + answer);

这是一条合法语句,并且会打印出所希望的结果。


图2

3)不可变字符串
String类没有提供用于修改字符串的方法,由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为
不可变字符串,如同数字3永远是数字3一样,字符串“Hello”永远包含字符H、e、l、l和o的代码单元序列。当然,可以
修改字符串变量greeting,让它引用另外一个字符串,这就如同可以将存放3的数值变量改存成4一样。
这样做是否会降低运行效率?
看起来好像修改一个代码单元要比创建一个新字符串更加简洁。答案是:也对,也不对。的确,通过拼接“Hel”和“p!”
来创建一个新字符的效率确实不高。但是,不可变字符串却有一个优点:编译器可以让字符串共享。
我们可以想像这里有一个存放各种字符串的公共存储池,字符串变量指向存储池中相应的位置,如果复制一个字符串变量,
原始字符串与复制的字符串共享相同的字符。
总而言之,Java的设计者认为共享带来的高效远远胜过提取、拼接字符串所带来的低效率。查看一下程序会发现:很少需要
修改字符串,而是往往需要对字符串进行比较(有一种例外情况,将源自于文件或键盘的单个字符或较短的字符串汇集成
字符串,为此,Java提供了一个独立的类,之后我会对其进行介绍)。

4)检测字符串是否相等
可以使用equals方法检测两个字符是否相等。对于表达式:
s.equals(t);
如果字符串s与字符串t相等,则返回true,否则,返回false。需要注意,s与t可以是字符串变量,也可以是字符串常量。
要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase()方法。
"Hello".equalsIgnoreCase("hello");

一定不能使用==运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上。当然,如果
字符串放置在同一个位置上,它们必然相等。但是,完全有可能将内容相同的多个字符串的拷贝放置在不同的位置上。
String greeting = "Hello"; //initialize greeting to a string 
if(greeting == "Hello")
//probably true
if(greeting.substring(0,3) == "Hel")
//probably false
如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。 但实际上,只有字符串是共享的,而+或substring
等操作产生的结果并不是共享的
。因此,千万不要使用==运算符测试字符串的相等性,以免在程序中出现糟糕的bug。从表面上看,

这种bug很像随机产生的间歇性错误。


图3


5)空串与Null串
空串""是长度为0的字符串,可以调用以下代码检查一个字符串是否为空:
if(str.length() == 0)

if(str.equals(""))
空串是一个Java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这
表示目前没有任何对象与该变量关联。要检查一个字符串是否为null,要使用以下条件:
if(str == null)
有时要检查一个字符串既不是null也不为空串,这种情况下需要使用以下条件:
if(str != null && str.length() != 0)
首先要检查str不为null,因为如果在一个null值上调用方法,会出错误。

6) 代码点与代码单元

7)构建字符串
有时候需要由较短的字符串构建字符串例如,按键或来自文件的单词。采用字符串连接的方式达到此目的效率比较低。
每次连接字符串,都会构建一个新的String对象,既耗时,又浪费空间。使用StringBuilder类就可以避免这个问题的
发生。
如果需要用许多小段的字符串构建一个字符串,那么应该按照以下步骤进行。
首先,构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();
当每次需要添加一部分内容时,就调用append方法。
builder.append(ch); //appends a single character
builder.append(str); //appends a string
在需要构建字符串时就调用toString()方法,将可以得到一个String对象,其中包含了构建器中的字符序列。
String completedString = builder.toString();

注释:在JDK5.0中引入StringBuilder类。这个类的前身是StringBuffer,其中效率稍有些低,但允许采用多线程的
方式执行添加或删除字符的操作。如果所有字符串在一个单线程中编辑,则应该用StringBuilder替代它。两个类的
API是相同的。



猜你喜欢

转载自blog.csdn.net/m0_37732829/article/details/80593914