原因:
String类开辟的内存空间是不可收缩/改变的(它是字符串常量不可改变的,对其操作时其实它是不断的创建新对象),所以String对象拼接字符串时其实是抛弃原来的空间
重新开辟两块空间再拼接(即:
以要拼接的两个字符串重新创建两个String对象和一个临时的StringBuffer对象后调用append方法拼接,再将临时的StringBuffer对象转为
String(此过程中创建了四个对象,加大了系统开销)).而StringBuffer开辟的内存空间是可变/收缩的,当改变其内容时直接操作原对象(直接往原内存空间改变/插入值即
可),且StringBuffer是线程安全的(多个线程同时操作该对象时,必须是前一个线程执行完才让下一个线程执行).而StringBuilder是线程非安全的(多个线程同时操作该对
象时如果前一个线程未执行完就发现有第二个线程则立刻执行第二个线程,故引起其数据不安全,但效率比StringBuffer更快)
(2).操作数据:
①.String操作少量数据
②.StringBuffer多线程下操作大量数据
③.StringBuilder单线程下操作大量数据
(3).使用场合:
String用来表示创建后就"不会再改变"的字符串
StringBuffer用来表示内容可变的字符串,并提供了修改底层字符串的方法
2.String和StringUtils的用法,StringUtils类来自mons.lang.StringUtils,是对String的操作补充,其中的方法全都是static型的,所以直接StringUtils.methodName()即可调用
(1).字符串拆分、合并
split(String指定字符串/分割符);//从"指定字符串/分割符"所在的每个索引处将当前字符串拆分成字符数组或将当前字符串中每个"指定字符串/分割符"前的字符串拆分成字符串数组,返回String[]
split(String指定字符串/分割符,intarraySize);//从"指定字符串/分割符"所在的每个索引处将当前字符串拆分成指定数组大小(arraySize)的字符串数组(限制拆分后的字符串数组的大小为arraySize),String[]
注:
①.分隔符为./|/*/+/\等特殊字符时需转义
②.如果被分割的字符串中有多个分隔符时可以用"|"连接每个分隔符(如:
Stringstr="Javastring-split#test",可以用Str.split("|-|#")把每个字符串分开
toCharArray();//将当前字符串拆分成新的字符数组,返回char[]
StringUtils的方法:
join(Object[]array);//把数组中的元素连接成一个字符串,返回String
join(Object[]array,charseparator);//用指定的分隔符(separator)将数组中的元素拼接成字符串,返回String
join(Object[]array,charseparator,intstartIndex,intendIndex);//用指定的分隔符(separator)将数组中从startIndex到endIndex的元素连接成字符串,返回String
repeat(String原字符串,intn);//将"n"个"原字符串"拼接成新字符串,返回String
(2).字符串格式化:
String.format("%02d",8);//左对其且以0不足位数
staticStringformat(String格式字符串/最终输出格式,Object被格式化的变量(对象/字符串/整数...)列表(可以是多个参数));//将当前参数格式化为指定的"格式字符串"所
表示的格式,格式字符串的写法为:
注:
格式字符串中的转义序列不是\而是%,格式字符串后可跟任意长度的任意字符串,但是其后跟的字符串将原样输出
整数类型:
%+argumentIndex$(可选项,表示要格式化第几个参数或被格式化的参数在参数列表中的索引/位置,缺省值/默认值为第一个)+flags(可选项,表示格式化后的数据
格式/最终输出格式,其值为以下几种,并可同时取多个:
-:
在最小宽度内左对齐,不能与0一起使用;
0:
用零补足位数/填充;
(:
若参数是负数结果中不添加负号而是用圆括号把数字括起来,只适用于10进制,若对象为BigInteger才可以用于8/16进制;
+:
结果总是包括一个符号,只适用于10进制,若对象为BigInteger才可以用于8/16进制;
空格:
正值前加空格,负值前加负号,只适用于10进制,若对象为BigInteger才可以用于8/16进制;
:
每3位数字之间用,分隔,只适用于10进制;
#:
只适用于8/16进制,8进制时在结果前加个0,16进制时在结果前加0x)+width(转化后的字符串的位数)+conversion(格式化后结果的表示形式/将被格式化的参
数格式化为指定的数据类型的String表示形式(只是表示形式为指定的数据类型形式,最终的类型还是String型),d:
十进制数,o:
八进制数,x/X:
十六进制数)
浮点数型:
%+argumentIndex$(可选项,表示要格式化第几个参数或被格式化的参数在参数列表中的索引/位置,缺省值/默认值为第一个)+flags(可选项,表示格式化后的数据
格式/最终输出格式其值为以下几种,并可同时取多个:
-:
在最小宽度内左对齐,不能与0一起使用;
0:
用零补足位数/填充;
(:
若参数是负数结果中不添加负号而是用圆括号把数字括起来,只适用于eEfgG的转换;
+:
结果总是包括一个符号;
空格:
正值前加空格,负值前加负号;
:
每3位数字之间用,分隔,只适用于fgG的转换)+width(转化后的字符串的位数)+.+precision(小数点后的位数)+conversion(格式化后结果的表示形式/将被
格式化的参数格式化为指定的数据类型的String表示形式(只是表示形式为指定的数据类型形式,最终的类型还是String型),e/E:
用计算机科学记数法表示的十进制
数,f:
十进制普通表示方式,g/G:
根据具体情况自动选择用普通表示方式还是科学计数法方式,a/A:
带有效位数和指数的十六进制浮点数)
字符串型:
%+argumentIndex$(可选项,表示要格式化第几个参数或被格式化的参数在参数列表中的索引/位置,缺省值/默认值为第一个)+flags(可选项,表示格式化后的数据
格式/最终输出格式,其值为-:
左对齐)+width(转化后的字符串的位数)+conversion(格式化后结果的表示形式/将被格式化的参数格式化为指定的数据类型的Str
ing表示形式(只是表示形式为指定的数据类型形式,最终的类型还是String型),s:
字符串类型,c:
字符型)
日期类型:
%+argumentIndex$(可选项,表示要格式化第几个参数或被格式化的参数在参数列表中的索引/位置,缺省值/默认值为第一个)+flags(可选项,表示是日期和时间的
转换,用t/T表示)+width(转化后的字符串的位数,一般不用)+conversion(其值为以下几种:
用于转换日期:
Y:
年份的全称(如2011);
y:
年份的简称(如11);
C:
除以100的四位数表示的年份(如00-99);
B:
月份的全称(如January);
b:
月份的简称(如Jan);
h:
与b相同;
m:
前导零的月份;
A:
星期的全称(如Sunday);
a:
星期的简称(如Sun);
j:
一年中的天数(前导零,如058);
d:
一月中的天数(前导零,如02);
e;一月中的天数(不前导零,如2);
用于转换时间:
H:
24小时制的小时(前导零,如00-23);
I:
12小时制的小时(前导零,如01-12);
k:
24小时制的小时(不前导零,如0-23);
l:
12小时制的小时(不前导零,如1-12);
M:
小时中的分钟(前导零,如00-59);
S:
分钟中的秒(前导零,如00-60);
L:
秒中的毫秒(前导零,如000-999);
N:
秒中的毫微秒(前导零000000000-999999999);
p:
上午(am)/下午(pm);
s:
自协调世界时(1970年1月1日00:
00:
00至现在所经过的秒数);
Q:
自协调世界时(1970年1月1日00:
00:
00至现在所经过的毫秒数);
用于转换日期和时间的组合:
R:
24小时制的时间,%tH:
%tM;
T:
24小时制的时间,%tH:
%tM:
%tS;
r:
12小时制的时间,%tI:
%tM:
%tS%Tp,上午/下午标记('%Tp')的位置)
常见异常:
java.util.IllegalFormatConversionException:
%!
=java.lang.%:
被格式化的参数类型与规则转换类型不对应
java.util.FormatFlagsConversionMismatchException:
Conversion=%,Flags=%:
flag不适用于规则转换类型
StringUtils的方法:
rightPad(String原字符串,intsize,StringpadStr);//将"原字符串"以padChar字符串在右边补足size位,返回String
leftPad(String原字符串,intsize,StringpadStr);//将"原字符串"以padChar字符串在左边补足size位,返回String
center(String原字符串,intsize,StringpadStr);//将"原字符串"以padChar字符串在两边补足size位,返回String
(3).获取字符串所在的索引/是否存在
indexOf(Stringstring);//获取指定字符串在当前字符串中第一次出现处的索引,返回int
indexOf(Stringstring,intstratIndex);//从指定索引处开始搜索/获取指定字符串在当前字符串中第一次出现的索引,返回int
lastIndexOf(Stringstring);//获取指定字符串在当前字符串中最后出现处的索引,返回int
lastIndexOf(Stringstring,intstartIndex);//获取指定字符串在当前字符串中从0到指定索引之间最后出现处的索引(指定索引后的字符串不进行搜索/获取),返回int
StringUtils的方法:
ordinalIndexOf(String原字符串,String要查找的字符串,intordinal);//返回"要查找的字符串"在"原字符串"中第ordinal次出现的索引,返回int
countMatches(String原字符串,String要查找的字符串);//获取"要查找的字符串"在"原字符串"中出现的次数,返回int
(4).判断字符串是否包含/存在
contains(CharSequences);//判断当前字符串是否包含指定字符串,返回bool
startsWith(Stringprefix);//判断当前字符串是否以指定的字符串开始,返回bool
startsWith(Stringprefix,inttoffset);//判断当前字符串中从指定索引开始处是否以指定的字符串开始,返回bool
endsWith(Stringsuffix);//判断当前字符串是否以指定的字符串结尾,返回bool
(5).字符串替换
replace(char/String当前字符串中指定要替换的字符,char/String要替换后的新字符);//将当前字符串中所有和指定字符相同的字符替换为指定的新字符,返回String
replaceAll(String当前字符串中指定要替换的字符,String要替换后的新字符);//将当前字符串中所有和指定字符相同的字符替换为指定的新字符,可以实现字符串的删除功能,返回String
replaceFirst(Stringregex,Stringreplacement);//将当前字符串中和指定字符相同的第一个字符替换为指定的新字符,返回String
注:
replace和replaceAll的区别:
都是全部替换,replace的参数是一般的字符/字符串,replaceAll的参数可以是规则表达式(如:
replaceAll("\\d","丁")),replaceAll所用的参
数为一般字符/字符串时与replace的效果一样
StringUtils的方法:
replace(String原字符串,String要替换的字符串,String替换后的字符串,intn);//将"原字符串"中的"n"个"要替换的字符串"替换为"替换后的字符串",返回String
overlay(String原字符串,String替换后的字符串,intstart,intend);//将"原字符串"中从start到end之间的字符串替换为"替换后的字符串",返回String
(6).字符串截取
substring(intbeginIndex,intendIndex);//获取当前字符串中从开始索引处到结束索引处的字符串,返回String
substring(intbeginIndex);//获取当前字符串中从开始索引处到结尾处的字符串,返回String
(7).大小写转换
toUpperCase();//将当前字符串中的所有字符转为大写,返回String
toLowerCase();//将当前字符串中的所有字符转为小写,返回String
(8).字符串的判断/比较:
equals(Stringparam);//判断当前字符串与指定字符串的内容是否相等,返回bool
equalsIgnoreCase(Stringstring);//判断当前字符串与指定字符串的内容是否相等(忽略大小写的比较),返回bool
contentEquals(StringBuffersb);//将当前字符串与指定的StringBuffer比较,返回bool
matches(Stringstring);//判断当前字符串与指定字符串是否相等,返回bool
compareTo(Stringstring);//判断字符串的大小关系(依次比较两个字符串中每个字符的ascii码值的大小,直到遇到不相等的两个字符就直接返回不相等的两个字符的ascii码值的差值,不再比较后面的字符),返回int
compareToIgnoreCase(Stringstring);//判断字符串的大小关系(依次比较两个字符串中每个字符的ascii码值的大小(忽略大小写的比较),直到遇到不相等的两个字符就直接返回不相等的两个字符的ascii码值的差值,不再比较后面的字符),返回int
contentEquals(Stringcs);//将当前字符串与指定的CharSequence比较,返回bool
StringUtils的方法:
不抛出异常
isEmpty(Stringstr);//判断字符串是否为null或空字符(判断标准为str==null/""或str.length()==0),返回bool
isBlank(Stringstr);//判断字符串是否为null或空字符(判断标准为str==null/""或str.length()==0),返回bool
(9).获取指定索引处的字符
charAt(intindex);//获取指定索引处的char型字符,返回char
codePointAt(intindex);//获取指定索引处的字符的ascii码,返回int
codePointBefore(intindex);//获取指定索引之前的字符的ascii码,返回int
codePointCount(intbeginIndex,intendIndex);//获取当前字符串中从开始索引处到结束索引之间的Unicode代码点数,返回int
(10).字符串删除:
StringUtils的方法
deleteWhitespace(Stringstr);//删除字符串中的所有空字符,返回String
strip(String原字符串,String指定的字符串);//去掉"原字符串"两端的"指定的字符串",返回String
remove(String原字符串,String指定的字符串);//去掉"原字符串"两端的"指定的字符串",返回String
stripStart(String原字符串,String指定的字符串);//去掉"原字符串"前端的"指定的字符串",返回String
removeStart(String原字符串,String指定的字符串);//去掉"原字符串"前端的"指定的字符串",返回String
stripEnd(String原字符串,String指定的字符串);//去掉"原字符串"末端的"指定的字符串",返回String
removeEnd(String原字符串,String指定的字符串);//去掉"原字符串"末端的"指定的字符串",返回String
stripAll(String[]strs);//对字符串数组中的每个字符串进行strip(Stringstr)操作,返回String[]
stripAll(String[]strs,String指定的字符串);//对字符串数组中的每个字符串进行strip(String原字符串,String指定的字符串)操作,返回String[]
(11).其它常用操作
staticStringvalueOf(任意类型参数);//获取指定参数的字符串表示形式
Stringtrim();//将当前字符串前后的所有空白去除
intlength();//获取当前字符串的长度
Stringconcat(Stringstr);//将指定字符串拼接到当前字符串的结尾
voidgetChars(intsrcBegin,intsrcEnd,char[]dst,intdstBegin);//将字符从当前字符串复制到目标字符数组
staticStringcopyValueOf(char[]data);//获取指定数组中表示该字符序列的String
staticStringcopyValueOf(char[]data,intoffset,intcount);//获取指定数组中表示该字符序列的String
byte[]getBytes();//使用平台的默认字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中。
byte[]getBytes(Charsetcharset);//使用给定的charset将此String编码到byte序列,并将结果存储到新的byte数组。
byte[]getBytes(StringcharsetName);//用指定的字符集将此String编码为byte序列,并将结果存储到一个新的byte数组中
inthashCode();//获取当前字符串的哈希码
Stringintern();//获取字符串的规范化表示形式
intoffsetByCodePoints(intindex,intcodePointOffset);//获取当前字符串中从指定索引处处偏移codePointOffset个代码点的索引
booleanregionMatches(booleanignoreCase,inttoffset,Stringother,intooffset,intlen);//判断两个字符串区域是否相等
booleanregionMatches(inttoffset,Stringother,intooffset,intlen);//判断两个字符串区域是否相等
3.StringBuffer的用法:
(1).字符串追加/拼接:
append(Object指定参数对象);//将"指定参数对象"追加/拼接到原字符串对象后面,返回StringBuffer
insert(int指定索引,Object指定对象);//将"指定对象"插入到"指定索引"处
(2).字符串删除:
delete(int开始索引,int结束索引);//将当前字符串中从(包含)"开始索引"到"(不包含)结束索引"的子字符串删除
deleteCharAt(int指定索引);//将当前字符串中"指定索引"处的字符删除,注:
如果"指定索引"处的字符是增补字符,该方法将不会移除整个字符,如果需要准确处理增补字符,可通过Character.charCount(thisSequence.codePointAt(index))
(3).字符串替换:
replace(int开始索引,int结束索引,String指定字符串);//将当前字符串中从(包含)"开始索引"到"(不包含)结束索引"的子字符串替换为"指定字符串"
setCharAt(int指定索引,char指定字符);//用"指定字符"替换"指定索引"处的字符
(4).字符串截取/获取:
substring(int开始索引[,int结束索引]);//获取当前字符串中从"开始索引"到"结束索引"处的字符串,返回String
charAt(int指定索引);//获取"指定索引"处的字符,返回
(3).长度获取:
length();//获取StringBuffer字符串对象长度,返回int
capacity();///获取StringBuffer对象的可分配空间长度/容量,返回int
(4).其它方法:
toString();//将StringBuffer对象转换为String对象,返回String
reverse();//反转当前字符串,对当前的StringBuffer对象不影响,返回String
ensureCapacity(intcapacity);//设置缓冲区容量大小,返回void
setLength(intlen);//设置缓冲区长度,返回void
trimToSize();//将StringBuffer对象中的存储空间缩小