第 6章
字 串
– 认识字符串( String)
– 字符串高级运用
String类
在某些程序语言中,字符串是以字符数组的方式存在
在 Java中字符串不仅仅是字符数组,而是
String类的一个实例
String text ="字符串的使用 ";
System.out.println(text);
String类
字符串必须使用“”来包括您的文字
字符串的字符是使用 Unicode字符来建构
字符串的串接在 Java中可以直接使用 '+'
String msg ="哈啰! ";
msg = msg + "Java程序设计! ";
System.out.println(msg);
String类
字符串在 Java中以 String类的一个实例存在方 法 说 明
length() 取得字符串的字符长度
equals() 判断原字符串中的字符是否相等于指定字符串中的字符
toLowerCase() 转换字符串中的英文字符为小写
toUpperCase() 转换字符串中的英文字符为大写
String text = "hello";
System.out.println("字符串内容," + text);
System.out.println("字符串长度," + text.length());
System.out.println(“等 于 hello? " +
text.equals("hello"));
System.out.println(“转为大 写," +
text.toUpperCase());
System.out.println(“转为小 写," +
text.toLowerCase());
String类
将输入的字符串转换为整数、浮点数等
指定的字符串无法剖析为指定的数据型态数值,
则会发生 NumberFormatException例外方 法 说 明
Byte.parseByte(字符串 ) 将字符串剖析为位
Short.parseShort(字符串 ) 将字符串剖析为 short整数
Integer.parseInt(字符串 ) 将字符串剖析为 int整数
Long.parseLong(字符串 ) 将字符串剖析为 long整数
Float.parseFloat(字符串 ) 将字符串剖析为 float浮点数
Double.parseDouble(字符串 ) 将字符串剖析为 double浮点数
String类
以配置对象的观念来声明字符串
两种声明方式是有所差别的
String str = new String("caterpillar");
String str = "caterpillar";
String类
使用索引取得字符的相关方法方 法 说 明
char charAt(int index) 传回指定索引处的字符
int indexOf(int ch) 传回指定字符第一个找到的索引位置
int indexOf(String str) 传回指定字符串第一个找到的索引位置
int lastIndexOf(int ch) 传回指定字符最后一个找到的索引位置
String substring(int beginIndex) 取出指定索引处至字符串尾端的子字符串
String substring(int beginIndex,int
endIndex)
取出指定索引范围子字符串
char[] toCharArray() 将字符串转换为字符数组
code\ch06\CharAtString.java
String类
endsWith()方法
String[] filenames = {"caterpillar.jpg","cater.gif",
"bush.jpg","wuwu.jpg","clockman.gif"};
System.out.print("过滤出 jpg檔案,");
for(int i = 0; i < filenames.length; i++) {
if(filenames[i].endsWith("jpg")) {
System.out.print(filenames[i] + " ");
}
}
System.out.println("");
code\ch06\FileFilter.java
不可变( immutable)字符串
一个字符串对象一旦被配置,它的内容就是固定不可变的( immutable)
不要以为下面的陈述就是改变一个字符串对象的内容
String str = "Just";
str = "Justin";
不可变( immutable)字符串
对于一些可以共享的字符串对象,会先在
String池中查找是否存在相同的 String内容
当您直接在程序中使用 ""来包括一个字符串时,该字符串就会在 String池中
String str1 = "flyweight";
String str2 = "flyweight";
System.out.println(str1 == str2);
不可变( immutable)字符串
String的 intern()方法
– 如果池( Pool)中已经包括了相同的 String对象(相同与否由 equals()方法决定),那么会从池中返回该字符串
– 否则的话原 String对象会被加入池中,并返回这个 String对象的参考不可变( immutable)字符串
String str1 = "fly";
String str2 = "weight";
String str3 = "flyweight";
String str4 = null;
str4 = str1 + str2;
System.out.println(str3 == str4);
str4 = (str1 + str2).intern();
System.out.println(str3 == str4);
code\ch06\InternStr
ing.java
不可变( immutable)字符串不可变( immutable)字符串
不可用‘ ==’比较字符串的字符内容是否相同
要比较两个字符串对象的字符值是否相同,
您要使用 equals()方法
String str1 = new String("caterpillar");
String str2 = new String("caterpillar");
System.out.println(str1 == str2);
String str1 = new String("caterpillar");
String str2 = new String("caterpillar");
System.out.println(str1.equals(str2));
谜题 13
StringBuilder类
使用‘ +’来串接字符串以达到附加新字符或字符串的目的,但‘ +’会产生一个新的
String实例
不建议使用 '+'来进行字符串的串接
StringBuilder类
String text = "";
long beginTime = System.currentTimeMillis();
for(int i = 0; i < 10000; i++)
text = text + i;
long endTime = System.currentTimeMillis();
System.out.println("运行时间," + (endTime - beginTime));
StringBuilder builder = new StringBuilder("");
beginTime = System.currentTimeMillis();
for(int i = 0; i < 10000; i++)
builder.append(String.valueOf(i));
endTime = System.currentTimeMillis();
System.out.println("运行时间," + (endTime - beginTime));
code\ch06\AppendStringTest.java
命令行自变量命令行自变量
在 main()的参数列撰寫 String[]args,目的就是用来接受一个字符串数组
public static void main(String[] args) {
System.out.print("读入的引數,");
for(int i = 0; i < args.length; i++)
System.out.print(args[i] + " ");
System.out.println();
}
java CommandLineArg -file student.dat
读入的自变量,-file student.dat
code\ch06\CommandLineArg.java
code\ch06\CommandLineArg2.java
分离字符串
使用 String的 split()
String[] fakeFileData = {
"justin\t64/5/26\t0939002302\t5433343",
"momor\t68/7/23\t0939100391\t5432343" };
for(String data,fakeFileData) {
String[] tokens = data.split("\t");
for(String token,tokens) {
System.out.print(token + "\t| ");
}
System.out.println();
}
code\ch06\SplitStringDemo.java
使用正则表示式
matches(),replaceAll()等方法时使用
Java在 J2SE1.4之后开始支持正则表示式
可以在 API文件的 java.util.regex.Pattern类中找到支持的正则表示式相关信息使用正则表示式
几个常用的字符比对符号方 法 说 明
,符合任一字符
\d 符合 0到 9任一个数字字符
\D 符合 0-9以外的字符
\s 符合 '\t','\n','\x0B','\f','\r'等空格符
\w 符合 a到 z,A到 Z,0到 9等字符,也就是数字或是字母都符合
\W 符合 a到 z,A到 Z,0到 9等之外的字符,也就是除数字与字母外都符合使用正则表示式
String text = "abcdebcadxbc";
String[] tokens = text.split(".bc");
for(String token,tokens) {
System.out.print(token + " ");
}
System.out.println();
tokens = text.split("..cd");
for(String token,tokens) {
System.out.print(token + " ");
}
System.out.println();
code\ch06\RegularExpressionDemo.java
使用正则表示式
Character class
范 例 作 用
[abc] 符合 a,b或 c
[^abc] 符合「 a或 b或 c」之外的字符
[a-zA-Z] 符合 a到 z或者是 A到 Z的字符
[a-d[m-p]] a到 d或者是 m到 p,也可以写成 [a-dm-p]
[a-z&&[def]] a到 z并且是 d或 e或 f,结果就是 d或 e或 f可以符合
[a-z&&[^bc]] a到 z并且不是 b或 c
[a-z&&[^m-p]] a到 z并且不是 m到 p
使用正则表示式
Greedy quantifiers
范 例 作 用
X? X可出现一次或完全没有
X* X可出现零次或多次
X+ X可出现一次或多次
X{n} X可出现 n次
X{n,} X可出现至少 n次
X{n,m} X可出现至少 n次,但不超过 m次
X? X可出现一次或完全没有
code\ch06\UseRegularExpression.j
ava
Pattern,Matcher
将正则表示式视为一个对象来重复使用,
可用 Pattern的静态方法 compile()进行编译
compile()方法会传回一个 Pattern的实例,
这个实例代表您的正则表示式
Pattern,Matcher
String phones1 =
"Justin的手机号码,0939-100391\n" +
"momor的手机号码,0939-666888\n";
Pattern pattern = Pattern.compile(".*0939-\\d{6}");
Matcher matcher = pattern.matcher(phones1);
while(matcher.find()) {
System.out.println(matcher.group());
}
String phones2 =
"caterpillar的手机号码,0952-600391\n" +
"bush的手机号码,0939-550391";
matcher = pattern.matcher(phones2);
while(matcher.find()) {
System.out.println(matcher.group());
code\ch06\UsePatternMatcher.java
Pattern,Matcher
String text = "abcdebcadxbc";
Pattern pattern = Pattern.compile(".bc");
Matcher matcher = pattern.matcher(text);
while(matcher.find()) {
System.out.println(matcher.group());
}
System.out.println();
code\ch06\RegularExpressio
nDemo2.java