开始讲解之前,先列出本章的提纲,如下图所示:

\"\"

5.1 String类

5.1.1 声明字符串

String str;

5.1.2 创建字符串

String str1 = new String(\"student\");
System.out.println(str1);

char a[] = {\'s\', \'t\', \'u\', \'d\', \'e\', \'n\', \'t\'};
String str2 = new String(a);
System.out.println(str2);

char b[] = {\'s\', \'t\', \'u\', \'d\', \'e\', \'n\', \'t\'};
String str3 = new String(b, 2, 4);
System.out.println(str3);

// 字符串常量
String str4 = \"We are students\";
String str5 = \"We are students\";
System.out.println(str4 == str5); // str4与str5引用相同的内存地址

 输出结果如下图所示:

\"\"

5.2 连接字符串

5.2.1 连接多个字符串

String str1 = new String(\"hello\");
String str2 = new String(\"world\");
String str = str1 + \" \" + str2;
System.out.println(str);    // 输出hello world

注意事项:Java中一句相连的字符串不能分开在两行中写,如下图所示

\"\"

可以看出,这种写法是错误,无法编译通过,如果一个字符串过长,为了便于阅读,想将这个字符串分在两行上书写,此时可以使用“+”将两个字符串连接起来,之后在加号处换行,如下面语句所示:

System.out.println(\"I like \" +
                \"Java\");

5.2.2 连接其他数据类型

int booktime = 4;
float practice = 2.5f;
System.out.println(\"我每天花费\" + booktime + \"小时看书;\" + practice + \"小时上机练习\");

 输出结果如下图所示:

\"\"

5.3 获取字符串信息

5.3.1 获取字符串长度

String str = \"We are students\";
int size = str.length();

System.out.println(size);   // 输出15

5.3.2 字符串查找

indexOf():返回搜索的字符或者字符串在字符串中首次出现的位置,如果没有检索到,则返回-1。

lastIndexOf():返回搜索的字符或者字符串在字符串中最后一次出现的位置,如果没有检索到,则返回-1。

String str = \"We are students\";
int size = str.indexOf(\"a\");
System.out.println(size);   // 输出3

size = str.indexOf(\"o\");
System.out.println(size);   // 输出-1

size = str.indexOf(\"\");
System.out.println(size);   // 输出0
String str = \"We are students\";
int size = str.lastIndexOf(\"s\");
System.out.println(size);   // 输出14

size = str.lastIndexOf(\"o\");
System.out.println(size);   // 输出-1

size = str.lastIndexOf(\"\");
System.out.println(size);   // 输出15

 注意事项:如果lastIndexOf()方法中的参数是空字符串\"\"(注意没有空格),则返回的结果与调用该字符串的length()方法的返回结果相同。

5.3.3 获取指定索引位置的字符

String str = \"hello world\";
char myChar = str.charAt(6);
System.out.println(\"字符串str中索引位置是6的字符为:\" + myChar);

输出结果如下图所示:

 \"\"

5.4 字符串操作

5.4.1 获取子字符串

String str = \"hello world\";
String substr = str.substring(3);   // lo world

System.out.println(substr);

substr = str.substring(0, 3);
System.out.println(substr); // hel,不包括endIndex

 注意事项:在字符串中空格占用一个索引位置。

5.4.2 去除空格

String str = \"  Java  class   \";
System.out.println(\"字符串原来的长度:\" + str.length());
// 去掉str的前导和尾部的空格
System.out.println(\"去掉空格后的长度:\" + str.trim().length());

输出结果如下图所示:

\"\"

5.4.3 字符串替换

String str = \"address\";
String newStr = str.replace(\"a\", \"A\");

System.out.println(newStr); // 输出Address

 说明:

  1.如果要替换的字符在字符串中没有出现,则将原字符串返回

  2.如果要替换的字符在字符串中重复出现多次,会将要替换的字符全部替换为新字符

  3.要替换的字符的大小写要与原字符串中字符的大小写保持一致,否则不能成功的替换

String str = \"address\";
String newStr = str.replace(\"b\", \"B\");

System.out.println(newStr); // 输出address

newStr = str.replace(\"d\", \"D\");

System.out.println(newStr); // 输出aDDress

newStr = str.replace(\"A\", \"B\");

System.out.println(newStr); // 输出address

5.4.4 判断字符串的开始与结尾

String num1 = \"22045612\";
String num2 = \"21304578\";
boolean b1 = num1.startsWith(\"22\");
boolean b2 = num1.endsWith(\"78\");
boolean b3 = num2.startsWith(\"22\");
boolean b4 = num2.endsWith(\"78\");

System.out.println(\"字符串num1是以\'22\'开始的吗?\" + b1);
System.out.println(\"字符串num1是以\'78\'结束的吗?\" + b2);
System.out.println(\"字符串num2是以\'22\'开始的吗?\" + b3);
System.out.println(\"字符串num2是以\'78\'结束的吗?\" + b4);

输出结果如下图所示:

\"\"

5.4.5 判断字符串是否相等

对字符串对象进行比较不能简单地使用比较运算符\"==\",因为比较运算符比较的是两个字符串的地址是否相同。即使两个字符串的内容相同,两个对象的内存地址也可能是不同的,使用比较运算符仍然会返回false。

因此,要比较两个字符串内容是否相等,应使用equals()方法和equalsIgnoreCase()方法。

String s1 = new String(\"abc\");
String s2 = new String(\"ABC\");
String s3 = new String(\"abc\");
String s4 = \"abc\";
String s5 = \"abc\";

boolean b1 = s1.equals(s2);
boolean b2 = s1.equalsIgnoreCase(s2);
boolean b3 = s1.equals(s3);
boolean b4 = s1 == s3;
boolean b5 = s4 == s5;

System.out.println(s1 + \" equals \" + s2 + \":\" + b1);
System.out.println(s1 + \" equalsIgnoreCase \" + s2 + \":\" + b2);
System.out.println(s1 + \" equals \" + s3 + \":\" + b3);
System.out.println(s1 + \" == \" + s3 + \":\" + b4);
System.out.println(s4 + \" == \" + s5 + \":\" + b5);

输出结果如下图所示:

\"\"

5.4.6 按字典顺序比较两个字符串

compareTo()方法为按字典顺序比较两个字符串,该比较基于字符串中各个字符的Unicode值,按字典顺序将此String对象表示的字符序列与参数字符串所表示的字符序列进行比较。

如果按字典顺序此String对象位于参数字符串之前,则比较结果为一个负整数。

如果按字典顺序此String对象位于参数字符串之后,则比较结果为一个正整数。

如果这两个字符串相等,则比较结果为0。

String str = new String(\"b\");
String str2 = new String(\"a\");
String str3 = new String(\"c\");
String str4 = new String(\"b\");

System.out.println(str + \" compareTo \" + str2 + \":\" + str.compareTo(str2));
System.out.println(str + \" compareTo \" + str3 + \":\" + str.compareTo(str3));
System.out.println(str + \" compareTo \" + str4 + \":\" + str.compareTo(str4));

输出结果如下图所示:

\"\"

说明:compareTo()方法只有在equals( )方法返回true时才返回0。

5.4.7 字母大小写转换

String str = new String(\"abc DEF\");
String newStr = str.toLowerCase();
String newStr2 = str.toUpperCase();

System.out.println(newStr); // abc def
System.out.println(newStr2); // ABC DEF

 说明:使用toLowerCase()方法和toUpperCase()方法进行大小写转换时,数字或非字符不受影响。

5.4.8 字符串分割

String str = \"192.168.0.1\";
String[] firstArray = str.split(\"\\\\.\");
String[] secondArray = str.split(\"\\\\.\", 2);

System.out.println(\"str的原值为:[\" + str + \"]\");
System.out.println(\"全部分割的结果:\");
for (String a : firstArray) {
      System.out.print(\"[\" + a + \"]\");
}
System.out.println();

System.out.println(\"分割两次的结果:\");
for (String a : secondArray) {
      System.out.print(\"[\" + a + \"]\");
}
System.out.println();

 输出结果如下图所示:

\"\"

5.5 格式化字符串

5.5.1 日期和时间字符串格式化

Date date = new Date();

String year = String.format(\"%tY\", date);
String month = String.format(\"%tB\", date);
String day = String.format(\"%td\", date);
String hour = String.format(\"%tH\", date);
String minute = String.format(\"%tM\", date);
String second = String.format(\"%tS\", date);
String form = String.format(\"%tF\", date);

System.out.println(\"今年是:\" + year + \"年\");
System.out.println(\"现在是:\" + month);
System.out.println(\"今天是:\" + day + \"号\");
System.out.println(\"现在是:\" + hour + \"时\" + minute + \"分\" + second + \"秒\");
System.out.println(\"年-月-日格式:\" + form);

输出结果如下图所示:

\"\"

5.5.2 常规类型格式化 

String str = String.format(\"%d\", 400 / 2);
String str2 = String.format(\"%b\", 3 > 5);
String str3 = String.format(\"%x\", 200);

System.out.println(\"400的一半是:\" + str);
System.out.println(\"3 > 5正确吗:\" + str2);
System.out.println(\"200的十六进制数是:\" + str3);

 输出结果如下图所示:

\"\"

5.6 使用正则表达式

正则表达式通常被用于判断语句中,用来检查某一字符串是否满足某一格式,正则表达式是含有一些具有特殊意义字符的字符串,这些特殊字符称为正则表达式的元字符

以下表格为常用的元字符:

元字符 正则表达式中的写法 意义
. . 代表任意一个字符
\\d \\\\d 代表0~9的任何一个数字
\\D \\\\D 代表任何一个非数字字符
\\s \\\\s 代表空白字符,如\'\\t\',\'\\n\'
\\S \\\\S 代表非空白字符
\\w \\\\w 代表可用作标识符的字符,但不包括\"$\"
\\W \\\\W 代表不可用于标识符的字符
\\p{Lower} \\\\p{Lower} 代表小写字母a~z
\\p{Upper} \\\\p{Upper} 代表大写字母A~Z
\\p{ASCII} \\\\p{ASCII} ASCII字符
\\p{Digit} \\\\p{Digit} 十进制数字,即0~9
\\p{Blank} \\\\p{Blank} 空格或制表符\\t

 

 

 

 

 

 

 

 

 

 


 

说明:在正则表达式中\".\"代表任何一个字符,因此在正则表达式中如果想使用普通意义的点字符\".\",必须使用转义字符\"\\\" 。

 在正则表达式中可以使用方括号括起若干个字符来表示一个元字符,该元字符可代表方括号中的任何一个字符。

例如,[abc]4,字符串a4,b4,c4都是匹配的字符串。方括号元字符还可以为其他格式,如:

[^456]:代表4、5、6之外的任何字符。

[a-r]:代表a~r中的任何一个字母。

[a-zA-Z]:代表任意一个英文字母。

在正则表达式中,允许使用限定修饰符来限定元字符出现的次数。

限定修饰符的用法如下表所示:

限定修饰符 意义 示例
? 0次或1次 A?
* 0次或多次 A*
+ 1次或多次 A+
{n} 正好出现n次 A{2}
{n,} 至少出现n次 A{3,}
{n,m} 出现n~m次 A{2,6}

 

 

 

 

 

 


 

String regex = \"\\\\w+@\\\\w+(\\\\.\\\\w{2,3})*\\\\.\\\\w{2,3}\";
String str1 = \"aaa@\";
String str2 = \"aaaaa\";
String str3 = \"1111@111ffyu.dfg.com\";

if (str1.matches(regex)) {
    System.out.println(str1 + \"是一个合法的E-mail地址格式\");
}
if (str2.matches(regex)) {
    System.out.println(str2 + \"是一个合法的E-mail地址格式\");
}
if (str3.matches(regex)) {
    System.out.println(str3 + \"是一个合法的E-mail地址格式\");
}

 运行结果如下图所示:

\"\"

5.7 字符串生成器

String str = \"\";
long startTime = System.currentTimeMillis();
for (int i = 0; i < 10000; i++) {
      str = str + i;
}
long endTime = System.currentTimeMillis();
long time = endTime - startTime;
System.out.println(\"String消耗时间:\" + time);

StringBuilder builder = new StringBuilder(\"\");
startTime = System.currentTimeMillis();
for (int j = 0; j < 10000; j++) {
      builder.append(j);
}
endTime = System.currentTimeMillis();
time = endTime - startTime;
System.out.println(\"StringBuilder消耗时间:\" + time);

运行结果如下图所示:

\"\"

通过运行的耗时可以看出,如果在程序中需要频繁的附加字符串,建议使用StringBuilder。

StringBuilder bf = new StringBuilder(\"hello\");
bf.insert(5, \"world\");
System.out.println(bf.toString());  // 输出helloworld

bf = new StringBuilder(\"StringBuilder\");
bf.delete(5, 10);
System.out.println(bf.toString());  // 输出Strinder
收藏 打印