学习总结
本篇是对学习【Java编程思想 第13 章字符串】的学习总结。
可以证明,字符串操作时计算机程序设计中最常见的行为。
不可变的String
查看JDK文档你就会发现,String类中每一个看起来会修改String值得方法,实际上都是创建了一个全新的String对象,包含修改后的字符串内容。而最初的String对象则丝毫未动。
重载“+”与StringBuilder
String支持“+”和“+=”的重载。当我们对字符串做拼接的操作时,编辑器自动引入java.lang.StringBuilder类,因为它更高效。
用于String的“+”和“+=”是Java中仅有的两个重载的操作符,而Java不允许程序员重载任何操作符
String上的操作
方法 | 参数,重载版本 | 应用 |
---|---|---|
构造器 | 默认版本,String,StringBuilder,StringBuffer,char数组,byte数组 | 创建数组对象 |
length() | String中字符的个数 | |
charAt() | int索引 | 取得String中该索引位置上的char |
length() | String中字符的个数 | |
toCharArray() | 生成一个char[],包含String的所有字符 | |
equals(),equalsIgnoreCase() | 与之比较的String | 比较两个String是否相等 |
compareTo() | 与之比较的String | 按字典序比较两个String的大小,比较结果为-1,0,1。注意大小写不相等 |
contains() | 要搜索的CharSequence | 如果该字符串对象包含参数的内容,则返回true |
containsEquals() | 与之比较的CharSequence或StringBuffer | 如果该String对象与参数的内容完全一致,则返回true |
contentEquals() | 与之进行比较的CharSequence或者StringBuffer | 如果该String与参数的内容完全一致,则返回true |
regionMatcher() | 该String的索引偏移量,另一个String及其索引偏移量,要比较的长度。重载版本增加了“忽略大小写”功能 | 返回boolean结果,以表明所比较区域是否相等 |
startsWith() | 该String可能的后缀String,存在版本在参数中增加了偏移量 | 返回boolean结果,以表明此参数是否是该字符串的前缀 |
endsWith() | 该String可能的后缀String | 返回boolean结果,以表明此参数是否是该字符串的后缀 |
indexOf(),lastIndexOf() | char,char与起始索引,String,String与起始索引 | |
substring(),subSequence() | 起始索引,起始索引+终点坐标 | 返回一个新的String,以包含参数指定的子字符串 |
concat() | 要连接的String | 返回一个新的String对象。内容为原始String连接上参数String |
replace() | 要替换的字符,用来进行替换的新字符。也可以用一个CharSequence来替换另一个CharSequence | 返回替换后的新字符串。如果没有替换发生,则返回原始的Sting对象 |
toLowerCase(),toUpperCase() | 将字符的大小写改变后,返回一个新的对象。如果没有改变发生,则返回原始的String对象 | |
trim() | 将String两端的空白字符删除后,返回一个新的String对象。如果没有改变发生,则返回原始的对象 | |
valueOf() | Object,char[],char[]+偏移量+字符个数,boolean,char,int,long,float,double | 返回一个表示参数内容的String |
intern() | 为每一个字符序列生成一个且仅生成一个String引用 |
格式化输出
System.out.printf();
System.out.format();
底层实现里printf()就是调用format();
也可以用下面的语法:
//one
Formatter f = new Formatter(System.out);
f.format("%d\n", u);
//two
String.format("%d\n", u);
//其地底层实现也是依赖Formatter
public static String format(String format, Object... args) {
return new Formatter().format(format, args).toString();
}
格式化说明符
%[argument_index ][flags][width][.precision]conversion−[argumentindex ]:
- [flags]: 默认是右对齐,可以用“-”标志来改变方向
- [width]: 最大尺寸
- [.precision]: 用于浮点数,表示小数点后要显示的位数
- conversion:数据类型标志
常见的类型转换
字母 | 含义 | 字母 | 含义 |
---|---|---|---|
d | 整数(十进制) | e | 浮点数(科学计数) |
c | Unicode字符 | x | 整数(十六进制) |
b | Boolean | h | 散列码(十六进制) |
s | String | % | 字符“%” |
f | 浮点数(十进制) |
正则
常规使用的匹配
String.matches(pattern);
//
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(string);
while(m.find()){
m.group();
}
量词
量词描述一个模式吸收输入文本的方式。
- 贪婪型:尽可能的匹配
- 非贪婪型?:这个量词匹配满足所需模式的最少字符数
- 占有型+(java特有):当正则表达式被应用于字符串时,它会产生相当多的状态,一遍在失败时可以回溯。而“占有的”量词并不保存这些状态,由此它们可以防止回溯。它们常常用于防止正则表达式失控,因此可以是正则表达式执行起来更有效。
如何匹配 | 贪婪型 | 非贪婪型 | 占有型 |
---|---|---|---|
一个或零个X | X? | X?? | X?+ |
零个或者多个X | X* | X*? | X*+ |
一个或者多个X | X+ | X+? | X++ |
恰好n次X | X{n} | X{n}? | X{n}+ |
至少n次X | X{n,} | X{n,}? | X{n,}+ |
X至少n次,且不超过m次 | X{n,m} | X{n,m}? | X{n,m}+ |
Pattern标记
Pattern.CASE_INSENSITIVE (?i):大小写不敏感。
Pattern.DOTALL (?s):在dotall模式下,.匹配所有字符,包括行终结符。
Pattern.MULTILINE (?m):在多行模式下,表达式^和$分别匹配一行的开始和结束。
于是我们可以这样写正则:(?s)(?i)/\\*(.*?)\\*/|//(.*?)
查找
不同于Python一下子就可以找出所有匹配,Java一次只能找到一个匹配。
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(string);
while( m.find() ) {
print("Match \"" + m.group() + "\" at positions "
+ m.start() + "-" + m.end());
}
替换操作
正则表达式特别便于替换文本,它提供了许多方法:repalceFirst(String replacement),replaceAll(String replacement),appendReplacement(StringBuffer sbuf, String replacement)。
特别说明一下appendReplacement,它不像repalceFirst和replaceAll替换第一个匹配或者所有匹配,它执行渐进式的替换。
// 将所有元音字母大写
StringBuffer sb = new StringBuffer();
Pattern pattern = Pattern.compile("[aeiou]");
Matcher matcher = pattern.matcher(match);
while ( matcher.find() ) {
//将当前匹配子串替换为指定字符串,并且将替换后的子串以及其之前到上次匹配子串之后的字符串段添加到 StringBuffer 对象里
matcher.appendReplacement(sb, matcher.group().toUpperCase());
}
//将最后一次匹配工作后剩余的字符串添加到 StringBuffer 对象里。
matcher.appendTail(sb);
print(sb.toString());
通过reset()方法,可以将现有的Matcher对象应用于一个新的字符序列。
public class Resetting {
public static void main(String[] args) {
Pattern p = Pattern.compile("[frb][aiu][gx]");
Matcher m = p.matcher("fix the rug with bags");
while ( m.find() ) {
print(m.group());
}
// 将现有的Matcher对象应用于一个新的字符序列
m.reset("fix the rig with rags");
while ( m.find() ) {
print(m.group());
}
}
}
Matcher常用方法
方法 | |||
---|---|---|---|
appendReplacement() | appendTail() | end() | find() |
group() | lookingAt() | matches() | replaceAll() |
replaceFirst() | reset() | start() |