这个问题对我来说有点令人困惑,但我会尽力而为。
所以:
ArrayList<Object> fieldList = new ArrayList<Object>();
然后我将许多不同的变量转储到该数组中:
fieldList.add(objectsURL); //string
fieldList.add(X); //int
fieldList.add(Y); //int
...
如果我更改变量,数组中的值就会更改 太确认数组存储了对内存的引用,而不是 然后重视自己。
但是,如果我随后从数组中检索数据然后设置...
Object object = ((String)this.fieldList.get(0));
然后设置对象
object = "meeep!"
objectsURL 未设置为“meep!”而是保留了原来的样子 值(value)。
我认为这是因为“对象”没有引用原始对象 不再是变量,而是指向一个新的不可变字符串 内存中。
我认为所有预期的 Java 行为......但是,我该怎么办 设置实际的原始变量?这在java中可能吗?
所以,换句话说。仅允许访问“fieldList”才可以更改 “objectURL”?
所以,如果:
String objectsURL = "www.google.com"
fieldList.add(objectsURL);
有没有办法仅使用 fieldList 中的引用将objectsURL 设置为“www.stackoverflow.com”? 我不想改变 fieldList 包含“objectsURL”的事实,我想更改变量“objectsURL”实际包含的字符串。
<小时/>如果没有,是否有其他方法可以实现同样的效果?
我希望我的问题能够很好地解释问题。
我的用例正在尝试进行序列化/ 我的一堆对象的反序列化系统。我本来希望把 我可以检索所有字段以进行读取和读取 编写......从而避免必须对长列表进行硬编码 field[0]=blah 和 blah=field[0] 然后经历持续的痛苦 每次我之前添加新字段时都需要重新编号 另一个。
(我无法使用 Java 内置序列化,因为我使用的是 GWT,而且这仅是客户端。)
谢谢
最佳答案
I assume this is because the "object" is not referencing the original variable anymore, that instead its pointing to a new immutable string in the memory.
正确,每次在对象上使用赋值运算符 =
时,都会更改它引用的对象,而不是对象本身。
要更改列表中的值,请使用 .set method of an ArrayList
this.fieldList.set(0, newValue);
由于您的变量是字符串,因此您无法通过列表更改字符串变量
您的替代方案:
使用字符数组
List myList = new ArrayList(); char[] charArray = "My String".toCharArray(); myList.add(charArray); charArray[0] = 'A'; String theString = new String(myList.get(0)); // "Ay String"
如果您使用字符数组,请确保数组的长度足以包含您将来想要的字符数,因为要更改数组的长度,您需要创建一个新的数组数组(数组列表可以动态扩展,数组不能)
将字符串嵌入到您自己的类中(我在这里忽略了 getter 和 setter)
class MyString { public String value; public MyString(String value) { this.value = value; } } MyString myStr = new MyString("some value"); list.add(myStr); ((MyString) list.get(0)).value = "a new value"; System.out.println(myStr.value); // will print "a new value"
关于java - 是否可以更改数组中的变量值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14595100/