String 和StringBuffer 在传递过程中的区别
2016-02-22 09:38
916 查看
1:看下面一段程序,对比区别:
public class StringTest {
public static void main(String[] args) {
String aString = “helloword”;
String bString = “helloword”;
aString = aString.replace(‘h’, ‘d’);
aString = aString.replace(‘l’, ‘b’);
System.out.println(aString);
//经过jdk编译优化后,使得astring 和 bstring 都是指向了同一个内存空间。
System.out.println(aString == bString);
}
总结:String 和 StringBuffer 都是引用传递,形参和实参都是指向同一个对象。
但是由于String的值一旦被初始化就不能够改变,只能够重新分配内存空间来生成另一个对象。所以形参怎么改变都不会影响到实参的值
而StringBuffer的值是可以改变的,形参的值改变也会影响实参的值。
public class StringTest {
public static void main(String[] args) {
String aString = “helloword”;
String bString = “helloword”;
aString = aString.replace(‘h’, ‘d’);
aString = aString.replace(‘l’, ‘b’);
System.out.println(aString);
//经过jdk编译优化后,使得astring 和 bstring 都是指向了同一个内存空间。
System.out.println(aString == bString);
String aString2 = new String(aString); String bString2 = new String(bString); //由于是new的形式,所以在内存中是不可能为同一个对象的,也就是地址不可能相同, //aString2 == bString2比较的是地址引用,所以不相等 //aString2.equals(bString2)比较的是值,所以值相等。 System.out.println(aString2 == bString2); System.out.println(aString2.equals(bString2)); StringBuffer aStringBuffer = new StringBuffer("helloword"); StringBuffer bStringBuffer = new StringBuffer("helloword"); //由于是new的形式,所以在内存中是不可能为同一个对象的,也就是地址不可能相同, //aStringBuffer == bStringBuffer比较的是地址引用,所以不相等 System.out.println(aStringBuffer == bStringBuffer); //aString2.equals(bString2)也是不相等,情况不明。 System.out.println(aStringBuffer.equals(bStringBuffer)); //转化为字符串后在进行比较就可以了。 System.out.println(aStringBuffer.toString().equals(bStringBuffer.toString())); appengd(aStringBuffer, bStringBuffer); System.out.println(aStringBuffer + " " + bStringBuffer); } public static void changeForString(String a,String b){ //由于String的值一旦被初始化就不能够改变,只能够重新分配内存空间来生成另一个对象 //因而a = a+b;这句话的意思是:将a、b的值连接起来生成一个新的对象"ab",再让a指向它,但是原先的aString对象还是只想原来的对象“helloWord” a = a.concat(b); b=a; } public static void appengd(StringBuffer a,StringBuffer b){ //StringBuffer是能够改变自身的值得,所以这会改变原有的值,而不是另外生成一个对象, //又由于a和aStringBuffer都指向了同一个对象,所以aStringBuffer的值也改变了 a.append(b); //当前b指向了和a、aStringBuffer一样的对象,但是原本的bStringBuffer指向的对象并没有变化 b = a; }
}
总结:String 和 StringBuffer 都是引用传递,形参和实参都是指向同一个对象。
但是由于String的值一旦被初始化就不能够改变,只能够重新分配内存空间来生成另一个对象。所以形参怎么改变都不会影响到实参的值
而StringBuffer的值是可以改变的,形参的值改变也会影响实参的值。
相关文章推荐
- Android之获取手机上的图片和视频缩略图thumbnails
- android string.xml文件中的整型和string型代替
- Android java 与 javascript互访(相互调用)的方法例子
- android上改变listView的选中颜色
- String.intern
- Prototype源码浅析 String部分(二)
- Ruby中的String对象学习笔记
- PostgreSQL ERROR: invalid escape string 解决办法
- 浅谈C++中的string 类型占几个字节
- 标准C++类string的Copy-On-Write技术
- C++实现string存取二进制数据的方法
- C#中string和StingBuilder内存中的区别实例分析
- PHP STRING 陷阱原理说明
- c#中 String和string的区别介绍
- C#实现的图片、string相互转换类分享
- asp.net String.IsNullOrEmpty 方法
- JavaScript中字符串(string)转json的2种方法
- C#中string用法实例详解
- C#中的DataSet、string、DataTable、对象转换成Json的实现代码
- Javascript实现Array和String互转换的方法