3.6 字符串
从概念上讲,Java字符串就是Unicode字符序列。例如,串“Java\u2122”由五个Unicode字符J、a、v、a和™。Java没有内置的字符串类型,而是在标准Java类库中提供了一个预定义类,很自然地叫做String。每个用双引号火起来的字符串是String类的一个实例:
String e =""; // an empty string
String greeting = "Hello";
3.6.1 子串
String类substring方法可以从一个较大的字符串提取出一个子串。例如:
String greeting ="Hello";
String s = greeting.substring(0,3);
创建了一个由字符“Hel”组成的字符串。
substring方法的第二个参数是不想复制的第一个位置。这里要复制位置为0,1,和2(从0到2,包括0和2)的字符。在substring中从0开始计数,直到3为止,但是不包括3。
substring的工作凡是有一个优点,容易计算子串的长度。字符串s.substring(a,b)的长度为b-a。
3.6.2 拼接
与绝大多数的程序设计语言一样,Java语言允许使用+号链接(拼接)两个字符串。
String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;
上述代码将“Expletivedeleted”赋给变量message(注意,单词之间没有空格,+号按照给定的次序将两个字符串拼接起来)
当将一个字符串与一个非空字符串值进行拼接时,后者被转换成字符串。例如:
int age = 13;
String rating = "PG"+age;
rating 设置为“PG13”。
这种特性通常用在输出语句中。例如:
System.out.println("This answer is "+ answer);
3.6.3 不可变字符串
String类没有提供用于修改字符串的方法。由于不能修改Java字符串中的字符,所以在Java文档中将String类对象称为不可变字符串,如果数字3永远是数字3一样,字符串“Hello”永远包含字符H、e、l、l、o的代码单元,而不能修改其中的任一个字符。当然,可以修改字符串变量getting,让他引用另外一个字符串,这就如同可以将存放3的数值变量改变成存放4一样。
3.6.4 检测字符串是否相等
可以换使用equals方法检测两个字符串是否相等,对于表达式:
s.equals(t);
如果字符串s与字符串t相等,则返回true;否则,返回false。需要注意,s与t可以是字符串变量,也可以是字符串常量。例如
"Hello".equals(greeting);
要想检测两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法。
"Hello".equalsIgnoreCase("hello");
一定不能使用==运算符检测两个字符串是否相等!这个运算符只能够确定两个字符串是否放置在同一个位置上。当然,如果字符串放置在同一个位置上,它们必然相等。但是,完全有可能内容相同的多个字符串的拷贝放置在不同的位置上。
String greeting = "Hello";
if(greeting == "Hello")
// probably true
if(greeting.substring(0,3) == "Hel")
// probably false
如果虚拟机始终将相同的字符串共享,就可以使用==运算符检测是否相等。但实际只有字符串常量是共享的,而+活substring等操作产生的结果并不是共享的。因此,千万不要使用==运算符测试字符串是否相等。
3.6.5 空串与Null串
空字“”是长度为0的字符串。可以调用以下diamante检查一个字符串是否为空:
if(str.lenght() == 0)
或
if("".equals(str))
空串是一个java对象,有自己的串长度(0)和内容(空)。不过,String变量还可以存放一个特殊的值,名为null,这表示目前没有任何对象与该变量关联。要检查一个字符串是否为null,要使用以下条件
if(str == null)
有时要检查一个字符串既不是null也不为空串,这种情况下就需要使用以下条件:
if(str != null && str.length() != 0)
首先要检查str 不为null
3.6.6 代码点与代码单元
Java字符串由char序列组成。char数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元。大多数的常用Unicode代码点的代码单元。大多数的常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。
length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量。例如:
String gretting = "Hello";
int n = greeting.length();//is 5
要想得到实际的长度,即代码点数量,可以调用:
int cpCount = greeting.codePointCount(0,greeting.length());
调用s.charAt(n)将返回位置n的代码单元,n介于0~greeting.length()-1之间。例如:
char first = greeting.charAt(0);//first is 'H'
char last = greeting.charAt(4);//last is 'o'
要想得带第i个代码点。应该使用下列语句
int index = greeting.offsetByCodePoints(0,i);
int cp = greeting.codePointAt(index);
3.6.7 字符串API
Java中的String类包含了50多个方法。
String | 解释 |
---|---|
char charAt(int index) | 返回给定位置的代码单元。除非对底层的代码单元感兴趣,否则不需要代用这个方法 |
int codePointAt(int index) | 返回从给定位置开始或结束的代码点。 |
int offsetByCodePoints(int startIndex,int cpCount) | 返回从startIndex代码点开始,位移cpCount否的代码点索引 |
int compareTo(String other) | 按照字典顺序,如字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0 |
boolean endWith(String suffix) | 如果字符串返回suffix结尾,返回true |
boolean equals(Object other) | 如果字符串与other相等,返回true |
boolean equalsIgnoreCase(String other) | 如果字符串与other相等(忽略大小写),返回true |
int indexOf(String str) | |
int indexOf(String str,int fromIndex) | |
int indexOf(int cp) | |
int indexOf(int cp,int fromIndex) | 返回字符串stee或代码点cp匹配的第一个子串的开始位置。这个位置从索引0或fromIndex开始计算。如果原始串中不存在str,返回-1。 |
int lastIndexOf(String str) | |
int lastIndexOf(String str,int fromIndex) | |
int lastIndexOf(int cp) | |
int lastIndexOf(int cp,int fromIndex) | 返回字符串stee或代码点cp匹配的最后一个子串的开始位置。这个位置从原始串尾端或fromIndex开始计算。 |
int length() | 返回字符串的长度 |
int codePointCount(int startIndex,int endIndex) | 返回startIndex和endIndex-1之间的代码点数量。没有匹配成对的代用字符将计入代码点。 |
String replace(CharSequence oldString,CharSequence newString) | 返回一个新字符串。这个字符串用newString代替原始字符串中所有的oldString。可以用String或StringBuilder对象作为CharSequence参数。 |
boolean startWith(String prefix) | 如果字符串以preffix字符串开始,返回true |
String substring(int beginIndex) | |
String substring(int beginIndex,int endIndex) | 返回一个新字符串。这个字符串包含原始字符串从beginIndex到川味或endIndex-1的所有代码单。 |
String toLowerCase() | 返回一个新字符串。这个字符串原始字符串中的所有大写字母改成小写字母。 |
String toUpperCase() | 返回一个新字符串。这个字符串将原始字符串中的所有小写字母改成大写字母。 |
String trim() | 返回一个新字符串。这个字符串讲删除了原始字符串头部和尾部的空格。 |
3.6.9 构建字符串
有些时候,需要由较短的字符串构建字符串。例如,按键或来自文件的单词。采用字符串连接的方式达到此目的的效率比较低,每次连接字符串,都会构建一个新的String对象,即耗时,由浪费空间。使用StringBuilder类就可以避免这个问题的发生。
如果需要使用许多小段的字符串构建一个字符串,那么应该按照下列步骤进行。首先,构建一个空的字符串构建器:
StringBuilder builder = new StringBuilder();
当每次需要添加一部分内容时,就调用append方法。
builder.append(ch);
builder.append(str);
在需要构建字符串时就调用toString方法,将可以得到一个Srting对象,其中包含了构建器中的字符序列。
String completedString = builder.toString();
API 文档:
StringBuilder | 解释 |
---|---|
StringBuilder() | 构造一个空的字符串构建器 |
int length() | 返回构建器或缓冲器中的代码单元数量 |
StringBilder append(String str) | 追加一个字符串并返回this。 |
StringBuilder append(char c) | 追加一个代码单元返回this。 |
StringBuilder appendCodePoint(int cp) | 追加一个代码点,并将其转换为一个或两个代码单元返回this。 |
void setCharAt(int i,char c) | 将第i个代码单元设置为c。 |
StringBuilder insert(int offset,String str) | 在offset 位置插入一个代码单元并返回this |
StringBuilder delete(int startIndex,int endIndex) | 删除便宜量从startIndex到-endIndex-1的代码单元并返回this。 |
String toString() | 返回一个与构建器或缓冲器内存相同的字符串 |