字符串

来源:互联网 发布:网络上赌博赢了5千万 编辑:程序博客网 时间:2024/06/03 12:38

基础知识

1、 字符串有一个字符串缓冲池的概念,String类中每一个看起来会修改String值得方法实际上都是创建一个全新的String对象来包含修改后的字符串内容;

2、 String作为方法参数,实际传递的是引用的一个拷贝,只有在方法运行的时候,局部参数、局部引用才存在,方法结束局部参数、局部引用消失;

3、 用于String”+”+=”Java中仅有的两个重载过操作符而Java并不允许程序员重载任何操作符;

4、 String”+”连接时默认使用StringBuilderStringBuilderSE5引入的,在这之前用的是StringBufferStringBuffer是线程安全的,因此开销较大,因此最好显示使用StringBuilder来操作复杂字符串;

5、 容器类,例如ArrayList全部重写了toString()方法,因此在System().out.println(容器对象)时容器对象中的元素要全部重写toString方法,这是因为:当运行到”InfiniteRecursion address:”+this时,这里发生了自动类型转换,由其他类型转换成String类型,因为编译器看到了一个String对象后面跟着一个”+”,而再后面的对象不是String,于是编译器尝试调用this上的toString方法来实现自动类型转换

辅助类1:格式化输出

1、 格式化方法:
System().out.printf()/System().out.format():通俗来讲就是使用格式修饰符来表示数据将来的位置并且数据按格式修饰符的顺序排序且以逗号分隔排成一行;

2、 格式化辅助类:java.util.Formatter,其构造器参数是输出目的地,最常用的还是PrintStreamOutputStreamFileSystem.out即控制台;

3、 格式化说明符:更精细、更复杂的格式修饰符
%[argument_index$][flags][width][.precision]conversion
argument_index$:参数位置,从1开始;
flags:”-”局左对齐默认居右对齐
width:控制一个域最小尺寸,可以应用于各种类型的数据并进行转换,而且其行为方式都一样;(看效果就是调用toString来输出)
.precicion:不是所有类型的数据都可以使用precision,而且应用于不同类型的数据进行转换时,precision的意义也不同,在将precision应用于String时,它表示打印String时输出字符的最大数量,而将precision应用于浮点数时,它表示小数部分要显示出来的位数,默认是6位小数,如果小数位数过多则舍入,太少则在尾部补零,由于整数没有小数部分,所以precision无法应用于整数,如果对整数应用precision则触发异常;
conversiond整数,b布尔类型,s代表Stringf代表浮点数,x代表16进制整数,%代表字符%,还有很多………..
%10.2fnew Float(4.2532435345)输出是4.25,居右对齐,前面有6个空格

f.format("%1$-15s %5s %10s\n", new String[]{"Item","Qty","Price"});

%1$-15s:第一个参数Item,居左对齐,长度是15包括11个空格
%5s:第二个参数Qty,居右对齐,长度是5包括2个空格,ItemQty相隔:11+1+2=14个空格
%10s:第三个参数Price,居右对齐,长度是10包括5个空格,QtyPrice相隔:5+1=6个空格

4、 String.format():其内部也是创建一个Formatter对象,只是用一次的情况下可以使用该方法;

辅助类2:正则表达式,一个强大且灵活的文本处理工具,以某种方式来描述字符串

1、 明白\\\\\\的区别,\\\\代表一个普通的反斜杠;

2、 ()代表表达式分组;

3、 StringmatchessplitreplaceFirstreplaceAll默认支持正则表达式;

4、 表达式组成:字符类、逻辑操作符、边界匹配符、量词;

5、 量词:描述了一个模式吸收输入文本的方式:
①贪婪型:默认设置,贪婪表达式会为所有可能的模式发现尽可能多的匹配,导致此问题的一个经典理由就是假定我们的模式仅能匹配第一个可能的字符组,如果它是贪婪的,那么它会继续往下匹配;
②勉强型:在贪婪型基础上添加”?”,这个量词匹配满足模式所需的最少字符数又称作最少匹配
③占有型:在贪婪型基础上添加”+”,目前这种类型的量词只有在Java中才可用并且也更高级,当正则表达式被应用于字符串时,它会产生相当多的状态以便在匹配失败时可以回溯,而占有型量词并不保存这些中间状态,因此它们可以防止回溯,它们被用来防止正则表达式失控,因此可以让正则表达式执行起来更有效;

6、 贪婪型与勉强型区别:
贪婪与非贪婪模式影响的是被量词修饰的子表达式的匹配行为,贪婪模式在整个表达式匹配成功的前提下,尽可能多的匹配,而非贪婪模式在整个表达式匹配成功的前提下,尽可能少的匹配。非贪婪模式只被部分NFA引擎所支持。
源字符串:aa<div>test1</div>bb<div>test2</div>cc 
正则表达式一:<div>.*</div> 
匹配结果一:<div>test1</div>bb<div>test2</div> 
贪婪型保证在匹配成功的前提下尽可能多的匹配所以包含了bb、test2
正则表达式二:<div>.*?</div> 
匹配结果二:<div>test1</div>

勉强型保证在匹配成功的前提下尽可能的减少字符数,所以仅仅包含了test1

7、 Pattern  pattern = Pattern.compile(正则表达式);
Matcher  matcher = pattern.matcher(要查找的字符串);

8、 Pattern还可以接受一个标记参数来调整匹配的行为:
CANON_EQ:就是把字符按照Unicode/ASCII/GBK转换成编码后进行匹配,默认不考虑规范的等价性;
CASE_INSENSITIVEASCII字符进行不区分大小写匹配,就是美国人用的字母,数字,符号;CASE_INSENSITIVE配合UNICODE_CASE就是对基于Unicode的字符不区分大小写匹配;
COMMENTS:空格被忽略掉,#开头直到行末的注释也会被忽略掉;
DOTALL:”.”匹配所有字符包括”.”作为句号默认”.”表达式不匹配行终结符即句号
MULTILINE:多行模式,表达式^/$分别匹配一行的开始和结束,默认情况下这些表达式仅仅匹配输入的完整字符串的开始和结束;
UNICODE_CASE:Unicode编码忽略大小写匹配,默认大小写不敏感匹配只能在ASCII字符集下进行;
UNIX_LINSE:在”./^/$”只识别行终结符\n

9、 
replaceFirst(String replacement):以参数字符串replacement替换掉第一个匹配成功的部分;
replaceAll(String replacement):以参数字符串replacement替换所有匹配成功的部分;
appendReplacement(StringBuffer sbuf,String replacement):执行渐进式替换,与replaceFirstreplaceAll只能使用一个固定的字符串,它允许你调用其他方法来生成或处理replacement从而以编程的方式将目标分隔成组,从而具备更强大的替换功能,在执行一次或多次appendReplacement之后,调用appendTail可以将输入字符串剩余部分复制到sbuf中;

0 0