`
mmdev
  • 浏览: 12929257 次
  • 性别: Icon_minigender_1
  • 来自: 大连
文章分类
社区版块
存档分类
最新评论

String和StringBuffer的区别?

 
阅读更多

对于这个问题,网络上已经有较多的解答,大多数都是说StringStringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个String类提供了数值不可改变的字符串。而这个StringBuffer类提供的字符串可以进行修改。当你知道字符数据要改变的时候你就可以使用StringBuffer。典型地,你可以使用StringBuffers来动态构造字符数据。那么可能初学者可能就会有这样的问题,怎么不可变啊,比如如下的代码

String str = "str";

str = "str1";

System.out.print("str");

那么这个时候打印的不就是str1么?怎么没有变啊?String创建的对象一样改变了啊!其实是没有变的,我想初学者忽略了这样一个问题,就是str = "str1";这句话的时候,其实是新建了一个对象,并且让引用str指向了这个地址,原来的“str”那个地址就被抛弃了。
接下来又引入了这样一个问题,到底String str=new String("abc");这样一句话创建了几个对象?我们可以把上面这行代码分成String str、=、"abc"和new String()四部分来看待。String str只是定义了一个名为str的String类型的变量,因此它并没有创建对象;=是对变量str进行初始化,将某个对象的引用(或者叫句柄)赋值给它,显然也没有创建对象;现在只剩下new String("abc")了。那么,new String("abc")为什么又能被看成"abc"和new String()呢?我们来看一下被我们调用了的String的构造器:

public String(String original) {  
    //other code ...  
} 

  大家都知道,我们常用的创建一个类的实例(对象)的方法有以下两种:

  1、使用new创建对象。

  2、调用Class类的newInstance方法,利用反射机制创建对象。

  我们正是使用new调用了String类的上面那个构造器方法创建了一个对象,并将它的引用赋值给了str变量。同时我们注意到,被调用的构造器方法接受的参数也是一个String对象,这个对象正是"abc"。所以引号引起来的部分其实也是一个对象,这就正好解释了上面提到的String创建的对象是不可以改变的了。

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics