常用的字符串对象一般有如下:String,StringBuffer和StringBuilder
01-创建方式:
1,String类型:
面试官:下面这段代码创建几个常量?
String str="hello!";
str=str+"world";
回答:三个。
如图:
原因解释:
1,首先String是一个对象是常量
2,每次修改都会在内存空间中开辟新的空间
总结:String是用final修饰的类,指向常量,所以他会直接在常量池中创建。
2,StringBuild和StringBuffer对象:
StringBuild和StringBuffer是直接创建对象,修改里面对象的内容,所以只会创建一个。
注意:
StringBuilder
1,初始开辟的一个默认16空间字符,也可以指定
2,在字符没有达到上限之前不会申请开辟新的空间
3,修改字符不会开辟新的空间
4,StringBuilder是一个使用append方法,将字符串添加到字符后面。
3,代码测试:
public static void main(String[] args) {
String str = "1";
String str1 = "1";
StringBuffer sbf = new StringBuffer("1");
StringBuffer sbf1 = new StringBuffer("1");
StringBuilder sbd = new StringBuilder("1");
StringBuilder sbd1 = new StringBuilder("1");
System.out.println("---- euqals 比较 ----");
boolean stringEqualString = str.equals(str1);
boolean stringBuilderEqualStringBuilder = sbd.equals(sbd1);
boolean stringBufferEqualStringBuffer = sbf.equals(sbf1);
System.out.println("String和String比较结果:" + stringEqualString);
System.out.println("StringBuilder和StringBuilder比较结果:" + stringBuilderEqualStringBuilder);
System.out.println("StringBuffer和StringBuffer比较结果:" + stringBufferEqualStringBuffer);
boolean stringEqualStringBuffer = str.equals(sbf);
boolean stringEqualStringBuilder = str.equals(sbd);
boolean stringBufferEqualStringBuilder = sbf.equals(sbd);
System.out.println("String和StringBuffer比较结果:" + stringEqualStringBuffer);
System.out.println("String和StringBuilder比较结果:" + stringEqualStringBuilder);
System.out.println("StringBuffer和StringBuilder比较结果:" + stringBufferEqualStringBuilder);
System.out.println("---- == 比较 ----");
boolean stringEqualString1 = str == str1;
boolean stringBuilderEqualStringBuilder1 = sbd == sbd1;
boolean stringBufferEqualStringBuffer1 = sbf == sbf1;
System.out.println("String和String比较结果:" + stringEqualString1);
System.out.println("StringBuilder和StringBuilder比较结果:" + stringBuilderEqualStringBuilder1);
System.out.println("StringBuffer和StringBuffer比较结果:" + stringBufferEqualStringBuffer1);
}
}
// 结果为
---- euqals 比较 ----
String和String比较结果:true
StringBuilder和StringBuilder比较结果:false
StringBuffer和StringBuffer比较结果:false
String和StringBuffer比较结果:false
String和StringBuilder比较结果:false
StringBuffer和StringBuilder比较结果:false
---- == 比较 ----
String和String比较结果:true
StringBuilder和StringBuilder比较结果:false
StringBuffer和StringBuffer比较结果:false
02-使用效率问题:
因为StringBuffer中加了很多synchronized,保证可以线性操作,但是效率相较于StringBuild慢,但是比String快
不等式:StringBuild>StringBuffer>String。
03-安全问题:
StringBuffer中使用了大量的synchronized以保证线程安全,所以相较于其他两个,是安全的。