Java中String 和StringBuffer的区别

来源:互联网 发布:抗韩中年人淘宝外设店 编辑:程序博客网 时间:2024/06/05 21:03

先看下面的这个例子,读懂这个例子,你就理解了。

publicclass Test {  

publicstaticvoid stringReplace (String text) {  

   text = text.replace('j' , 'i');   

   }  

publicstaticvoid bufferReplace (StringBuffer text) {  

   text = text.append("C");   

   }  

publicstaticvoid main (String args[]) {   

    String textString = new String ("java");   

    StringBuffer textBuffer = new StringBuffer ("java");   

    stringReplace (textString);   

    bufferReplace (textBuffer);   

    System.out.println (textString + textBuffer);   

    }   

    }  

答案是 javajavaC

这是String参数传递,是不可变的(immutable).

而题目中第七行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 str=new String("HELLO");

String str="HELLO";

以上的区别请说明以下

String str=new String("HELLO");创建了两个对象,一个是"HELLO",然后再用"HELLO"创建一个str引用的对象.

下面的就在创建"HELLO"之后把str指向"HELLO",这样只创建了一个String的实例

~~~~~~~~~~~~~~~~~~~~~~~~~

因此得到的结论是:如果你对字符串中的内容经常进行操作,特别是内容要修改时,那么使用StringBuffer,如果最后需要String,那么使用StringBuffer的toString()方法好了!

也许这就是你的程序的性能瓶颈!

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

非可变对象一旦创建之后就不能再被改变,可变对象则可以在创建之后被改变。

String对象是非可变对象,StringBuffer对象则是可变对象。

为获得更佳的性能你需要根据实际情况小心谨慎地选择到底使用这两者中的某一个

一、StringBuffer的equals方法没有覆盖Object的方法,所以StringBuffer a=new StringBuffer("ss");StringBuffer b=new StringBuffer("ss");,生成了两个对象,
a.equals(b)=false,比较的是地址。
二、等号比较的是地址,String a = "a";String b=a;只生成了一个对象a==b true。
StringBuffer a=new StringBuffer("a");StringBuffer b = a; 也是生成一个对象a==b true。
三、String a="ss";String b="ss"; a.equals(b)=true a==b true因为也是一个对象。这是因为编译时只产生了一个对象"ss"。String a=new String("ss");String b=new String("ss");a.equals(b)=true,没有疑问,a==b false。因为a,b是在运行时才产生的对象,产生了2个对象。

阅读全文
'); })();
0 0
原创粉丝点击
热门IT博客
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 简单不织布手工作品图片 不织布花朵教程 不织布手工作品图片水果 不织布钱包教程 不织布做衣服图片 不织布娃娃手工作品图片 不织布手工作品 不织布卡包 不织布相框 不织布玩偶图片 不织布是什么 不织布手机袋 不织布入门 用不织布做蔬果小饰物 不织布手工包包教程 不织布挂袋 不织布迷你饰物 不织布卡套 不织布钥匙包 不织布手工花 不织布挂件 不织布研磨轮 不织布食物 不织布蔬菜 不织布粘贴画 不织布手工水果 不织布手机链 不织布小挂件 不织布抱枕 不织布立体 不织布小花 不织布蝴蝶 不织布零钱包教程 不织布小动物 不织布动物 不织布汽车 不织布卡包图片 不织布铅笔盒 无纺布是什么材料做的 无纺布加工 无纺布厂