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]の長いリストをハードコーディングする必要がなくなりました。新しいフィールドを次のフィールドの前に追加するたびに、番号を付け直す必要があるという絶え間ない苦痛。

(私はGWTを使用しており、これはクライアント側のみであるため、Javaの組み込みシリアル化を使用することはできません。)

ありがとう、

4

3 に答える 3

7

これは、「オブジェクト」が元の変数を参照しておらず、代わりにメモリ内の新しい不変の文字列を指しているためだと思います。

正解です。オブジェクトで代入演算子を使用するたびに、オブジェクト自体ではなく、参照する=オブジェクトを変更します。

リストの値を変更するには、ArrayListの.setメソッドを使用します

this.fieldList.set(0, newValue);

変数は文字列であるため、リストから文字列変数を変更する方法はありません。

あなたの選択肢:

  • 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を使用する場合は、配列の長さが新しい配列(array)を作成する必要があるため、配列の長さが将来必要な文字数を含むのに十分であることを確認してください。リストは動的に展開できますが、配列は展開できません)

  • 独自のクラス内に文字列を埋め込みます(ここではゲッターとセッターを無視しました)

    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

StringStrings は不変であるため、オブジェクトの内容を変更することはできません。また、リストを使用して、参照変数がobjectsURL指すオブジェクトを変更することはできません。String目的を達成するには、メンバーを持つカスタム クラスを作成する必要があります。次に、このクラスのインスタンスを に格納し、リスト内の参照を介して参照をList変更できます。String変更は、リスト内のオブジェクトを参照する他の参照変数に反映されます。

于 2013-01-31T00:35:50.490 に答える
0

まず、変数'object'を宣言し、ArrayListからオブジェクトを割り当てます。後で、他のオブジェクトを「meeep!」に割り当てます。この変数に。'object'変数がArrayListに関連している理由はありません。

于 2013-01-30T01:22:54.900 に答える