这对我来说是一个令人困惑的问题,但我会尽我所能。
所以:
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!”但它保留了它的原始 值。
我认为这是因为“对象”没有引用原始对象 变量,而不是它指向一个新的不可变字符串 在记忆中。
我认为所有预期的Java行为......但是接下来,我将如何进行 设置实际的原始变量?这可能在java?
换句话说,所以,换句话说。只有访问“fieldList”才有可能改变其值 “objectsURL”?所以,如果:
String objectsURL = "www.google.com"
fieldList.add(objectsURL);
有没有办法只使用fieldList的引用将objectsURL设置为“www.stackoverflow.com”? 我不想改变fieldList包含“objectsURL”的事实,我想改变变量“objectsURL”实际包含的字符串。
如果没有,是否有另一种方法可以实现同样的目的?
我希望我的问题能很好地解释这个问题。
我的用例是尝试进行序列化/ 我的一堆对象的反序列化系统。我本来希望 所有的领域都变成了一个arraylist我可以检索阅读和 写....因此避免必须硬编码长列表 field [0] = blah and blah = field [0]然后经常不断的痛苦 每次我添加新字段之前需要重新编号 另一个。
(我不能使用Javas内置序列化,因为我使用的是GWT,这只是客户端。)
谢谢,
答案 0 :(得分:7)
我认为这是因为“对象”不再引用原始变量,而是指向内存中新的不可变字符串。
正确,每次在对象上使用赋值运算符=
时,都会更改它引用的对象,而不是对象本身。
要更改列表中的值,请使用.set method of an ArrayList
this.fieldList.set(0, newValue);
由于您的变量是String,因此无法通过列表更改String变量
您的替代方案:
使用char-array
List myList = new ArrayList();
char[] charArray = "My String".toCharArray();
myList.add(charArray);
charArray[0] = 'A';
String theString = new String(myList.get(0)); // "Ay String"
如果使用char数组,请确保数组的长度足以包含将来要包含的字符数,因为要更改创建新数组所需的数组长度array(数组列表可以动态扩展,数组不能)
将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"
答案 1 :(得分:1)
String
是不可变的,因此无法更改String
对象的内容。此外,您无法使用列表更改引用变量objectsURL
指向的对象。要实现您的目标,您需要创建一个具有String
成员的自定义类。然后,您可以在List
中存储此类的实例,并通过列表中的引用更改String
引用。然后,更改将反映在引用列表中对象的任何其他引用变量中。
答案 2 :(得分:0)
首先,声明一个变量'object'并从ArrayList中分配一些Object。稍后你分配一些其他对象“meeep!”到这个变量。您的'object'变量没有理由与ArrayList相关。