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

前几天测试的一道题目,想了好久没想明白,今天略有所得。源程序如下:

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吧。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值