不可变String
String对象是不可变的,String类中每一个看来会修改String值的方法,实际上都是创建了一个全新的对象,以包含修改后的字符串内容。它具有只读性。但是该特性会带来效率问题。为String对象重载的+操作符,则会产生n个String类型的中间对象。java在编译的过程中自动引入了StringBuider类。
StringBuilder提供了insert(),replace(),substring(),revserse(),delete()和toString()方法,它是线程不安全的方法。
容器类都有toString()方法,并且覆盖了该方法,使得它生成的String结果能够表达容器自身,以及容器所包含的对象。
String常用方法:
length() String中字符的个数
charAt(int index) 取得String中index位置上的char
getChars(int startIndex, int endIndex),getBytes(int startIndex, int endIndex) 复制char或byte到一个目标数组(startIndex和endIndex不传入则默认为0,str.length() -1)
toCharArray() 生成一个char[],包含String所有的字符串
equals(String str),equalsIgnoreCase(String str) 比较两个String内容是否相同
compareTo(String str) 按字典顺序比较String的内容,比较结果为负数,零或整数。大小写并不等价
contains(char charSequence) 如果str包含charSequence,返回true
contentEquals(char charSequence/StringBuffer sb) 如果String与参数内容完全一样,返回true
regionMatcher(int index, int compareIndex, int length) 返回boolean类型,以表明所比较区域是否相等
startsWith(String str) 返回boolean类型,以表明该String是否以str开头
endWith(String str) 返回boolean类型,以表明该String是否以str结尾
indexOf(char ch),lastIndexOf(char ch) 如果String并不包含ch,则返回-1,否则返回参数在String中的起始索引。
subString(int startIndex, int endIndex),subSequence(int startIndex, int lastIndex) 返回一个新的String,以包含参数指定的字符串
concat(String str) 返回一个新的String对象,内容为原始String连接上参数String
replace(char ch) 返回替换字符后新的String对象,如果没有替换发生,则返回原始String对象
toLowerCase(),toUpperCase() 将字符的大小写改编后,返回一给新的String对象
trim() 将String两端的空白字符删除后,返回一个新的String对象
valueOf(...) 返回一个表示参数内容的String
intern() 为每一个唯一的字符序列生成一个且仅生成一个String引用
C中printf()它使用一个简单的格式化字符串,加上要插入其中的值,然后将其格式化输出。printf()并不使用重载的+操作符来连接引号内的字符串或字符串变量,而是使用特殊的占位符来表示数据将来的位置,他还将插入格式化字符串的参数,以逗号分隔,排成一排。这些占位符被称作格式修饰符,他们不但说明了插入数据的位置,同时还说明了将插入什么类型的变量以及如何对其格式化。
Java SE5引入的format方法可用于PrintStream或PrintWriter对象。format模仿C中的printf()。所有的格式化功能都由java.util.Formatter类来处理。当你创建一个Formatter对象时候,需要像其构造器传递一些信息,告诉它最终的结果将向哪里输出。Formatter使用下面的抽象语法来控制更加精细的格式
%[argument_index$][flags][width][.precision]conversion
width指定一个域的最小尺寸,formatter在必要时加入空格来确保这个域达到最小尺寸。
默认情况下数据是右对齐的,可以使用-改变对齐方向
precison指定最大尺寸。precison并不可作用于所有类型。当作用于String时,表示能输出字符的最大数量,作用于浮点数时,表示小数点后要显示出来的位数。作用于int时,则会抛异常
Formatter转换参数
d 整数型 e 浮点数(科学计数)
c Unicode字符 x 整数(十六进制)
b boolean值 h 散列吗(十六进制)
s String % 字符%
f 浮点数(十进制)
String.format()是一个static方法,它接受与Formatter.format()方法一样的参数,但返回一个String对象。
正则表达式
在java中,\表示我要插入一个正则表达式的反斜线,所以其后面的字符具有特殊的意义。如正常情况下d在正则表达式中表示一个数字,而在java中应该用\d表示一个数字。换行符( )和制表符( )之类除外。在一个或多个之前用+表示;?表示前面的那个字符可能存在,也可能不存在;|表示或操作;W表示非单词字符;w表示一个单词字符;i表示不区分大小写
如:-?\d+ 可能有一个负号后面跟着一个或多个数字
String自带matches(regex)方法来匹配字符串是否符合正则表达式;String还提供split()方法嫁给你字符串从正则表达式匹配的地方切开;Spring提供了replace(regex, "str")方法来对匹配的字符串进行替换
字符
B 制定字符B
xhh 十六进制值为oxhh的字符
uhhhh 十六进制表示为oxhhhh的Unicode字符
制表符Tab
换行符
回车
f 换页
e 转义
字符类
. 任意字符
[abc] 包含a,b和c的任何字符,与a|b|c等价
[^abc] 除了a,b和c之外的任何字符
[a-zA-Z] 从a到z或从A-Z的任何字符
[abc[hij]] 任意a,b,c,h,i和j字符,与a|b|c|h|i|j等价
[a-z&&[hij]] 任意h,i和j字符
s 空白符(空格,tab,换行,换页和回车)
S 非空白符,与[^s]等价
d 数字[0-9]
D 非数字[^0-9]
w 词字符[a-zA-Z0-9]
W 非词字符[^w]
逻辑操作符
XY X紧跟在Y后面
X|Y X或Y
(X) 捕获组
边界匹配符
^ 一行的起始
$ 一行的结束
词的边界
B 非词的边界
G 前一个匹配的结束
量词描述了一个模式吸收输入文本的方式
贪婪型:贪婪表达式会为所有可能的模式发现尽可能多的匹配
勉强型:用问号来指定,这个量词匹配满足模式所需的最少字符数
占有型:当正则表达式被应用于字符串时,它会产生相当多的状态,以便在匹配失败时可以回溯。而占有型量词并不保存这些中间状态,因此可以防止回溯。常常用于防止正则表达式失控
贪婪型 勉强型 占有型 如何匹配
X? X?? X?+ 一个或多个X
X* X*? X*+ 零个或多个X
X+ X+? X++ 一个或多个X
X{n} X{n}? X{n}+ 恰好n次X
X{n,} X{n,}? X{n,}+ 至少n次X
X{n,m} X{n,m}? X{n,m}+ X至少n次,且不超过m次
可以使用java.util.regex包中的statci Pattern.compile()方法来编译正则表达式,它会根据正则表达式生成一个Pattern对象。Pattern的matcher(reg)方法会生成一个Matcher对象。Matcher()方法提供了boolean matches();boolean lookingAt();boolean find()和boolean find(int start) 方法判断不同类型的匹配是否成功。Pattern对象还提供了static boolean matchers(String rege, CharSequence input)方法来检查regex是否匹配整个CharSequence。
Matcher.find()方法用来在CharSequence中查找多个匹配。find(i)能接收一个整数作为参数,该参数表示字符串中字符的位置,并以其作为搜索起点。
组是用括号划分的正则表达式,可以根据组的编号来引用某个组。组号为0表示整个表达式,组号为1表示第一个被括号括起来的表达式。Matcher提供了一些列方法用以获取与组相关的信息:public int groupCount()返回该匹配器的模式中的分组数目,第0组不包括在内;public String group()返回前一次匹配操作的第0组;public String group(int i)返回在前一次匹配操作期间指定的组号,若不存在,则返回null;public int start(int group)返回在前一次匹配操作中寻找到的组的起始索引。public int end(int group)返回在前一次匹配操作中寻找到的组的最后一个字符索引加一的值。
start()返回匹配起始位置的索引,end()返回所匹配的最后字符的索引加一的值。匹配失败调用start()或end()会产生IllegalStateException。
find()可在输入的任意位置定位正则表达式;lookingAt()和matches()只有在正则表达式与输入的最开始出就开始匹配时才会成功。matches()只有在整个输入匹配正则表达式时才会成功,而lookingAt()只要输入的第一部分匹配就会成功。
Pattern类的compile()接收一个标记参数以匹配的行为:
Pattern.CANON_EQ 两个字符当且仅当他们的完全规范分解相匹配时,就认为他们是匹配的。默认的情况下,匹配不考虑规范的等价性
Pattern.CASE_INSENSITIVE(?i) 默认情况下,大小写不敏感的匹配假定只有US-ASCII字符集中才能进行。基于UNICODE_CASE标记结合此标记可以开启基于Unicode的大小写不敏感的匹配
Pattern.COMMENTS(?s) 空格符将被忽略,同时以#开始直到行末的注释也会被忽略掉
Pattern.DOTALL(?s) 在dotall模式中。表达式.可以匹配所有字符,包括终结符
Pattern.MULTILINE(?m) 在多行模式下,表达式^和$分别匹配一行的开始和结束。^还匹配输入字符串的开始,而$还匹配输入字符串的结尾。
Pattern.UNICODE_CASE(?u) 与Pattern.CASE_INSENSITIVE(?i)连用
Pattern.UNIS_LINES(?d) .,^和$行为中,只识别
split()方法将输入字符串断开成字符串对象数组,断开便捷由下列正则表达式决定:String[] split(CharSequence input);String[] split(CharSequence input, int limit);
正则表达式提供了很多方法可以进行方法替换
replaceFirst(String replacement):用replacement替换掉第一个匹配成功的部分
replaceAll(String replacement):用replacement替换掉素有匹配成功的部分
appendReplacement(StringBuffer sb, String replacement):允许调用其他方法生成或处理replacement,以编程的方式将目标分割成组
appendTail(StringBuffer sb):在执行了一次或多次appendReplacemenet()方法之后,调用此方法可以将输入的字符串余下的部分复制到sb中
reset()方法可以将现有的Matcher对象应用于一个新的字符序列。在循环外创建一个空的Matcher对象然后用reset()方法每次为Matcher加载一行输入性能会提高。
StringReader将String转换为可读的流对象,用这个对象来构建BufferReader对象。BufferReader调用readLine()方法将一行输入转换成String,换句话说,readLine()方法是根据 来进行行的划分,若一行有两组及以上数据,需要自己进行分割。
Java SE5新增了Scanner类。Scanner类可以接受任何类型的输入对象,包括File,InputStream,String或Readable对象。Scanner将所有的输入、分词一哦翻译的操作都隐藏在不同类型的next方法中。所有的next方法只有找到一个完整的分词后才会返回。Scanner的hasNext方法来判断下一个输入的分词是否是所需类型。在默认情况下,Scanner根据空白字符对输入进行分词,可以使用useDelimiter()方法根据正则表达式指定自己所需的定界符。delimeter()方法用来返回当前正在作为定界符使用的Pattern对象。使用next(pattern)方法将找到下一个匹配该模式的输入部分,调用match()方法可以获得匹配的结果。它仅仅针对下一个宿儒分词进行匹配。
在J2SE1.4和JAVA SE5之前,分隔字符串的唯一方法是使用StringTokenizer。现已废弃