第十三章 字符串
String对象是不可变的,String类中每一个看起来会修改String对象值的方法,实际上都是创建了一个全新的String对象,以包含修改后的字符串内容。
1. 重载“+”与StringBuilder
- String具有只读特性,所有指向它的任何饮用都不可能改变它的值,因此一个引用不会影响其他引用。“+”用来连接字符串,这样的工作方式为了生成最终的字符串,会产生一堆需要垃圾回收的中间对象。(使用重载“+”“+=”可以进行工作,编译器也会自动进行优化使用StringBuilder工作,但是这种优化是有程度限制的。)
- StringBuilder是JavaSE5引入的,在这之前Java使用的是StringBuffer。后者是线程安全的,因此开销也会大些。
2. String的操作
String s1 = "abc";
String s2 = new String(String s);
String s3 = new String(StringBuilder sb);
String s4 = new String(StringBuffer sb);
String s5 = new String(char[] c);
String s6 = new String(byte[] b);
s1.length();//返回字符串长度
s1.charAt();//获取索引位置上的字符(char)
s1.getChars();//复制char到一个目标数组中
s1.getBytes();//复制byte到一个目标数组中
s1.toCharArray();//返回一个char数组,包含String字符串所有字符
s1.equals();//比较两个字符串是否相同
s1.equalsIgnoreCase();//比较两个字符串是否相同,忽略大小写
s1.compareTo();//比较两个字符串大小,结果为负数,零或者正数
s1.contains();//搜索字符串中是否包含参数类容
s1.contentEquals();//如果该String与参数内容完全一致,则返回true
s1.startWith();//判断字符串是否以参数开头
s1.endWith();//短短字符串是否以参数结尾
s1.indexOf();//返回参数索引位置,从头至尾第一次,没有返回-1
s1.lastIndexOf();//返回参数索引位置,从后至前第一次
s1.subString();//截取字符串
s1.contact();//连接字符串
s1.replace();//用心的字符替换掉字符串的字符
s1.toLowerCase();//转换至小写
s1.toUpperCase();//转换至大写
s1.trim();//两端去空
s1.valueOf();//将参数内容返回字符串
s1.intern();//为每个唯一的字符序列生成一个且仅生成一个String引用
s1.split();//分割字符串
3.格式化输出
System.out.format();//这个方法是模仿c语言的printf()来的格式化输出,与printf()等价。
4.扫描输入
Java SE5新增了Scanner类,Scanner的构造器可以接受任何类型的输入对象,包括File对象、InputStream、String或者Readable对象。Readable是Java SE5中新加入的一个接口。表示“具有read()方法的某种东西。
4.1 Scanner定界符
在默认情况下,Scanner根据空白字符对输入进行分词,但是你可以用正则表达式指定自己所需的定界符。
public class ScannerDelimiter{
public static void main(String[] args){
Scanner sc = new Scanner("12,42,78,99,42");
sc.useDelimiter("\\s*,\\s*");
while(sc.hasNextInt()){
System.out.println(sc.nextInt());
}
}
}
/*output:
12
42
78
99
42
*/