13.1 不可变 String
- String 对象是不可变的,String 类中每一个改变 String 值的方法,实际上都创建了一个新的 String 对象
String s1 = "aaa";
String s2 = s1.toUpperCase();
13.2 重载 “+” StringBuilder
String mango = "mango";
String s = "abc" + mango + "def" + 47
- 如果在循环中拼接字符串,最好显式定义一个 StringBuilder,若用+,每一次循环都会创建一个 StringBuilder 对象
public class WithStringBuilder {
public String implicit(String[] fields) {
String result = "";
for(int i = 0;i < fields.length;i++)
result += fields[i];
return result;
}
public String explicit(String[] fields) {
StringBuilder result = new StringBuilder();
for(int i = 0;i < fields.length;i++)
result.append(fields[i]);
return result.toString();
}
}
13.3 无意识的递归
- toString()方法继承自Object,每个容器类都覆写了该方法
- 若要打印对象的内存地址,应调用Object.toString(),即super.toString()
13.4 String 上的操作
length()
charAt()
getChars,getBytes()
toCharArray()
equals()
compareTo()
contains()
contentEquals()
equalsIgnoreCase()
regionMatcher()
startsWith()
subString()
concat()
replace()
trim()
valueOf()
13.5 格式化输出
int x = 5;
float y = 3.14;
System.out.format("%d %f\n",x,y);
Formatter f = new Formatter(System.out);
String name = "aaa";
f.format("%s",name);
%[如0 用于填充0][- 用来改变对齐方式][width 控制尺寸][. 小数点保留几位]格式类型,s,d,f等
类型转换字符 | 类型转换字符 |
---|
d 整数十进制 | e 浮点数科学计数 |
c Unicode字符 | x 整数十六进制 |
b Boolean值 | h 散列码十六进制 |
s String | % |
f 浮点数十进制 | |
import java.io.*;
public class Hex {
public static String format(byte[] data) {
StringBuilder result = new StringBuilder();
int n = 0;
for(byte b : data) {
if(n % 16 == 0)
result.append(String.format("%05X: ",n));
result.append(String.format("%02X ",b));
n++;
if(n % 16 == 0)
result.append("\n");
}
result.append("\n");
return result.toString();
}
public static void main(String[] args) throws Exception {
if(args.length == 0) {
System.out.println(format(new byte[] {0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30,
0x01, 0x01, 0x02, 0x71, 0x2b, 0x5f, 0x30}));
}
}
}
13.6 正则表达式
"-1234".matches("-?\\d+");
"+999".matches("(-|\\+)?\\d+");
String s = "xxx".split("\\W+");
s.replaceFirst("f\\w","repalce_word");
s.replaceAll("f\\w","repalce_word");
- 贪婪型,尽可能多匹配
- 勉强型,多加一个?,尽可能少匹配
- 占有型,多加一个+,不保存中间状态,不回溯
Interface CharSequence {
charAt(int i);
length();
subSequence(int start,int end);
toString();
}
- java.util.regex 下的 static Pattern.compile() 方法来编译正则表达式
Pattern p = Pattern.compile("abc+");
Matcher m = p.matches("abcabcabc");
while(m.find()) {
m.group();
m.start();
m.end();
}
static boolean matches(String regex,CharSequence input);
13.7 扫描输入
BufferedReader input =
new BufferedReader(new StringReader("xxxxx\nyyyy"));
String str = input.readLine();
Scanner stdin = new Scanner(SimpleRead.input);
String name = stdin.nextLine();
int age = stdin.nextInt();
if(stdin.hasNext())
;
stdin.useDelimiter("\\s*,\\s*");
String pattern = "正则表达式";
stdin.next(pattern);
stdin.hasNext(pattern);
MatchResult match = scanner.match();
String ip = match.group(1);
String date = match.group(2);