是否可以从数组中更改变量值

dar*_*ame 2 java arrays variables gwt immutability

这对我来说是一个令人困惑的问题,但我会尽我所能.

所以:

ArrayList<Object> fieldList = new ArrayList<Object>(); 
Run Code Online (Sandbox Code Playgroud)

然后我将许多不同的变量转储到这个数组:

fieldList.add(objectsURL);   //string 

 fieldList.add(X);  //int 

 fieldList.add(Y); //int 

 ... 
Run Code Online (Sandbox Code Playgroud)

如果我更改了变量,那么数组中的值也会发生变化 - 确认数组存储对内存的引用,而不是自己赋值.

但是,如果我然后从数组中检索数据然后设置...

Object object = ((String)this.fieldList.get(0)); 
Run Code Online (Sandbox Code Playgroud)

然后设置对象

object = "meeep!" 
Run Code Online (Sandbox Code Playgroud)

objectsURL未设置为"meep!" 但它保留了原始价值.

我假设这是因为"对象"不再引用原始变量,而是指向内存中的新不可变字符串.

我认为所有预期的Java行为......但是,我将如何设置实际的原始变量?这可能在java?

所以,换句话说.鉴于只能访问"fieldList",是否可以更改"objectsURL"的值?

因此,如果:

String objectsURL = "www.google.com"
fieldList.add(objectsURL); 
Run Code Online (Sandbox Code Playgroud)

有没有办法只使用fieldList的引用将objectsURL设置为"www.stackoverflow.com"?我不想改变fieldList包含"objectsURL"的事实,我想改变变量"objectsURL"实际包含的字符串.


如果没有,是否有另一种方法来实现同样的目的?

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

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

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

谢谢,

Sim*_*erg 7

我假设这是因为"对象"不再引用原始变量,而是指向内存中的新不可变字符串.

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

若要更改List中的值,请使用ArrayList.set方法

this.fieldList.set(0, newValue);

由于您的变量是String,因此无法通过列表更改String变量

你的选择:

  • 使用char数组

    List myList = new ArrayList();
    char[] charArray = "My String".toCharArray();
    myList.add(charArray);
    charArray[0] = 'A';
    String theString = new String(myList.get(0)); // "Ay String"
    Run Code Online (Sandbox Code Playgroud)

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

  • 将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"
    Run Code Online (Sandbox Code Playgroud)