string和stringbuffer区别
这是好友面试的一道题,其实我知道使用的区别,StringBuffer必须new出来,StringBuffer的append的效率比string的+=的效率高,
其实发现还有很大的区别,看了看以前scjp的考题
public class Test {
public static void stringReplace (String text) {
text = text.replace('j' , 'i');
}
public static void bufferReplace (StringBuffer text) {
text = text.append("C");
}
public static void main (String args[]) {
String textString = new String ("java");
StringBuffer textBuffer = new StringBuffer ("java");
stringReplace (textString);
bufferReplace (textBuffer);
System.out.println (textString + textBuffer);
}
}
答案是 javajavaC
这是Java参数传递(by value)造成的,是不可变的(immutable).,例如 基本类型,String传值,复制了值传递过去;可变的(Object)传值,复制了引用传递过去。
而题目中第七行text = text.append (“C”),append方法会改变text中的值
而这个text与main中的textBuffer是指向同一个对象,所以对应的输出是javac。
string的值永远不会改变!
String a = "a";//假设a指向地址0x0001,
a = "b";//重新负值后a指向地址0x0002,但0x0001地址中保存的"a"依旧存在,但已经不再是a所指向的。
从表面上看String类型的对象改变了值,但事实是他不能改变值,只能改变指向的地址
StringBuffer则不同,直接改变指向的地址中保留的值
还有
StringBuffer s1 = new StringBuffer("a");
StringBuffer s2 = new StringBuffer("a");
s1.equals(s2)//为什么是false
String s1 = new String("a");
String s2 = new String("a");
s1.equals(s2)//为什么是true
StringBuffer类中没有重新定义equals这个方法,因此这个方法就来自Object类,
而Object类中的equals方法是用来比较地址的,所以等于false.
String类中重新定义了equals这个方法,而且比较的是值,而不是地址。所以会是
true。
String是系统内置类型,而且是final的,值不可以改变的,定义一个字符串会产生一个实例和一个对该实例地址的引用。
StringBuffer 和StringBuilder区别
StringBuffer 是synchronized 线程安全的,StringBuffer维护了一个大小固定的字符串缓冲区,当字符串长度超过StringBuffer大小时会自动增加,主要使用Insert和append方法,对于运行期要进行字符串的组装操作推荐使用
StringBuilder是jdk5以后有的等价的StringBuider,但是不是线程安全的
String str = new String("abc");//用new()来新建对象的,它会在存放于堆中。每调用一次就会创建一个新的对象。
String str = "abc";//是先在栈中创建一个对String类的对象引用变量str,然后查找栈中有没有存放"abc",如果没有,则将"abc"存放进栈,并令str指向”abc”,如果已经有”abc” 则直接令str指向“abc”.
示例:
public class Test {
public static void main(String[] args){
String str1 = "abc";
String str2 = "abc";
System.out.println(str1==str2);//true
String s1 = new String("abc");
String s2 = new String("abc");
System.out.println(s1==s2);//false
String b1 = new String("abc").intern();
String b2 = new String("abc").intern();
System.out.println(b1==b2);//true
String c1 = new String("abc");
String c2 = new String("abc").intern();
System.out.println(c1==c2);//false
String d1 = "abc";
String d2 = "ab";
String d3 = (d2 + "c").intern();
System.out.println(d1==d3);//true
}
}
result:
true
false
true
false
true