13.1 不可变String
String 对象是不可变的String 类的每一个看起来修改String 值的方法,实际都是创建了一个全新的String 对象,以包含修改后的字符串内容
13.2 重载“+”与StringBuilder
重载的意思是,一个操作符在应用于特定的类时,被赋予了特殊的意义 (用于String的“+”与“+=”是Java中仅有的两个重载过的操作符,而Java并不允许程序员重载任何操作符) 除非你用代码将系统实现,并让它动起来,否则你无法真正了解它会有什么问题 编译器自动引入了java.lang.StringBuilder 类。虽然我们在源代码中并没有使用StringBuilder 类,但是编译器自作主张地使用了它,因为它更高效 StringBuilder 提供了丰富而全面的方法,包括insert ()、repleace ()、substring ()甚至reverse (),但是最常用的还是append ()和toString ()。还有delete ()
13.3 无意识的递归
如果你真的想要打印出对象的内存地址,应该调用Object.toString()方法,这才是负责此任务的方法。所以,你不该使用this,而是应该调用 super.toString()方法
13.4 String上的操作
当需要改变字符串的内容时,String类的方法都会返回一个新的String对象。同时,如果内容没有发生改变,String的方法只是返回指向原对象的引用而已。这可以节约存储空间以及避免额外的开销
13.5 格式化输出
printf() a. C语言中的格式化输出,占位符称为格式修饰符,他们不但说明了插入数据的位置,同时还说明了将插入什么类型的变量,以及如何对其格式化System.out.format() a. format ()与printf ()是等价的
System. out. format ( "Row 1 : [%d %f]\n" , x, y) ;
System. out. printf ( "Row 1 : [%d %f]\n" , x, y) ;
Formatter 类 a. 在Java中,所有新的格式化功能都由java.util.Formatter 类处理 b. Formatter的构造器经过重载可以接收多种输出目的地,不过最常用的还是PrintStream ()、OutputStream 和File 格式化说明符 a. 在默认的情况下,数据时右对齐 ,不过可以通过使用“-”标志来改变对其方向 b. width :用来控制一个域的尺寸 c. precision :对String类,表示打印时输出字符的最大数量;用于浮点数,小数保留位数,默认6位;不能用于整数
% [ argument_index$] [ flags] [ width] [ . precision] conversion
Formatter 转换 a. 下表包含了最常用的类型转换 b. b转换,对于其他类型的参数,只要该参数不为null,那转换的结果就永远都是true
d 整数型(十进制)
c Unicode字符
b Boolean值
s String
f 浮点数(十进制)
e 浮点数(科学计数)
x 整数(十六进制)
h 散列码(十六进制)
% 字符"%"
String.format() a. **String.format()**是一个static方法,它接受与Formatter.format()方法一样的参数,但返回一个String对象
13.6 正则表达式
基础 a. 在Java中,\的意思是“我要插入一个正则表达式的反斜线,所以其后的字符具有特殊意义 b. 因为字符+在正则表达式中有特殊的意义,所以必须使用\将其转义,使之成为表达式中的一个普通字符 c. String 类还自带一个非常有用的正则表达式工具——split()方法,其功能是“将字符串从正则表达式匹配的地方切开”
\\d 表示一位数字
\\\\ 普通的反斜线
\n\t 换行和制表符
+ 一个或多个之前的表达式
| 表示或
( ) 起表达式分组作用
? 可以都没有
\W 非单词字符
\w 单词字符
public class IntegerMatch {
public static void main ( String[ ] args) {
System. out. println ( "-1234" . matches ( "-?\\d+" ) ) ;
System. out. println ( "+911" . matches ( "(-|\\+)?\\d+" ) ) ;
}
}
创建正则表达式 量词 a. 贪婪型:量词总是贪婪的,除非有其他的选项被设置 b. 勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数 c. 占有型:只有在Java中能使用。当正则表达式被应用于字符串,它会产生相当多的状态,以便在匹配失败时可以回溯。“占有的”量词并不会保存这些中间状态,因此它们可以防止回溯 Pattern 和Matcher a. 引入java.util.regex 包,然后用static Pattern.compile ()方法来编译你的正则表达式即可split ()方法将输入字符串断开成字符串对象数组,断开边界有正则表达式确定替换操作 reset (),可以将现有的Matcher 对象应用于一个新的字符序列 使用不带参数的reset ()方法,可以将Matcher 对象重新设置到当前字符序列的起始位置正则表达式与Java I/O
13.7 扫描输入
Scanner 的构造器可以接受任何类型的输入对象,包括File 对象、InputStream 、String 或者Readable 对象有了Scanner ,所有的输入、分词以及翻译的操作都隐藏在不同类型的next 方法中 Scanner 还有相应的hasNext 方法,用以判断下一个输入分词是否所需的类型
Scanner stdin = new Scanner ( SimpleRead. input) ;
String name = stdin. nextLine ( ) ;
Scanner input= new Scanner ( System. in) ;
int n= input. nextInt ( ) ;
Scanner 定界符 a. 默认情况下,Scanner 根据空白字符对输入进行分词,但是你可以用正则表达式指定自己所需的定界符
public class ScannerDelimiter {
public static void main ( String[ ] args) {
Scanner scannerr = new Scanner ( "12, 42, 78, 99, 42" ) ;
scanner. useDelimmiterr ( "\\s*,\\s*" ) ;
while ( scanner. hasNextInt ( ) ) {
System. out. println ( scanner. nextInt ( ) ) ;
}
}
}
用正则表达式扫描
13.8 StringTokenizer
stringTokenizer 已经废弃了
13.9 总结
到目前为止,Java 对字符串操作的支持已经很完善了。不过,有时你还需要在细节上注意效率问题,例如恰当地使用StringBuilder 等