2

这对我来说是一个有点令人困惑的问题,但我会尽力而为。

所以:

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”实际包含的字符串。


如果没有,是否有替代方法来实现相同的目标?

我希望我的问题能很好地解释这个问题。

我的用例是尝试为我的一堆对象创建一个序列化/反序列化系统。我希望将所有字段放入一个数组列表中,我可以检索以进行读取和写入....从而避免对 field[0]=blah 和 blah=field[0] 的长列表进行硬编码,然后继续每次我在另一个之前添加一个新字段时都需要重新编号。

(我不能使用 Java 的内置序列化,因为我使用的是 GWT,这只是客户端。)

谢谢,

4

3 回答 3

7

我认为这是因为“对象”不再引用原始变量,而是指向内存中新的不可变字符串。

正确,每次=在对象上使用赋值运算符时,都会更改它所引用的对象,而不是对象本身

要更改列表中的值,请使用ArrayList 的 .set 方法

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"

如果使用 char 数组,请确保数组的长度足以包含您将来想要拥有的字符数,因为要更改数组的长度,您需要创建一个新数组(数组列表可以动态扩展,数组不能)

  • 将字符串嵌入到您自己的类中(我在这里忽略了 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"
于 2013-01-30T01:19:04.203 回答
1

Strings 是不可变的,因此不可能更改String对象的内容。此外,您不能使用列表来更改引用变量objectsURL指向的对象。要实现您想要的,您需要创建一个具有String成员的自定义类。然后,您可以将此类的实例存储在 a 中,并通过列表中的引用将引用List更改为。String然后,这些更改将反映在引用列表中对象的任何其他引用变量中。

于 2013-01-31T00:35:50.490 回答
0

首先,您声明一个变量“对象”并从 ArrayList 中分配一些对象。稍后您分配一些其他对象“meeep!” 到这个变量。您的“对象”变量没有理由与 ArrayList 相关。

于 2013-01-30T01:22:54.900 回答