学习总结-Thinking In Java Chapter 13 strings

学习总结

本篇是对学习【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浮点数(科学计数)
cUnicode字符x整数(十六进制)
bBooleanh散列码(十六进制)
sString%字符“%”
f浮点数(十进制)

正则

常规使用的匹配

String.matches(pattern);
//
Pattern p = Pattern.compile(pattern);
Matcher m = p.matcher(string);
while(m.find()){
    m.group();
}

量词

量词描述一个模式吸收输入文本的方式。
- 贪婪型:尽可能的匹配
- 非贪婪型?:这个量词匹配满足所需模式的最少字符数
- 占有型+(java特有):当正则表达式被应用于字符串时,它会产生相当多的状态,一遍在失败时可以回溯。而“占有的”量词并不保存这些状态,由此它们可以防止回溯。它们常常用于防止正则表达式失控,因此可以是正则表达式执行起来更有效。

如何匹配贪婪型非贪婪型占有型
一个或零个XX?X??X?+
零个或者多个XX*X*?X*+
一个或者多个XX+X+?X++
恰好n次XX{n}X{n}?X{n}+
至少n次XX{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()
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值