JAVA这三个字符串相关的类有什么异同,此篇会予以说明.
可变字符串类型.
以上内容的示例代码如下:
public class Tests {
public static void main(String[] args) {
StringBuilder cache;
String str=new String("String");
/*构造器可以传入一个字符串对象*/
StringBuilder sBuilder1=new StringBuilder(str);
/*也可以直接传入字符串*/
StringBuilder sBuilder2=new StringBuilder("StringBuilder");
/*返回长度(int length())*/
System.out.println("sBuilder2的长度:"+sBuilder2.length());
/*拼接方法 StringBuffer append(Type a)*/
cache=sBuilder1.append("Builder");
System.out.println("拼接后的字符串sBuffer1:"+cache);
/*插入方法 StringBuffer insert(int index,Type a) */
cache=sBuilder1.insert(0,"这是");
System.out.println("插入字符串后的字符串sBuilder1:"+cache);
/*删除方法 StringBuffer delete(int start,int end)*/
/*注意,该方法删除的区间为[start<=删除的区间
运行结果:
sBuilder2的长度:13
拼接后的字符串sBuffer1:StringBuilder
插入字符串后的字符串sBuilder1:这是StringBuilder
删除方法后的字符串:StringBuilder
替换方法后的字符串:StringBuffer
此类与StringBuilder的用法一模一样.
但是线程安全性StringBuffer大于StringBuilder.
执行效率上StringBuilder大于StringBuffer.
测试两种类型的效率:分别追加5000万个字符.
两者的运行效率对比代码:
public class Tests {
public static void main(String[] args) {
StringBuilder stringBuilder=new StringBuilder("1");
StringBuffer stringBuffer=new StringBuffer("1");
/*记录StringBuilder开始操作的时间*/
long timeBuilderStart=System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
stringBuilder.append(i);
}
long timeBuilderEnd=System.currentTimeMillis();
/*计算StringBuilder完成操作所需的时间*/
long timeBuilder=timeBuilderEnd-timeBuilderStart;
/*记录StringBuffer开始操作的时间*/
long timeBufferStart=System.currentTimeMillis();
for (int i = 0; i < 50000000; i++) {
stringBuffer.append(i);
}
long timeBufferEnd=System.currentTimeMillis();
/*计算StringBuffer完成操作所需的时间,单位毫秒*/
long timeBuffer=timeBufferEnd-timeBufferStart;
System.out.println("StringBuilder完成操作所需的时间:"+timeBuilder+"毫秒");
System.out.println("StringBuffer完成操作所需的时间:"+timeBuffer+"毫秒");
}
}
执行结果:
StringBuilder完成操作所需的时间:1914毫秒
StringBuffer完成操作所需的时间:2682毫秒
可以看到在量极大的时候有明显的速度差距.
值得一提的是,跑这段代码的时候,java.exe占用了多达1GB~2.5GB的内存....
最高时占用内存2636104KB,合2.51GB...
底层是字符数组(char[])及其对数组的操作.
1.int length():返回字符串对象的字符个数.
2.char chatrAt(int index):返回此字符序列中指定索引处的字符.
3.String concat(String str):将指定字符串拼接至本字符串末尾,返回新对象.
4.boolean startsWith(String prefix)与endsWith(String suffix):检查该字符串是否以prefix为前缀,suffix为后缀.
5.byte[] getBytes():将此字符串按照默认字符集编码为默认字节序列,返回此数组.
6.int indexOf(int ch/String str):返回该字符/字符串在此字符串第一次出现的位置.
7.int indexOf(int ch/String str,int fromIndex):返回该字符/字符串从该下标之后第一次出现的位置.
如果返回-1,说明ch/str不存在于查找的序列中.
8. int lastIndexOf(int ch);
9.int lastIndexOf(String str)
10.int lastIndexOf(int ch,int endIndex)
11.int lastIndexOf(String str,int endIndex)
8-11均是查找字符/子字符串在此字符序列中最后一次出现的位置,找不到返回-1.
12.String substring(int beginIndex),substring(int beginIndex,int endIndex):从beginIndex开始截取.截取至endIndex.区间[beginIndex,endIndex).
13.char[] toCharArray():字符串转换为字符数组.字符串中的字母转换为大写(toUperCase)或小写(toLowerCase),返回值为String.
14.String trim():去掉此字符序列前后的空格.
15.static String valueOf(Type v):任意参数v变为字符串对象.
16.equals(Object obj):比较两个字符串的内容是否相同.
equals()与==的区别:equals是比较内容是否相同,==比较是否是同一个对象.String类中重写了equals().
下面给出上面大部分方法的示例代码:
import java.util.Arrays;
public class Tests {
public static void main(String[] args) {
String str1=new String("String");
/*返回字符串中字符的个数int length()*/
System.out.println("str1的长度:"+str1.length());
/*返回指定索引处的字符 char charAt(int index)*/
System.out.println("str1的第三个字符为:"+str1.charAt(2));
/*指定字符串拼接 String concat(String str)*/
String str2="字符串";
System.out.println("将str2拼接至str1后:"+str1.concat(str2));
/*检查是否以此为前缀,boolean startsWith(String prefix)*/
/*此处以开始作为示例*/
boolean f=str1.startsWith("s");
System.out.println("str1是否以"+"s"+"为第一个字母:"+f);
/*编码为默认字符集的字节序列 byte[] getBytes()*/
byte[] strBytes=str1.getBytes();
System.out.println("编码为字符集字符序列:"+Arrays.toString(strBytes));
/*某个字符第一次出现的位置 int indexOf(String str)*/
System.out.println("字符i第一次出现的位置:"+str1.indexOf("i"));
/*截取方法 String subString(int beginIndex,int endIndex)*/
System.out.println("截取字符串ing:"+str1.substring(3,6));
/*转换为字符数组 char[] toCharArray()*/
char[] strArray=str1.toCharArray();
System.out.println("转换为char数组的str1:"+Arrays.toString(strArray));
/*去掉前后空格的方法 String trim()*/
String spaceStr=" String ";
System.out.println("去掉前后空格之前的spaceStr:"+spaceStr);
System.out.println("去掉前后空格的spaceStr:"+spaceStr.trim());
/*任意数据变为字符串对象 String valueOf(Type v)*/
/*因为是静态方法所以要用类名调取*/
int num=10;
System.out.println("num转换为字符串对象:"+String.valueOf(num));
/*String类中已经重写的equals方法 boolean equals()*/
String str3=new String("String");
System.out.println("str1与str3:"+str1.equals(str3));
}
}
执行结果:
str1的长度:6
str1的第三个字符为:r
将str2拼接至str1后:String字符串
str1是否以s为第一个字母:false
编码为字符集字符序列:[83, 116, 114, 105, 110, 103]
字符i第一次出现的位置:3
截取字符串ing:ing
转换为char数组的str1:[S, t, r, i, n, g]
去掉前后空格之前的spaceStr: String
去掉前后空格的spaceStr:String
num转换为字符串对象:10
str1与str3:true