您的位置:首页 > 其它

关于字符串、数组和参数传递的一道题

2013-08-31 11:34 246 查看
前几天测试的一道题目,想了好久没想明白,今天略有所得。源程序如下:

public class Test {

	String str=new String("good");
	char[] ch={'a','b','c'};
	public static void main(String[] args) {
		Test test=new Test();
		test.change(test.str);
		System.out.print(test.str+" and ");
		System.out.print(test.ch);
	}
	
	public void change(String str,char ch[]){
		str="test ok";
		ch[0]='g';
	}
}

输入结果是什么?当时我就想啊,字符串和数组都是引用数据类型,变量存放的都是内存地址,既然地址指向的内存重新赋值,那么内存里的内容能不改变嘛!果断写:test ok and gbc。结果显而易见,额见红了,为什么会这样子呢?

在查资料的时候看到这样一句话:当程序运行String str=new String("good")时,会首先查找StringPool中是否存在字符串good,若不存在,则创建,而后在堆内存中创建字符串对象;否则就直接在堆内存中创建字符串对象。是不是这样子呢?代码验证一下:
public class Test {

	String str=new String("good");
	public static void main(String[] args) {
		Test test=new Test();
		test.change(test.str);
	}
	
	public void change(String str){
		str="good";
		System.out.println(this.str==str);
	}
}


输出结果为false,是不是可以认为new对象时并未在StringPool中创建呢?

在网络上一番奔波后,总算略有所得:前面说过new是在堆内存中创建对象,而change方法总的参数为局部变量,因此,运行str="good"语句时,程序会在栈内存中创建一个局部变量str,而后在StringPool中为局部变量str分配一块空间,该空间的为字符串“good”;而实例变量str指向的是堆内存,该指向的内容并未改变,因此输出仍为good。

既然字符串和数组都是引用数据类型,为什么数组却改变了呢?语句char[] ch={'a','b','c'}相当于char[] ch=new char[]{'a','b','c'},也就是会在堆内存中创建一个引用ch指向的数组对象,参数传递时,就把该地址的值传递给了change方法内的局部变量ch,在方法内改变的也就是ch[0]指向的内存的内容。

或许,字符串与数组的不同就是字符串类型有StringPool吧。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐