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

时间:2013-01-30 01:14:45

标签: java arrays gwt variables immutability

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

所以:

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,这只是客户端。)

谢谢,

3 个答案:

答案 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相关。