转载请注明出处:http://www.cnblogs.com/skywang12345/p/string01.html
String 简介
String 是java中的字符串,它继承于CharSequence。
String类所包含的API接口非常多。为了便于今后的使用,我对String的API进行了分类,并都给出的演示程序。
String 和 CharSequence 关系
String 继承于CharSequence,也就是说String也是CharSequence类型。
CharSequence是一个接口,它只包括length(), charAt(int index), subSequence(int start, int end)这几个API接口。除了String实现了CharSequence之外,StringBuffer和StringBuilder也实现了CharSequence接口。
需要说明的是,CharSequence就是字符序列,String, StringBuilder和StringBuffer本质上都是通过字符数组实现的!
StringBuilder 和 StringBuffer 的区别
StringBuilder 和 StringBuffer都是可变的字符序列。它们都继承于AbstractStringBuilder,实现了CharSequence接口。
但是,StringBuilder是非线程安全的,而StringBuffer是线程安全的。
它们之间的关系图如下:

String 函数列表
CharSequence和String源码
1. CharSequence源码(基于jdk1.7.40)
2. String.java源码(基于jdk1.7.40)
说明:String的本质是字符序列,它是通过字符数组实现的!
演示程序
1. CharSequence
下面通过示例,演示CharSequence的使用方法!
源码如下(CharSequenceTest.java):
1 /**
2 * CharSequence 演示程序
3 *
4 * @author skywang
5 */
6 import java.nio.charset.Charset;
7 import java.io.UnsupportedEncodingException;
8
9 public class CharSequenceTest {
10
11 public static void main(String[] args) {
12 testCharSequence();
13 }
14
15 /**
16 * CharSequence 测试程序
17 */
18 private static void testCharSequence() {
19 System.out.println("-------------------------------- testCharSequence -----------------------------");
20
21 // 1. CharSequence的子类String
22 String str = "abcdefghijklmnopqrstuvwxyz";
23 System.out.println("1. String");
24 System.out.printf(" %-30s=%d\n", "str.length()", str.length());
25 System.out.printf(" %-30s=%c\n", "str.charAt(5)", str.charAt(5));
26 String substr = (String)str.subSequence(0,5);
27 System.out.printf(" %-30s=%s\n", "str.subSequence(0,5)", substr.toString());
28
29 // 2. CharSequence的子类StringBuilder
30 StringBuilder strbuilder = new StringBuilder("abcdefghijklmnopqrstuvwxyz");
31 System.out.println("2. StringBuilder");
32 System.out.printf(" %-30s=%d\n", "strbuilder.length()", strbuilder.length());
33 System.out.printf(" %-30s=%c\n", "strbuilder.charAt(5)", strbuilder.charAt(5));
34 // 注意:StringBuilder的subSequence()返回的是,实际上是一个String对象!
35 String substrbuilder = (String)strbuilder.subSequence(0,5);
36 System.out.printf(" %-30s=%s\n", "strbuilder.subSequence(0,5)", substrbuilder.toString());
37
38 // 3. CharSequence的子类StringBuffer
39 StringBuffer strbuffer = new StringBuffer("abcdefghijklmnopqrstuvwxyz");
40 System.out.println("3. StringBuffer");
41 System.out.printf(" %-30s=%d\n", "strbuffer.length()", strbuffer.length());
42 System.out.printf(" %-30s=%c\n", "strbuffer.charAt(5)", strbuffer.charAt(5));
43 // 注意:StringBuffer的subSequence()返回的是,实际上是一个String对象!
44 String substrbuffer = (String)strbuffer.subSequence(0,5);
45 System.out.printf(" %-30s=%s\n", "strbuffer.subSequence(0,5)", substrbuffer.toString());
46
47 System.out.println();
48 }
49 }
运行结果:
-------------------------------- testCharSequence ----------------------------- 1. String str.length() =26 str.charAt(5) =f str.subSequence(0,5) =abcde 2. StringBuilder strbuilder.length() =26 strbuilder.charAt(5) =f strbuilder.subSequence(0,5) =abcde 3. StringBuffer strbuffer.length() =26 strbuffer.charAt(5) =f strbuffer.subSequence(0,5) =abcde
2. String 构造函数
下面通过示例,演示String的各种构造函数的使用方法!
源码如下(StringContructorTest.java):
1 /**
2 * String 构造函数演示程序
3 *
4 * @author skywang
5 */
6 import java.nio.charset.Charset;
7 import java.io.UnsupportedEncodingException;
8
9 public class StringContructorTest {
10
11 public static void main(String[] args) {
12 testStringConstructors() ;
13 }
14
15 /**
16 * String 构造函数测试程序
17 */
18 private static void testStringConstructors() {
19 try {
20 System.out.println("-------------------------------- testStringConstructors -----------------------");
21
22 String str01 = new String();
23 String str02 = new String("String02");
24 String str03 = new String(new char[]{'s','t','r','0','3'});
25 String str04 = new String(new char[]{'s','t','r','0','4'}, 1, 3); // 1表示起始位置,3表示个数
26 String str05 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}); // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
27 String str06 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 1, 3); // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
28 String str07 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0); // 0x61在ASC表中,对应字符"a";0,表示“高字节”
29 String str08 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0, 1, 3); // 0x61在ASC表中,对应字符"a"; 0,表示“高字节”;1表示起始位置,3表示长度
30 String str09 = new String(new byte[]{(byte)0xe5, (byte)0xad, (byte)0x97, /* 字-对应的utf-8编码 */
31 (byte)0xe7, (byte)0xac, (byte)0xa6, /* 符-对应的utf-8编码 */
32 (byte)0xe7, (byte)0xbc, (byte)0x96, /* 编-对应的utf-8编码 */
33 (byte)0xe7, (byte)0xa0, (byte)0x81, /* 码-对应的utf-8编码 */ },
34 0, 12, "utf-8"); // 0表示起始位置,12表示长度。
35 String str10 = new String(new byte[]{(byte)0x5b, (byte)0x57, /* 字-对应的utf-16编码 */
36 (byte)0x7b, (byte)0x26, /* 符-对应的utf-16编码 */
37 (byte)0x7f, (byte)0x16, /* 编-对应的utf-16编码 */
38 (byte)0x78, (byte)0x01, /* 码-对应的utf-16编码 */ },
39 0, 8, "utf-16"); // 0表示起始位置,8表示长度。
40 String str11 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gb2312编码 */
41 (byte)0xb7, (byte)0xfb, /* 符-对应的gb2312编码 */
42 (byte)0xb1, (byte)0xe0, /* 编-对应的gb2312编码 */
43 (byte)0xc2, (byte)0xeb, /* 码-对应的gb2312编码 */ },
44 Charset.forName("gb2312"));
45 String str12 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gbk编码 */
46 (byte)0xb7, (byte)0xfb, /* 符-对应的gbk编码 */
47 (byte)0xb1, (byte)0xe0, /* 编-对应的gbk编码 */
48 (byte)0xc2, (byte)0xeb, /* 码-对应的gbk编码 */ },
49 0, 8, Charset.forName("gbk"));
50 String str13 = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4); // "字符编码"(\u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
51 String str14 = new String(new StringBuffer("StringBuffer"));
52 String str15 = new String(new StringBuilder("StringBuilder"));
53
54 System.out.printf(" str01=%s \n str02=%s \n str03=%s \n str04=%s \n str05=%s \n str06=%s \n str07=%s \n str08=%s\n str09=%s\n str10=%s\n str11=%s\n str12=%s\n str13=%s\n str14=%s\n str15=%s\n",
55 str01, str02, str03, str04, str05, str06, str07, str08, str09, str10, str11, str12, str13, str14, str15);
56
57
58 System.out.println();
59 } catch (UnsupportedEncodingException e) {
60 e.printStackTrace();
61 }
62 }
63 }
运行结果:
-------------------------------- testStringConstructors ----------------------- str01= str02=String02 str03=str03 str04=tr0 str05=abcde str06=bcd str07=abcde str08=bcd str09=字符编码 str10=字符编码 str11=字符编码 str12=字符编码 str13=字符编码 str14=StringBuffer str15=StringBuilder
3. String 将各种对象转换成String的API
源码如下(StringValueTest.java):
1 /**
2 * String value相关示例
3 *
4 * @author skywang
5 */
6 import java.util.HashMap;
7
8 public class StringValueTest {
9
10 public static void main(String[] args) {
11 testValueAPIs() ;
12 }
13
14 /**
15 * String 的valueOf()演示程序
16 */
17 private static void testValueAPIs() {
18 System.out.println("-------------------------------- testValueAPIs --------------------------------");
19 // 1. String valueOf(Object obj)
20 // 实际上,返回的是obj.toString();
21 HashMap map = new HashMap();
22 map.put("1", "one");
23 map.put("2", "two");
24 map.put("3", "three");
25 System.out.printf("%-50s = %s\n", "String.valueOf(map)", String.valueOf(map));
26
27 // 2.String valueOf(boolean b)
28 System.out.printf("%-50s = %s\n", "String.valueOf(true)", String.valueOf(true));
29
30 // 3.String valueOf(char c)
31 System.out.printf("%-50s = %s\n", "String.valueOf('m')", String.valueOf('m'));
32
33 // 4.String valueOf(int i)
34 System.out.printf("%-50s = %s\n", "String.valueOf(96)", String.valueOf(96));
35
36 // 5.String valueOf(long l)
37 System.out.printf("%-50s = %s\n", "String.valueOf(12345L)", String.valueOf(12345L));
38
39 // 6.String valueOf(float f)
40 System.out.printf("%-50s = %s\n", "String.valueOf(1.414f)", String.valueOf(1.414f));
41
42 // 7.String valueOf(double d)
43 System.out.printf("%-50s = %s\n", "String.valueOf(3.14159d)", String.valueOf(3.14159d));
44
45 // 8.String valueOf(char[] data)
46 System.out.printf("%-50s = %s\n", "String.valueOf(new char[]{'s','k','y'})", String.valueOf(new char[]{'s','k','y'}));
47
48 // 9.String valueOf(char[] data, int offset, int count)
49 System.out.printf("%-50s = %s\n", "String.valueOf(new char[]{'s','k','y'}, 0, 2)", String.valueOf(new char[]{'s','k','y'}, 0, 2));
50
51 System.out.println();
52 }
53 }
运行结果:
-------------------------------- testValueAPIs --------------------------------
String.valueOf(map) = {3=three, 2=two, 1=one}
String.valueOf(true) = true
String.valueOf('m') = m
String.valueOf(96) = 96
String.valueOf(12345L) = 12345
String.valueOf(1.414f) = 1.414
String.valueOf(3.14159d) = 3.14159
String.valueOf(new char[]{'s','k','y'}) = sky
String.valueOf(new char[]{'s','k','y'}, 0, 2) = sk
4. String 中index相关的API
源码如下(StringIndexTest.java):
1 /**
2 * String 中index相关API演示
3 *
4 * @author skywang
5 */
6
7 public class StringIndexTest {
8
9 public static void main(String[] args) {
10 testIndexAPIs() ;
11 }
12
13 /**
14 * String 中index相关API演示
15 */
16 private static void testIndexAPIs() {
17 System.out.println("-------------------------------- testIndexAPIs --------------------------------");
18
19 String istr = "abcAbcABCabCaBcAbCaBCabc";
20 System.out.printf("istr=%s\n", istr);
21
22 // 1. 从前往后,找出‘a’第一次出现的位置
23 System.out.printf("%-30s = %d\n", "istr.indexOf((int)'a')", istr.indexOf((int)'a'));
24
25 // 2. 从位置5开始,从前往后,找出‘a’第一次出现的位置
26 System.out.printf("%-30s = %d\n", "istr.indexOf((int)'a', 5)", istr.indexOf((int)'a', 5));
27
28 // 3. 从后往前,找出‘a’第一次出现的位置
29 System.out.printf("%-30s = %d\n", "istr.lastIndexOf((int)'a')", istr.lastIndexOf((int)'a'));
30
31 // 4. 从位置10开始,从后往前,找出‘a’第一次出现的位置
32 System.out.printf("%-30s = %d\n", "istr.lastIndexOf((int)'a', 10)", istr.lastIndexOf((int)'a', 10));
33
34
35 // 5. 从前往后,找出"bc"第一次出现的位置
36 System.out.printf("%-30s = %d\n", "istr.indexOf(\"bc\")", istr.indexOf("bc"));
37
38 // 6. 从位置5开始,从前往后,找出"bc"第一次出现的位置
39 System.out.printf("%-30s = %d\n", "istr.indexOf(\"bc\", 5)", istr.indexOf("bc", 5));
40
41 // 7. 从后往前,找出"bc"第一次出现的位置
42 System.out.printf("%-30s = %d\n", "istr.lastIndexOf(\"bc\")", istr.lastIndexOf("bc"));
43
44 // 8. 从位置4开始,从后往前,找出"bc"第一次出现的位置
45 System.out.printf("%-30s = %d\n", "istr.lastIndexOf(\"bc\", 4)", istr.lastIndexOf("bc", 4));
46
47 System.out.println();
48 }
49 }
运行结果:
-------------------------------- testIndexAPIs --------------------------------
istr=abcAbcABCabCaBcAbCaBCabc
istr.indexOf((int)'a') = 0
istr.indexOf((int)'a', 5) = 9
istr.lastIndexOf((int)'a') = 21
istr.lastIndexOf((int)'a', 10) = 9
istr.indexOf("bc") = 1
istr.indexOf("bc", 5) = 22
istr.lastIndexOf("bc") = 22
istr.lastIndexOf("bc", 4) = 4
5. String “比较”操作的API
源码如下(StringCompareTest.java):
1 /**
2 * String 中比较相关API演示
3 *
4 * @author skywang
5 */
6
7 public class StringCompareTest {
8
9 public static void main(String[] args) {
10 testCompareAPIs() ;
11 }
12
13 /**
14 * String 中比较相关API演示
15 */
16 private static void testCompareAPIs() {
17 System.out.println("-------------------------------- testCompareAPIs ------------------------------");
18
19 //String str = "abcdefghijklmnopqrstuvwxyz";
20 String str = "abcAbcABCabCAbCabc";
21 System.out.printf("str=%s\n", str);
22
23 // 1. 比较“2个String是否相等”
24 System.out.printf("%-50s = %b\n",
25 "str.equals(\"abcAbcABCabCAbCabc\")",
26 str.equals("abcAbcABCabCAbCabc"));
27
28 // 2. 比较“2个String是否相等(忽略大小写)”
29 System.out.printf("%-50s = %b\n",
30 "str.equalsIgnoreCase(\"ABCABCABCABCABCABC\")",
31 str.equalsIgnoreCase("ABCABCABCABCABCABC"));
32
33 // 3. 比较“2个String的大小”
34 System.out.printf("%-40s = %d\n", "str.compareTo(\"abce\")", str.compareTo("abce"));
35
36 // 4. 比较“2个String的大小(忽略大小写)”
37 System.out.printf("%-40s = %d\n", "str.compareToIgnoreCase(\"ABC\")", str.compareToIgnoreCase("ABC"));
38
39 // 5. 字符串的开头是不是"ab"
40 System.out.printf("%-40s = %b\n", "str.startsWith(\"ab\")", str.startsWith("ab"));
41
42 // 6. 字符串的从位置3开头是不是"ab"
43 System.out.printf("%-40s = %b\n", "str.startsWith(\"Ab\")", str.startsWith("Ab", 3));
44
45 // 7. 字符串的结尾是不是"bc"
46 System.out.printf("%-40s = %b\n", "str.endsWith(\"bc\")", str.endsWith("bc"));
47
48 // 8. 字符串的是不是包含"ABC"
49 System.out.printf("%-40s = %b\n", "str.contains(\"ABC\")", str.contains("ABC"));
50
51 // 9. 比较2个字符串的部分内容
52 String region1 = str.substring(2, str.length()); // 获取str位置3(包括)到末尾(不包括)的子字符串
53 // 将“str中从位置2开始的字符串”和“region1中位置0开始的字符串”进行比较,比较长度是5。
54 System.out.printf("regionMatches(%s) = %b\n", region1,
55 str.regionMatches(2, region1, 0, 5));
56
57 // 10. 比较2个字符串的部分内容(忽略大小写)
58 String region2 = region1.toUpperCase(); // 将region1转换为大写
59 String region3 = region1.toLowerCase(); // 将region1转换为小写
60 System.out.printf("regionMatches(%s) = %b\n", region2,
61 str.regionMatches(2, region2, 0, 5));
62 System.out.printf("regionMatches(%s) = %b\n", region3,
63 str.regionMatches(2, region3, 0, 5));
64
65 // 11. 比较“String”和“StringBuffer”的内容是否相等
66 System.out.printf("%-60s = %b\n",
67 "str.contentEquals(new StringBuffer(\"abcAbcABCabCAbCabc\"))",
68 str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc")));
69
70 // 12. 比较“String”和“StringBuilder”的内容是否相等
71 System.out.printf("%-60s = %b\n",
72 "str.contentEquals(new StringBuilder(\"abcAbcABCabCAbCabc\"))",
73 str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc")));
74
75 // 13. match()测试程序
76 // 正则表达式 xxx.xxx.xxx.xxx,其中xxx中x的取值可以是0~9,xxx中有1~3位。
77 String reg_ipv4 = "[0-9]{3}(\\.[0-9]{1,3}){3}";
78
79 String ipv4addr1 = "192.168.1.102";
80 String ipv4addr2 = "192.168";
81 System.out.printf("%-40s = %b\n", "ipv4addr1.matches()", ipv4addr1.matches(reg_ipv4));
82 System.out.printf("%-40s = %b\n", "ipv4addr2.matches()", ipv4addr2.matches(reg_ipv4));
83
84 System.out.println();
85 }
86 }
运行结果:
-------------------------------- testCompareAPIs ------------------------------
str=abcAbcABCabCAbCabc
str.equals("abcAbcABCabCAbCabc") = true
str.equalsIgnoreCase("ABCABCABCABCABCABC") = true
str.compareTo("abce") = -36
str.compareToIgnoreCase("ABC") = 15
str.startsWith("ab") = true
str.startsWith("Ab") = true
str.endsWith("bc") = true
str.contains("ABC") = true
regionMatches(cAbcABCabCAbCabc) = true
regionMatches(CABCABCABCABCABC) = false
regionMatches(cabcabcabcabcabc) = false
str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc")) = true
str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc")) = true
ipv4addr1.matches() = true
ipv4addr2.matches() = false
6. String “修改(追加/替换/截取/分割)”操作的API
源码如下(StringModifyTest.java):
1 /**
2 * String 中 修改(追加/替换/截取/分割)字符串的相关API演示
3 *
4 * @author skywang
5 */
6
7 public class StringModifyTest {
8
9 public static void main(String[] args) {
10 testModifyAPIs() ;
11 }
12
13 /**
14 * String 中 修改(追加/替换/截取/分割)字符串的相关API演示
15 */
16 private static void testModifyAPIs() {
17 System.out.println("-------------------------------- testModifyAPIs -------------------------------");
18
19 String str = " abcAbcABCabCAbCabc ";
20 System.out.printf("str=%s, len=%d\n", str, str.length());
21
22 // 1.追加
23 // 将"123"追加到str之后
24 System.out.printf("%-30s = %s\n", "str.concat(\"123\")",
25 str.concat("123"));
26
27 // 2.截取
28 // 截取str中从位置7(包括)开始的元素。
29 System.out.printf("%-30s = %s\n", "str.substring(7)", str.substring(7));
30 // 截取str中从位置7(包括)到位置10(不包括)之间的元素。
31 System.out.printf("%-30s = %s\n", "str.substring(7, 10)", str.substring(7, 10));
32 // 删除str中首位的空格,并返回。
33 System.out.printf("%-30s = %s, len=%d\n", "str.trim()", str.trim(), str.trim().length());
34
35 // 3.替换
36 // 将str中的 “字符‘a’” 全部替换为 “字符‘_’”
37 System.out.printf("%-30s = %s\n", "str.replace('a', 'M')", str.replace('a', '_'));
38 // 将str中的第一次出现的“字符串“a”” 替换为 “字符串“###””
39 System.out.printf("%-30s = %s\n", "str.replaceFirst(\"a\", \"###\")", str.replaceFirst("a", "###"));
40 // 将str中的 “字符串“a”” 全部替换为 “字符串“$$$””
41 System.out.printf("%-30s = %s\n", "str.replace(\"a\", \"$$$\")", str.replace("a", "$$$"));
42
43 // 4.分割
44 // 以“b”作为分隔符,对str进行分割
45 String[] splits = str.split("b");
46 for (int i=0; i<splits.length; i++) {
47 System.out.printf("splits[%d]=%s\n", i, splits[i]);
48 }
49
50 System.out.println();
51 }
52 }
运行结果:
-------------------------------- testModifyAPIs -------------------------------
str= abcAbcABCabCAbCabc , len=20
str.concat("123") = abcAbcABCabCAbCabc 123
str.substring(7) = ABCabCAbCabc
str.substring(7, 10) = ABC
str.trim() = abcAbcABCabCAbCabc, len=18
str.replace('a', 'M') = _bcAbcABC_bCAbC_bc
str.replaceFirst("a", "###") = ###bcAbcABCabCAbCabc
str.replace("a", "$$$") = $$$bcAbcABC$$$bCAbC$$$bc
splits[0]= a
splits[1]=cA
splits[2]=cABCa
splits[3]=CA
splits[4]=Ca
splits[5]=c
7. String 操作Unicode的API
源码如下(StringUnicodeTest.java):
1 /**
2 * String 中与unicode相关的API
3 *
4 * @author skywang
5 */
6
7 public class StringUnicodeTest {
8
9 public static void main(String[] args) {
10 testUnicodeAPIs() ;
11 }
12
13 /**
14 * String 中与unicode相关的API
15 */
16 private static void testUnicodeAPIs() {
17 System.out.println("-------------------------------- testUnicodeAPIs ------------------------------");
18
19 String ustr = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4); // "字符编码"(\u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
20 System.out.printf("ustr=%s\n", ustr);
21
22 // 获取位置0的元素对应的unciode编码
23 System.out.printf("%-30s = 0x%x\n", "ustr.codePointAt(0)", ustr.codePointAt(0));
24
25 // 获取位置2之前的元素对应的unciode编码
26 System.out.printf("%-30s = 0x%x\n", "ustr.codePointBefore(2)", ustr.codePointBefore(2));
27
28 // 获取位置1开始偏移2个代码点的索引
29 System.out.printf("%-30s = %d\n", "ustr.offsetByCodePoints(1, 2)", ustr.offsetByCodePoints(1, 2));
30
31 // 获取第0~3个元素之间的unciode编码的个数
32 System.out.printf("%-30s = %d\n", "ustr.codePointCount(0, 3)", ustr.codePointCount(0, 3));
33
34 System.out.println();
35 }
36 }
运行结果:
-------------------------------- testUnicodeAPIs ------------------------------ ustr=字符编码 ustr.codePointAt(0) = 0x5b57 ustr.codePointBefore(2) = 0x7b26 ustr.offsetByCodePoints(1, 2) = 3 ustr.codePointCount(0, 3) = 3
8. String 剩余的API
源码如下(StringOtherTest.java):
1 /**
2 * String 中其它的API
3 *
4 * @author skywang
5 */
6
7 public class StringOtherTest {
8
9 public static void main(String[] args) {
10 testOtherAPIs() ;
11 }
12
13 /**
14 * String 中其它的API
15 */
16 private static void testOtherAPIs() {
17 System.out.println("-------------------------------- testOtherAPIs --------------------------------");
18
19 String str = "0123456789";
20 System.out.printf("str=%s\n", str);
21
22 // 1. 字符串长度
23 System.out.printf("%s = %d\n", "str.length()", str.length());
24
25 // 2. 字符串是否为空
26 System.out.printf("%s = %b\n", "str.isEmpty()", str.isEmpty());
27
28 // 3. [字节] 获取字符串对应的字节数组
29 byte[] barr = str.getBytes();
30 for (int i=0; i<barr.length; i++) {
31 System.out.printf("barr[%d]=0x%x ", i, barr[i]);
32 }
33 System.out.println();
34
35 // 4. [字符] 获取字符串位置4的字符
36 System.out.printf("%s = %c\n", "str.charAt(4)", str.charAt(4));
37
38 // 5. [字符] 获取字符串对应的字符数组
39 char[] carr = str.toCharArray();
40 for (int i=0; i<carr.length; i++) {
41 System.out.printf("carr[%d]=%c ", i, carr[i]);
42 }
43 System.out.println();
44
45 // 6. [字符] 获取字符串中部分元素对应的字符数组
46 char[] carr2 = new char[3];
47 str.getChars(6, 9, carr2, 0);
48 for (int i=0; i<carr2.length; i++) {
49 System.out.printf("carr2[%d]=%c ", i, carr2[i]);
50 }
51 System.out.println();
52
53 // 7. [字符] 获取字符数组对应的字符串
54 System.out.printf("%s = %s\n",
55 "str.copyValueOf(new char[]{'a','b','c','d','e'})",
56 String.copyValueOf(new char[]{'a','b','c','d','e'}));
57
58 // 8. [字符] 获取字符数组中部分元素对应的字符串
59 System.out.printf("%s = %s\n",
60 "str.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4)",
61 String.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4));
62
63 // 9. format()示例,将对象数组按指定格式转换为字符串
64 System.out.printf("%s = %s\n",
65 "str.format()",
66 String.format("%s-%d-%b", "abc", 3, true));
67
68 System.out.println();
69 }
70 }
运行结果:
-------------------------------- testOtherAPIs --------------------------------
str=0123456789
str.length() = 10
str.isEmpty() = false
barr[0]=0x30 barr[1]=0x31 barr[2]=0x32 barr[3]=0x33 barr[4]=0x34 barr[5]=0x35 barr[6]=0x36 barr[7]=0x37 barr[8]=0x38 barr[9]=0x39
str.charAt(4) = 4
carr[0]=0 carr[1]=1 carr[2]=2 carr[3]=3 carr[4]=4 carr[5]=5 carr[6]=6 carr[7]=7 carr[8]=8 carr[9]=9
carr2[0]=6 carr2[1]=7 carr2[2]=8
str.copyValueOf(new char[]{'a','b','c','d','e'}) = abcde
str.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4) = bcde
str.format() = abc-3-true
9. String 完整示例
下面的示例是整合上面的几个示例的完整的String演示程序,源码如下(StringAPITest.java):
1 /**
2 * String 演示程序
3 *
4 * @author skywang
5 */
6 import java.util.HashMap;
7 import java.nio.charset.Charset;
8 import java.io.UnsupportedEncodingException;
9
10 public class StringAPITest {
11
12 public static void main(String[] args) {
13 testStringConstructors() ; // String 构造函数测试程序
14 testValueAPIs() ; // String 的valueOf()演示程序
15 testIndexAPIs() ; // String 中index相关API演示
16 testCompareAPIs() ; // String 中比较相关API演示
17 testModifyAPIs() ; // String 中 修改(追加/替换/截取/分割)字符串的相关API演示
18 testUnicodeAPIs() ; // String 中与unicode相关的API
19 testOtherAPIs() ; // String 中其它的API
20 }
21
22 /**
23 * String 构造函数测试程序
24 */
25 private static void testStringConstructors() {
26 try {
27 System.out.println("-------------------------------- testStringConstructors -----------------------");
28
29 String str01 = new String();
30 String str02 = new String("String02");
31 String str03 = new String(new char[]{'s','t','r','0','3'});
32 String str04 = new String(new char[]{'s','t','r','0','4'}, 1, 3); // 1表示起始位置,3表示个数
33 String str05 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}); // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
34 String str06 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 1, 3); // 0x61在ASC表中,对应字符"a"; 1表示起始位置,3表示长度
35 String str07 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0); // 0x61在ASC表中,对应字符"a";0,表示“高字节”
36 String str08 = new String(new byte[]{0x61, 0x62, 0x63, 0x64, 0x65}, 0, 1, 3); // 0x61在ASC表中,对应字符"a"; 0,表示“高字节”;1表示起始位置,3表示长度
37 String str09 = new String(new byte[]{(byte)0xe5, (byte)0xad, (byte)0x97, /* 字-对应的utf-8编码 */
38 (byte)0xe7, (byte)0xac, (byte)0xa6, /* 符-对应的utf-8编码 */
39 (byte)0xe7, (byte)0xbc, (byte)0x96, /* 编-对应的utf-8编码 */
40 (byte)0xe7, (byte)0xa0, (byte)0x81, /* 码-对应的utf-8编码 */ },
41 0, 12, "utf-8"); // 0表示起始位置,12表示长度。
42 String str10 = new String(new byte[]{(byte)0x5b, (byte)0x57, /* 字-对应的utf-16编码 */
43 (byte)0x7b, (byte)0x26, /* 符-对应的utf-16编码 */
44 (byte)0x7f, (byte)0x16, /* 编-对应的utf-16编码 */
45 (byte)0x78, (byte)0x01, /* 码-对应的utf-16编码 */ },
46 0, 8, "utf-16"); // 0表示起始位置,8表示长度。
47 String str11 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gb2312编码 */
48 (byte)0xb7, (byte)0xfb, /* 符-对应的gb2312编码 */
49 (byte)0xb1, (byte)0xe0, /* 编-对应的gb2312编码 */
50 (byte)0xc2, (byte)0xeb, /* 码-对应的gb2312编码 */ },
51 Charset.forName("gb2312"));
52 String str12 = new String(new byte[]{(byte)0xd7, (byte)0xd6, /* 字-对应的gbk编码 */
53 (byte)0xb7, (byte)0xfb, /* 符-对应的gbk编码 */
54 (byte)0xb1, (byte)0xe0, /* 编-对应的gbk编码 */
55 (byte)0xc2, (byte)0xeb, /* 码-对应的gbk编码 */ },
56 0, 8, Charset.forName("gbk"));
57 String str13 = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4); // "字符编码"(\u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
58 String str14 = new String(new StringBuffer("StringBuffer"));
59 String str15 = new String(new StringBuilder("StringBuilder"));
60
61 System.out.printf(" str01=%s \n str02=%s \n str03=%s \n str04=%s \n str05=%s \n str06=%s \n str07=%s \n str08=%s\n str09=%s\n str10=%s\n str11=%s\n str12=%s\n str13=%s\n str14=%s\n str15=%s\n",
62 str01, str02, str03, str04, str05, str06, str07, str08, str09, str10, str11, str12, str13, str14, str15);
63
64
65 System.out.println();
66 } catch (UnsupportedEncodingException e) {
67 e.printStackTrace();
68 }
69 }
70
71 /**
72 * String 中其它的API
73 */
74 private static void testOtherAPIs() {
75 System.out.println("-------------------------------- testOtherAPIs --------------------------------");
76
77 String str = "0123456789";
78 System.out.printf("str=%s\n", str);
79
80 // 1. 字符串长度
81 System.out.printf("%s = %d\n", "str.length()", str.length());
82
83 // 2. 字符串是否为空
84 System.out.printf("%s = %b\n", "str.isEmpty()", str.isEmpty());
85
86 // 3. [字节] 获取字符串对应的字节数组
87 byte[] barr = str.getBytes();
88 for (int i=0; i<barr.length; i++) {
89 System.out.printf("barr[%d]=0x%x ", i, barr[i]);
90 }
91 System.out.println();
92
93 // 4. [字符] 获取字符串位置4的字符
94 System.out.printf("%s = %c\n", "str.charAt(4)", str.charAt(4));
95
96 // 5. [字符] 获取字符串对应的字符数组
97 char[] carr = str.toCharArray();
98 for (int i=0; i<carr.length; i++) {
99 System.out.printf("carr[%d]=%c ", i, carr[i]);
100 }
101 System.out.println();
102
103 // 6. [字符] 获取字符串中部分元素对应的字符数组
104 char[] carr2 = new char[3];
105 str.getChars(6, 9, carr2, 0);
106 for (int i=0; i<carr2.length; i++) {
107 System.out.printf("carr2[%d]=%c ", i, carr2[i]);
108 }
109 System.out.println();
110
111 // 7. [字符] 获取字符数组对应的字符串
112 System.out.printf("%s = %s\n",
113 "str.copyValueOf(new char[]{'a','b','c','d','e'})",
114 String.copyValueOf(new char[]{'a','b','c','d','e'}));
115
116 // 8. [字符] 获取字符数组中部分元素对应的字符串
117 System.out.printf("%s = %s\n",
118 "str.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4)",
119 String.copyValueOf(new char[]{'a','b','c','d','e'}, 1, 4));
120
121 // 9. format()示例,将对象数组按指定格式转换为字符串
122 System.out.printf("%s = %s\n",
123 "str.format()",
124 String.format("%s-%d-%b", "abc", 3, true));
125
126 System.out.println();
127 }
128
129 /**
130 * String 中 修改(追加/替换/截取/分割)字符串的相关API演示
131 */
132 private static void testModifyAPIs() {
133 System.out.println("-------------------------------- testModifyAPIs -------------------------------");
134
135 String str = " abcAbcABCabCAbCabc ";
136 System.out.printf("%s, len=%d\n", str, str.length());
137
138 // 1.追加
139 // 将"123"追加到str之后
140 System.out.printf("%-30s = %s\n", "str.concat(\"123\")",
141 str.concat("123"));
142
143 // 2.截取
144 // 截取str中从位置7(包括)开始的元素。
145 System.out.printf("%-30s = %s\n", "str.substring(7)", str.substring(7));
146 // 截取str中从位置7(包括)到位置10(不包括)之间的元素。
147 System.out.printf("%-30s = %s\n", "str.substring(7, 10)", str.substring(7, 10));
148 // 删除str中首位的空格,并返回。
149 System.out.printf("%-30s = %s, len=%d\n", "str.trim()", str.trim(), str.trim().length());
150
151 // 3.替换
152 // 将str中的 “字符‘a’” 全部替换为 “字符‘_’”
153 System.out.printf("%-30s = %s\n", "str.replace('a', 'M')", str.replace('a', '_'));
154 // 将str中的第一次出现的“字符串“a”” 替换为 “字符串“###””
155 System.out.printf("%-30s = %s\n", "str.replaceFirst(\"a\", \"###\")", str.replaceFirst("a", "###"));
156 // 将str中的 “字符串“a”” 全部替换为 “字符串“$$$””
157 System.out.printf("%-30s = %s\n", "str.replace(\"a\", \"$$$\")", str.replace("a", "$$$"));
158
159 // 4.分割
160 // 以“b”作为分隔符,对str进行分割
161 String[] splits = str.split("b");
162 for (int i=0; i<splits.length; i++) {
163 System.out.printf("splits[%d]=%s\n", i, splits[i]);
164 }
165
166 System.out.println();
167 }
168
169
170 /**
171 * String 中比较相关API演示
172 */
173 private static void testCompareAPIs() {
174 System.out.println("-------------------------------- testCompareAPIs ------------------------------");
175
176 //String str = "abcdefghijklmnopqrstuvwxyz";
177 String str = "abcAbcABCabCAbCabc";
178 System.out.printf("%s\n", str);
179
180 // 1. 比较“2个String是否相等”
181 System.out.printf("%-50s = %b\n",
182 "str.equals(\"abcAbcABCabCAbCabc\")",
183 str.equals("abcAbcABCabCAbCabc"));
184
185 // 2. 比较“2个String是否相等(忽略大小写)”
186 System.out.printf("%-50s = %b\n",
187 "str.equalsIgnoreCase(\"ABCABCABCABCABCABC\")",
188 str.equalsIgnoreCase("ABCABCABCABCABCABC"));
189
190 // 3. 比较“2个String的大小”
191 System.out.printf("%-40s = %d\n", "str.compareTo(\"abce\")", str.compareTo("abce"));
192
193 // 4. 比较“2个String的大小(忽略大小写)”
194 System.out.printf("%-40s = %d\n", "str.compareToIgnoreCase(\"ABC\")", str.compareToIgnoreCase("ABC"));
195
196 // 5. 字符串的开头是不是"ab"
197 System.out.printf("%-40s = %b\n", "str.startsWith(\"ab\")", str.startsWith("ab"));
198
199 // 6. 字符串的从位置3开头是不是"ab"
200 System.out.printf("%-40s = %b\n", "str.startsWith(\"Ab\")", str.startsWith("Ab", 3));
201
202 // 7. 字符串的结尾是不是"bc"
203 System.out.printf("%-40s = %b\n", "str.endsWith(\"bc\")", str.endsWith("bc"));
204
205 // 8. 字符串的是不是包含"ABC"
206 System.out.printf("%-40s = %b\n", "str.contains(\"ABC\")", str.contains("ABC"));
207
208 // 9. 比较2个字符串的部分内容
209 String region1 = str.substring(2, str.length()); // 获取str位置3(包括)到末尾(不包括)的子字符串
210 // 将“str中从位置2开始的字符串”和“region1中位置0开始的字符串”进行比较,比较长度是5。
211 System.out.printf("regionMatches(%s) = %b\n", region1,
212 str.regionMatches(2, region1, 0, 5));
213
214 // 10. 比较2个字符串的部分内容(忽略大小写)
215 String region2 = region1.toUpperCase(); // 将region1转换为大写
216 String region3 = region1.toLowerCase(); // 将region1转换为小写
217 System.out.printf("regionMatches(%s) = %b\n", region2,
218 str.regionMatches(2, region2, 0, 5));
219 System.out.printf("regionMatches(%s) = %b\n", region3,
220 str.regionMatches(2, region3, 0, 5));
221
222 // 11. 比较“String”和“StringBuffer”的内容是否相等
223 System.out.printf("%-60s = %b\n",
224 "str.contentEquals(new StringBuffer(\"abcAbcABCabCAbCabc\"))",
225 str.contentEquals(new StringBuffer("abcAbcABCabCAbCabc")));
226
227 // 12. 比较“String”和“StringBuilder”的内容是否相等
228 System.out.printf("%-60s = %b\n",
229 "str.contentEquals(new StringBuilder(\"abcAbcABCabCAbCabc\"))",
230 str.contentEquals(new StringBuilder("abcAbcABCabCAbCabc")));
231
232 // 13. match()测试程序
233 // 正则表达式 xxx.xxx.xxx.xxx,其中xxx中x的取值可以是0~9,xxx中有1~3位。
234 String reg_ipv4 = "[0-9]{3}(\\.[0-9]{1,3}){3}";
235
236 String ipv4addr1 = "192.168.1.102";
237 String ipv4addr2 = "192.168";
238 System.out.printf("%-40s = %b\n", "ipv4addr1.matches()", ipv4addr1.matches(reg_ipv4));
239 System.out.printf("%-40s = %b\n", "ipv4addr2.matches()", ipv4addr2.matches(reg_ipv4));
240
241 System.out.println();
242 }
243
244 /**
245 * String 的valueOf()演示程序
246 */
247 private static void testValueAPIs() {
248 System.out.println("-------------------------------- testValueAPIs --------------------------------");
249 // 1. String valueOf(Object obj)
250 // 实际上,返回的是obj.toString();
251 HashMap map = new HashMap();
252 map.put("1", "one");
253 map.put("2", "two");
254 map.put("3", "three");
255 System.out.printf("%-50s = %s\n", "String.valueOf(map)", String.valueOf(map));
256
257 // 2.String valueOf(boolean b)
258 System.out.printf("%-50s = %s\n", "String.valueOf(true)", String.valueOf(true));
259
260 // 3.String valueOf(char c)
261 System.out.printf("%-50s = %s\n", "String.valueOf('m')", String.valueOf('m'));
262
263 // 4.String valueOf(int i)
264 System.out.printf("%-50s = %s\n", "String.valueOf(96)", String.valueOf(96));
265
266 // 5.String valueOf(long l)
267 System.out.printf("%-50s = %s\n", "String.valueOf(12345L)", String.valueOf(12345L));
268
269 // 6.String valueOf(float f)
270 System.out.printf("%-50s = %s\n", "String.valueOf(1.414f)", String.valueOf(1.414f));
271
272 // 7.String valueOf(double d)
273 System.out.printf("%-50s = %s\n", "String.valueOf(3.14159d)", String.valueOf(3.14159d));
274
275 // 8.String valueOf(char[] data)
276 System.out.printf("%-50s = %s\n", "String.valueOf(new char[]{'s','k','y'})", String.valueOf(new char[]{'s','k','y'}));
277
278 // 9.String valueOf(char[] data, int offset, int count)
279 System.out.printf("%-50s = %s\n", "String.valueOf(new char[]{'s','k','y'}, 0, 2)", String.valueOf(new char[]{'s','k','y'}, 0, 2));
280
281 System.out.println();
282 }
283
284 /**
285 * String 中index相关API演示
286 */
287 private static void testIndexAPIs() {
288 System.out.println("-------------------------------- testIndexAPIs --------------------------------");
289
290 String istr = "abcAbcABCabCaBcAbCaBCabc";
291 System.out.printf("istr=%s\n", istr);
292
293 // 1. 从前往后,找出‘a’第一次出现的位置
294 System.out.printf("%-30s = %d\n", "istr.indexOf((int)'a')", istr.indexOf((int)'a'));
295
296 // 2. 从位置5开始,从前往后,找出‘a’第一次出现的位置
297 System.out.printf("%-30s = %d\n", "istr.indexOf((int)'a', 5)", istr.indexOf((int)'a', 5));
298
299 // 3. 从后往前,找出‘a’第一次出现的位置
300 System.out.printf("%-30s = %d\n", "istr.lastIndexOf((int)'a')", istr.lastIndexOf((int)'a'));
301
302 // 4. 从位置10开始,从后往前,找出‘a’第一次出现的位置
303 System.out.printf("%-30s = %d\n", "istr.lastIndexOf((int)'a', 10)", istr.lastIndexOf((int)'a', 10));
304
305
306 // 5. 从前往后,找出"bc"第一次出现的位置
307 System.out.printf("%-30s = %d\n", "istr.indexOf(\"bc\")", istr.indexOf("bc"));
308
309 // 6. 从位置5开始,从前往后,找出"bc"第一次出现的位置
310 System.out.printf("%-30s = %d\n", "istr.indexOf(\"bc\", 5)", istr.indexOf("bc", 5));
311
312 // 7. 从后往前,找出"bc"第一次出现的位置
313 System.out.printf("%-30s = %d\n", "istr.lastIndexOf(\"bc\")", istr.lastIndexOf("bc"));
314
315 // 8. 从位置4开始,从后往前,找出"bc"第一次出现的位置
316 System.out.printf("%-30s = %d\n", "istr.lastIndexOf(\"bc\", 4)", istr.lastIndexOf("bc", 4));
317
318 System.out.println();
319 }
320
321 /**
322 * String 中与unicode相关的API
323 */
324 private static void testUnicodeAPIs() {
325 System.out.println("-------------------------------- testUnicodeAPIs ------------------------------");
326
327 String ustr = new String(new int[] {0x5b57, 0x7b26, 0x7f16, 0x7801}, 0, 4); // "字符编码"(\u5b57是‘字’的unicode编码)。0表示起始位置,4表示长度。
328 System.out.printf("ustr=%s\n", ustr);
329
330 // 获取位置0的元素对应的unciode编码
331 System.out.printf("%-30s = 0x%x\n", "ustr.codePointAt(0)", ustr.codePointAt(0));
332
333 // 获取位置2之前的元素对应的unciode编码
334 System.out.printf("%-30s = 0x%x\n", "ustr.codePointBefore(2)", ustr.codePointBefore(2));
335
336 // 获取位置1开始的元素对应的unciode编码
337 System.out.printf("%-30s = %d\n", "ustr.offsetByCodePoints(1, 2)", ustr.offsetByCodePoints(1, 2));
338
339 // 获取第0~3个元素之间的unciode编码的个数
340 System.out.printf("%-30s = %d\n", "ustr.codePointCount(0, 3)", ustr.codePointCount(0, 3));
341
342 System.out.println();
343 }
344 }

浙公网安备 33010602011771号