问题描述
- java中的引用问题??????
-
声明str1变量,在堆内存中开辟一块区域,str2引用str1,即str2和str1指向同一堆内存地址,
现在改变str2值,str1的值为什么不变呢?public class Test3 { public static void main(String[] args) { String str1=new String("aaaaaaaaaaaaaa"); String str2=str1; str2="asdf"; System.out.println(str1); } }
解决方案
str1和str2中存的是同一个内存地址。
当你
str2="asdf"时,str2的内存地址和str1不是同一个了,str2指向asdf的内存地址了。而str1还是指向原来的内存地址。
只是指向变了,原来的对象根本没有改变。
解决方案二:
题主该去看下String类。
String被final修饰是不可改变的,所以当我们创建一个字符串后就不能改变了,当str2 = "abcd";即又创建了一个字符串。如果想实现你所说的那样,试试StringBuffer
解决方案三:
我觉得应该改变才对啊,mark下
解决方案四:
在写bean的时候,当bean中有一个map或list时,自然会给他们一个getter/setter
注意这里调用getter和setter之后,bean中的map或list和参数中的值已经共享一个引用,对其中一个的增删改都会影响到另外一个地方的值
......
答案就在这里:Java中的引用问题
解决方案五:
我去,我知道了,首先str指向堆的一块内存区域,你把str地址赋值给str2,当你改变str的值时,输出str2的值随之改变,但是!!!你改变了str2的值,意思是说又把一个内存地址赋值给了str2,这样子就是str指向原本的,str2指向新的,这样输出str当然是原来的啊!!差点被你代码骗了
解决方案六:
区分下对象引用就ok
解决方案七:
你应该好好理清下JAVA的内存布局,对象和引用得存储位置,相信你就不会问这样的问题了。
时间: 2024-09-21 11:38:53