一, 不可变的String
- 直接在String上的拼接,截取,变形都是返回另一个String对象,即当这些操作太过频繁时,会消耗过多内存。
- 这时便要考虑StringBuff与StringBuilder。
public class StringDemo1
{
public static void main(String[] args)
{
StringBuilder sb = new StringBuilder();
sb.append("You are sb!");
sb.delete(sb.length()-3, sb.length());
sb.insert(sb.length()-1, " handsome");
System.out.println(sb);
System.out.println(sb.substring(0,3));
System.out.println(sb.replace(0, sb.indexOf("e")+1, "I am "));
System.out.println(sb.reverse());
}
}
/*
输出:
You are handsome
You
I am handsome
emosdnah ma I
*/
二, 格式化输出
1. System.out.format == System.out.printf(与c语言的printf输出一致)
public class FormatDemo
{
public static void main(String[] args)
{
int i = 3;
double d = 3.4;
String s = "hell";
System.out.println(i+" "+d+" "+s);
System.out.format("%d %.1f %s\n",i,d,s);
System.out.printf("%d %.1f %s\n",i,d,s);
}
}
/*
输出:
3 3.4 hell
3 3.4 hell
3 3.4 hell
*/
2. Formatter类
import java.util.Formatter;
class User
{
private String nickname;
private Formatter f;
User(String nickname,Formatter f)
{
this.nickname = nickname;
this.f = f;
}
void getInfo()
{
f.format("%s",nickname);
}
}
public class FormatDemo2
{
public static void main(String[] args)
{
User user = new User("Teskinfly",new Formatter(System.out));//构造器中传入流对象,用format方法直接写入
user.getInfo();
}
}
/*
输出:
Teskinfly
*/
3. String.format():返回格式化的字符串
三, 正则表达式
1. 创建正则表达式(Pattern)
2. 量词
- 贪婪型(我全都要)
- 勉强型(找一个最少满足需求的):贪婪型+'?'
- 占用型:勉强型+'+'
3.pattern和Matcher
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class PatternAndMatcher
{
public static void main(String[] args)
{
String s = "wer223sfeeax234sa";
Pattern p = Pattern.compile("[we]e\\w");
Matcher m = p.matcher(s);
while(m.find())
{
System.out.println(m.group()+" "+m.start()+" "+m.end());
}
}
}
4.Matcher常用操作:
- 分割:split
- 替换:replaceFirtst replaceAll appendReplacement
- 重置:reset
四,扫描输入
1. Scanner
import java.util.Scanner;
public class ScannerDemo
{
public static void main(String[] args)
{
Scanner sc = new Scanner("abcede\n123 java");
String s = sc.next();
int i = sc.nextInt();
String s2 = sc.next();
System.out.println(s+" "+i+" "+s2);
sc.close();
}
}
2. Scanner不仅能扫描基本类型,也能进行正则表达式扫描
import java.util.Scanner;
import java.util.regex.MatchResult;
public class ThreatAnalyzer {
static String threatData =
"58.27.82.161@02/10/2005\n" +
"124.45.82.161@02/10/2005\n" +
"58.27.82.161@02/10/2005\n" +
"72.27.82.161@02/10/2005\n" +
"[Next log section with different data format]";
public static void main(String[] args) {
Scanner scanner = new Scanner(threatData);
String pattern = "(\\d+[.]\\d+[.]\\d+[.]\\d+)@(\\d{2}/\\d{2}/\\d{4})";
while (scanner.hasNext(pattern)) {
scanner.next(pattern);
MatchResult match = scanner.match();
String ip = match.group(1);
String date = match.group(2);
System.out.format("Threat on %s from %s\n", date, ip);
}
}
}
/*
输出:
Threat on 02/10/2005 from 58.27.82.161
Threat on 02/10/2005 from 124.45.82.161
Threat on 02/10/2005 from 58.27.82.161
Threat on 02/10/2005 from 72.27.82.161
*/
结束