目录

1、字符串定义

2、获取子串

3、拼接字符串

4、不可变字符串

5、判断字符串相等

6、空串与null串

7、代码点与代码单元

8、构建字符串

9、字符串API


1、字符串定义

从概念上来讲,Java字符串就是Unicode字符序列。Java没有内置的字符串类型,而是在标准就Java类库中提供了一个预定义类,很自然地叫做String。每个用双引号括起来的字符串都是String类的一个实例:

String a = ""; //an empty string
String greet = "Hello";

2、获取子串

String类的substring方法可以从一个较大的字符串中提取出一个子串。如:

String greet = "Hello";
String s = greet.substring(0, 3);

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

3、拼接字符串

与绝大数语言一样,Java允许使用+号连接两个字符串。

String expletive = "Expletive";
String PG13 = "deleted";
String message = expletive + PG13;

上述代码将“Expletivedeleted”赋给变量message。

当将一个字符串预一个非字符串的值进行拼接时,后者被转换成字符串,如:

int age = 13;
String rating = "PG" + age;

rating设置为“PG13”;

4、不可变字符串

String类没有提供用于修改字符串的方法。如果想要修改greet的值为“Help!”,解决方法有二:

其一,提取“Hel”再拼接“p!”,代码如下:

greet = greet.substring(0, 3) + "p!";

其二,创建一个新字符串“Help!”,再让greet去引用“Help!”,代码如下:

greet = "Hellp!";

从中我们可以发现,我们不能直接的修改字符串的内容,而是去创建并引用了一个新的字符串(不被引用的字符串Java会自动回收,不用担心内存遗漏的问题),这正是Java字符串的“不可变字符串”的特点:编译器可以让字符串共享

注:C语言中字符串是字符型数组,即char greet[] = "Hello"; Java的字符串更像C语言中的char*指针即char* greet = "Hello"; C++中字符串的机制和Java差不多,但是C++中字符串是可以修改的,也就是说可以修改字符串中的单个字符,Java字符串不可修改。

5、判断字符串相等

可以使用equals方法判断两个字符串是否相等。对于表达式:s.equals(t); 如果字符串s与字符串t相等,则返回true,否则返回false,注意,s和t可以是字符串变量,也可以是字符串常量,如:

"Hello".equals(greet);

如果像判断两个字符串是否相等,而不区分大小写,可以使用equalsIgnoreCase方法:

"Hello".equalsIgnoreCase("hello");

注意,一定不能使用==运算符来判断两个字符串是否相等!这个运算符只能判断两个字符串是否放置在同一个位置上,示例代码如下:

String greet = "Hello"; //initialize greet to a string
if(greet == "Hello")...
//probably true
if(greet.substring(0, 3) == "Hel")...
//probably false

 也就是说,如果虚拟机始终将相同的字符串共享,就可以使用==运算符判断字符串是否相等。但实际上只有字符串常量是共享的,而+或substring等操作产生的结果并不是共享的,因此,千万不要使用==运算符来判断字符串是否相等。

6、空串与null串

空串""是长度为0的字符串,它是一个Java对象,有自己的串长度(0)和串内容(空),检查字符串是否为空:

if(str.length() == 0) 或 if(str.equals(""))

null串,指目前没有任何对象与该变量关联,检查字符串是否为null:

if(str == null)

检查一个字符串既不是null也不为空串:

if(str != null && str.length() != 0)

7、代码点与代码单元

Java字符串由char序列组成。cahr数据类型是一个采用UTF-16编码表示Unicode代码点的代码单元,大多数常用Unicode字符使用一个代码单元就可以表示,而辅助字符需要一对代码单元表示。

length方法将返回采用UTF-16编码表示的给定字符串所需要的代码单元数量,如:

String greet = "Hello";
int n = greet.length(); // is 5

要想得到实际的长度,即代码点数量,可以调用:

int cpCount = greet.codePointCount(0, greet.length());

charAt(n)方法可以返回字符串第n个位置的代码单元,如:

char first = greet.charAt(0); // 'H'
char last = greet.charAt(4); // 'o'

想要得到第i个代码点,可以调用:

int index = greet.offsetByCodePoints(0, i);
int cp = greet.codePointAt(index);

如果想要遍历一个字符串,并且依次查看每一个代码点,可以使用下列语句:

int cp = sentence.codePointAt(i);
if(Character.isSupplementaryCodePoint(cp)) i += 2;
else i++;

8、构建字符串

有些时候,需要由较短的字符串构建字符串,每次连接字符串的话,都会创建一个新的String对象,既耗时又浪费空间,使用StringBuilder类就可以避免这个问题的发生:

StringBuilder builder = new StringBuilder();
builder.append(ch); //appends a single character
builder.append(str); // appends a string
String completedString = builder.toString();

9、字符串API

下面是Java中String类(java.lang.string 1.0)的一些常用方法:

char chaAt(int index):返回给定位置的代码单元。

int codePointAt(int index):返回给定位置开始或结束的代码点。

int offsetByCodePoints(int startIndex, int cpCount):返回从startIndex代码点开始,位移cpCount后的代码点索引。

int compareTo(String other):按照字典顺序,如果字符串位于other之前,返回一个负数;如果字符串位于other之后,返回一个正数;如果两个字符串相等,返回0。

boolean endsWith(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):返回与字符串str或代码点cp匹配的第一个子串的开始位置,这个位置从索引0或fromIndex开始计算。

int lastIndexOf(String str)

int lastIndexOf(String str, int fromIndex)

int lastIndex(int cp)

int lastIndex(int cp, int fromIndex):返回与字符串str或代码点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):如果字符串以prefix字符串开始,返回true。

String substring(int beginIndex)

String sustring(int beginIndex, int endIndex):返回一个新字符串,这个字符串包含原始字符串中从beginIndex到串尾或endIndex-1的所有代码单元。

String toLowerCase():返回一个新字符串,这个字符串将原始字符串中的所有大写字母改成了小写字母。

String toUpperCase():返回一个新字符串,这个字符串将原始字符串中的所有小写字母改成了大写字母。

Sring trim():返回一个新字符串,这个字符串删除了原始字符串头部和尾部的空格。

 

下面是StringBuilder类(java.lang.StringBuilder 5.0)中的一些重要方法:

StringBuilder():构造一个空的字符串构建器。

int length():返回构建器或缓冲器中的代码单元数量。

StringBuilder 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 insert(int offset, char c):在offset位置插入一个代码单元并返回this。

StringBuilder delete(int startIndex, int endIndex):删除偏移量从startIndex到endIndex-1的代码单元并返回this。

String toString():返回一个与构建器或缓冲器内容相同的字符串。