一,不可变/只读性
String对象是不可变的,每次对String对象的修改都会创建一个新的String对象并返回其引用。
这种设计也有其合理性:
对于一个方法而言,参数是为该方法提供信息的,而不是让方法来改变自己的。(倘若就是希望改变该参数,那就用旧的引用来接受新的对象)。
二,与StringBuilder的关系
用于String对象的“+”和“+=”操作符是java中仅有的两个重载过的操作符,可用来连接String。
(String“+”操作的自动类型转换:String对象后面跟“+”和另一个非String对象B时,编译器会调用B的toStirng()来将B转换成String类型)
猜想:由于不可变性却带来了效率问题,会因此产生一大堆需要垃圾回收的中间对象。
真实的工作情况是:String对象的“+”和“+=”操作时,编译器会自动引用StringBuilder来处理。
编译器在此为我们自动优化了,但是它优化得有限,当在循环内进行字符串的加操作时,会重复创建多次StringBuilder对象,这显然是浪费的;因此对于类似循环的情况应该明确使用StringBuilder对象。
StringBuilder是可变的,它提供了丰富的高效的对字符串的操作,insert();replace();substring();reverse();append();delete();toString();只需生成和操作一个StringBuilder对象便可以完成诸多字符串操作。
三,正则表达式(这是我想讲的重点)
能解决字符串处理的匹配问题。
正则表达式
分类:String对象的正则表达式
非String对象的正则表达式
注意:圆括号()作用是将正则表达式分组;|竖直线表示或操作; 换行符;java中\代表插入一个正则表达式的反斜线
简单的途径:String类自带的正则表达式工具:
(1).--切割--split(String regex)--:将字符串从正则表达式匹配的地方切开
(2)--替换--{replaceFirst(String regex) , replaceAll(String regex)}
replaceFirst(String regex)--替换正则表达式匹配的第一个子串;
replaceAll(String regex)----替换正则表达式匹配的所有子串;
(3)--匹配--matches(String regex)
3.2--非String对象的正则表达式
部分-正则表达式构造子列表:
字符类:
逻辑操作符:
边界匹配符:
量词:贪婪型;勉强型;
CharSequence接口从CharBuffer,String,StringBuffer,StringBuilder类中抽象出来的一般化定义。
interface CharSequence{
charAt(int i);
length();
subSequence(int start,int end);
toString();
}
构造正则表达式对象--重点来了
Pattern和Matcher
Pattern pattern=Pattern.compile(x); 编译正则表达式x,Pattern对象表示编译后的正则表达式。
Matcher matcher=pattern.matcher(); Matcher对象有很多功能可用。在此介绍它的find(); group(); start(); end(); reset();
例子:
String reg="\d+mj"; //数字mj
Pattern pattern=Pattern.compile(reg);
Matcher matcher=pattern.matcher();
while(matcher.find){
System.out.println(matcher.group()+"---"+matcher.start()+"---"+matcher.end());
}
find()方法用来在CharSequence中查找多个匹配,注意关键词,"多个",所以才会用while来遍历。
find()像迭代器那样向前遍历输入字符串。有个重载方法find(int startFindIndex),参数即字符串中搜索的起点。
group()组--注意-要现有find()操作-再才有group组操作
组是用括号划分的正则表达式,可根据组的编号来引用某个组;
例子:a(b)(c)d :group()/group(0)--abcd; group(1)--b; group(2)--c
group()与group(0)作用相同--返回前一次匹配操作的第0组。
groupCount()--返回组数,注意-不包括第0组
start([int group])--返回前一次操作找到的组的起始索引
end(int group)---返回前一次操作找到的组的最后一个字符索引加1的值
reset();-----------将matcher应用与一个新的字符串
易混点:
1.匹配
String自带的matches()--整个输入的字符串都匹配正则表达式才true
Matcher的matches()--同上
Pattern.matches(String reg,String charSequence)---同上
if(Pattern.matches("\d+mj","mj123mj")){
System.out.println("ok");
}else{
System.out.println("no");
}
Matcher的find()可以在输入的任意位置定位正则表达式,注意--是任意位置。这就很方便了
Pattern pa=Pattern.compile("\d+mj");
Matcher ma=pa.matcher("123mj123mj");
while(ma.find()){
System.out.println(ma.group());
};
2.替换
String的replace()---全部替换,参数是普通的String
与replaceAll()--全部替换,参数是正则表达式