对于这个问题,网络上已经有较多的解答,大多数都是说String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据。这个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创建的对象是不可以改变的了。
分享到:
相关推荐
String,StringBuffer,StringBuilder区别。几乎所有的应用开发都离不开操作字符串,理解字符串的设计和实现以及相关 工具如拼接类的使用,对写出高质量代码是非常有帮助的
从非常细致的角度分析了String和Stringbuffer的主要区别
String的效率低于StringBuffer,开发时最好选用StringBuffer。
String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别 String、StringBuilder和StringBuffer的区别
string和StringBuffer的区别
JAVA平台提供了两个类:String和StringBuffer,它们可以储存和操作字符串,即包含多个字符的字符数据.这个String类提供了数值不可改变的字符串.而这个StringBuffer类提供的字符串进行修改.当你知道字符数据要改变的时候...
String StringBuffer和StringBuilder 区别之源码解析 从源码角度简单对它们之间的区别进行了验证
String及StringBuffer和StringBuilder的区别
java面试笔试题String 和StringBuffer的区别
String ,StringBuffer与StringBuilder的区别
StringBuffer:字符创变量 StringBuilder:字符创变量 从上面的名字可以看到,String是“字符创常量”,也就是不可改变的对象。对于这句话的理解你可能会产生这样一个疑问 ,比如这段代码:
介绍了String、StringBuffer、StringBuilder的使用方法,以及理论知识
JAVA中String与StringBuffer的区别 JAVA中String与StringBuffer的区别 自己的学习笔记总结
针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍针对String的详细介绍...
详解string与stringbuffer的区别,详述了String 是不可变,以及他们的再字符串连接时的效率区别!
StringBuffer和String_区别 java.lang.StringBuffer线程安全的可变字符序列。一个类似于 String 的字符串缓冲区,但不能修改。虽然在任意时间点上它都包含某种特定的字符序列,但通过某些方法调用可以改变该序列的...
简单的介绍了String、StringBuffer和StringBuilder的区别
NULL 博文链接:https://coderdream.iteye.com/blog/845822
能更好的利用String和StringBuffer
Java中String和StringBuffer的区别