1

add(Object)メソッドを使用してJavaVectorにオブジェクトを追加しています。私の例では、最初の5つのオブジェクトは同一であり、その後に最初の5つとは異なる2つのインスタンスが続きます。いくつかの理由で、異なる最初のものを挿入するとすぐに、ベクトル全体がその値に変更されます!

「values」は、「1」、「1」、「1」、「1」、「1」、「2」、「2」などを含むイテレータです。


Vector temp = new Vector();    
while (values.hasNext()) {
     temp.add(values.next());
     System.out.println(temp.toString());
}

次のような出力になります

[1]
[1,1]
[1,1,1]
[1,1,1,1]
[1,1,1,1,1]
[2,2,2,2,2,2]
[2 、2,2,2,2,2,2]

LinkedListを使用し、add(object、index)を使用してみました。同じことが起こりました。

4

2 に答える 2

10

どういうわけか、イテレータから取得している「オブジェクト」は、状態を「1」から「2」に変更している可変オブジェクトの単一インスタンスへの複数の参照であると思われます。私が推測できないのは、この明らかにシングルスレッドの操作で状態がどのように変化しているかです。

より完全なコードを投稿できますか? どこvaluesから来て、どのように初期化されるかを示します。

于 2008-11-07T05:16:36.290 に答える
2

次のプログラムは、Mac OS X でコンパイルおよび実行されました。

import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;

 public class Test{ 

     public static void main( String ... args ){ 
         List list = Arrays.asList(new String[] {"1","1","1","1","1","2","2"});
         Iterator values = list.iterator();
         Vector temp = new Vector();    
         while (values.hasNext()) {
              temp.add(values.next());
              System.out.println(temp.toString());
         }
     } 
 } 

次の結果が得られました。

[1]
[1, 1]
[1, 1, 1]
[1, 1, 1, 1]
[1, 1, 1, 1, 1]
[1, 1, 1, 1, 1, 2]
[1, 1, 1, 1, 1, 2, 2]

そのため、完全な実装、特に Iterator を提供することをお勧めします。そして、私はそれを言わなければなりませんが、Vector を使用するべきではありません!

于 2008-11-07T06:09:18.463 に答える