文档章节

String 和StringBuffer 在传递过程中的区别

刘付kin
 刘付kin
发布于 2016/12/07 11:02
字数 565
阅读 2
收藏 0

#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 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的值是可以改变的,形参的值改变也会影响实参的值。

© 著作权归作者所有

共有 人打赏支持
刘付kin
粉丝 6
博文 98
码字总数 71383
作品 0
深圳
Java字符串的String、StringBuilder、StringBuffer三者特性详解

一、不可变String类型 字符串是计算机程序设计中的,最常见行为,Java的字符串操作最主要的类是String,并且String对象是不可变的(Immutable),即对象一旦创建在内存中,那么它的内容就不再...

断桥残雪断桥残雪
2015/08/12
0
0
java-----string stringbuffer stringwriter

string 是Java参数传递(by value)造成的,是不可变的(immutable).,例如 基本类型,String传值,复制了值传递过去;可变的(Object)传值,复制了引用传递过去。 String a = "a";//假设a指向地...

风林火山
2011/01/10
0
0
Java常见面试题及答案1-10

1.什么是Java虚拟机?为什么Java被称作是“平台无关的编程语言”? Java 虚拟机是一个可以执行 Java 字节码的虚拟机进程。Java 源文件被编译成能被 Java 虚拟机执行的字节码文件。 Java 被设...

t4i2b10x4c22nf6a
2017/12/18
0
0
StringBuilder与StringBuffer的比较

很多人对String和StringBuffer的区别已经很了解了吧,可能还有人对这两个类的工作原理有些不清楚的地方,复习一下吧,顺便牵出J2SE 5.0里面带来的一个新的字符操作的类StringBuilder。那么这...

Koon.LY
2012/05/14
0
0
String StringBuffer StringBuilder

StringBuffer类是线程安全的,在实现的时候会有大量的代码来处理同步, 如果程序只是单线程的,这样会大大的降低执行的效率。这种情况下面应该考虑使用StringBuilder,它和StringBufer的方法...

的书法上的
2014/07/08
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Asus RamPage VI Extreme开不了机

Asus RamPage VI Extreme 的机器突然关机,然后就再也开不了机,没有任何反应。有人说是BIOS问题,可是这个连Bios都进不去的,按后面的刷新Bios、清除CMOS等都没有什么效果,没有任何反应。 ...

openthings
31分钟前
1
0
ubuntu 18.04 desktop 截图快捷键

如图,点击下方的 add shortcut 为这个快捷键命名 输入截图 command gnome-screenshot -a 设置快捷键 常用为 Ctrl - Alt + a 参考 http://os.51cto.com/art/200903/113091_all.htm...

公孙衍
40分钟前
0
0
一个六年Java程序员的从业总结:比起掉发,我更怕掉队

恍然间,发现自己在这个行业里已经摸爬滚打了五、六年了,原以为自己就凭已有的项目经验和工作经历怎么着也应该算得上是一个业内比较资历的人士了,但是今年在换工作的过程中却遭到了重大的挫...

老道士
43分钟前
18
2
Spacemacs快捷键

由于Spacemacs快捷键太多,为方便使用,将常用的快捷键记录在此。 以下快捷键都是在emacs的evil模式下 Buffers操作 创建名称为<buffer-name>的buffer SPC b b <buffer-name> 从已打开的buf...

yxmsw2007
47分钟前
1
0
GO冒泡,二分查找

package mainimport("fmt")func main() {var arr [5]int = [5]int{11,13,9,2,25}maopao(&arr)fmt.Println("arr = ", arr) //[2 9 11 13 25]findIndex := binaryFind(&arr, 0......

汤汤圆圆
今天
1
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部