关于字符串、数组和参数传递的一道题
2013-08-31 11:34
246 查看
前几天测试的一道题目,想了好久没想明白,今天略有所得。源程序如下:
输入结果是什么?当时我就想啊,字符串和数组都是引用数据类型,变量存放的都是内存地址,既然地址指向的内存重新赋值,那么内存里的内容能不改变嘛!果断写:test ok and gbc。结果显而易见,额见红了,为什么会这样子呢?
在查资料的时候看到这样一句话:当程序运行String str=new String("good")时,会首先查找StringPool中是否存在字符串good,若不存在,则创建,而后在堆内存中创建字符串对象;否则就直接在堆内存中创建字符串对象。是不是这样子呢?代码验证一下:
输出结果为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吧。
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吧。
相关文章推荐
- 关于结构体里面的字符串指针输出出现乱码的问题与结构体数组作为参数传值的问题
- 关于指针和数组对申请内存malloc和作为参数传递的一些问题
- c#与matlab混合编程中 关于字符串和字符串数组的传递
- 关于arrylist的一些操作(包含利用params传递数组参数)
- 关于传递参数时,涉及数组的length = sizeof(a)/sizeof(int)还是为length = sizeof(a)的总结
- 看结果,测试?java中的String类 字符串拆分成字符串数组 判定邮箱地址 字符串比较 参数传递?
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- SQLServer-存储过程中使用字符串和分隔符实现传递数组参数(转)
- 关于对MYSQL存储过程传递参数是纯数字还是字符串的判断
- c++中关于数组作为函数参数并传递数组元素个数的几种有效方法的讨论
- SQLServer-存储过程中使用字符串和分隔符实现传递数组参数
- 关于DCOM传递字符串数组!!
- 黑马程序员---------C语言 关于数组被当作函数参数传递的问题
- 关于字符串参数传递的小技巧
- 关于数组参数的传递及其引用的传递
- C++学习笔记(四)——关于数组作为函数参数的值传递和引用传递
- 关于url提交请求时传递数组参数的用法
- c语言 关于数组名作参数传递问题
- 微信小程序传递参数(字符串、数组、对象)
- 关于对MYSQL存储过程传递参数是纯数字还是字符串的判断