LinkedHashSetの Java ドキュメントには、次のように記載されています。
要素がセットに再挿入されても、挿入順序は影響を受けないことに注意してください。(呼び出しの直前に s.contains(e) が true を返すときに s.add(e) が呼び出されると、要素 e はセット s に再挿入されます。)
最近のプロジェクトでは、リスト ビュー ウィジェットでユーザーに表示するために、クライアント サーバー通信で一連のデータ トークンを保持するために 1 つを使用することにしました。更新されたデータで要素を安価に再挿入でき、順序が変わらないため、ユーザーは驚かないという考えです。
この短いテスト プログラムが示すように、明らかにそうではありません。Oracle JRE 1.7.0_55-b13 を使用すると、他のSetと同じように動作します。
import java.util.LinkedHashSet;
import static java.util.Arrays.deepToString;
public class LhsStack
{
public static class T
{
public T ( int id ) { this.id = id; }
public final Integer id;
public String value;
@Override
public int hashCode () { return id.hashCode (); }
@Override
public boolean equals ( Object obj )
{
return obj instanceof T && id.equals ( ((T)obj).id );
}
@Override
public String toString () { return id + " => " + value; }
}
public static void main ( String [] args )
{
LinkedHashSet < T > set = new LinkedHashSet <> ();
T a = new T ( 1 ),
b = new T ( 1 ),
c = new T ( 2 ),
d = new T ( 3 );
a.value = "Hello, World";
b.value = "World, Hello";
c.value = "Foo";
d.value = "Bar";
System.out.println ( "a == b: " + a.equals ( b ) );
if ( set.add ( a ) ) {
System.out.println ( "Inserted: " + a.value );
}
System.out.println ( "set.contains ( a ): " + set.contains ( a ) );
System.out.println ( "set.contains ( b ): " + set.contains ( b ) );
set.add ( c ); set.add ( d );
System.out.println ( "Elements: " + set.size () );
System.out.println ( deepToString ( set.toArray () ) );
if ( set.add ( b ) ) {
System.out.println ( "Re-Inserted: " + b.value );
}
else
{
System.out.println ( "Removing and Adding: " + b.value );
set.remove ( b );
set.add ( b );
}
System.out.println ( "Elements: " + set.size () );
System.out.println ( deepToString ( set.toArray () ) );
}
}
出力
a == b: true
Inserted: Hello, World
set.contains ( a ): true
set.contains ( b ): true
Elements: 3
[1 => Hello, World, 2 => Foo, 3 => Bar]
Removing and Adding: World, Hello
Elements: 3
[2 => Foo, 3 => Bar, 1 => World, Hello]
したがって、私の質問は、要素bがセットに再挿入されない (つまり、値を更新するために削除してから再度追加する必要がある) ため、Java ドキュメントのコメントの意味は何ですか?
ありがとうございました!