2

LinkedHashSet は、挿入時に要素の重複を許可しないことを理解しています。しかし、Hashset が Hava でどのように機能するのかわかりませんか? Hashset で Hashtable が使用されていることを少し知っているので、ハッシュテーブルは要素を格納するために使用され、ここでも要素の重複は許可されません。次に、ツリーセットもハッシュセットに似ており、重複するエントリを許可しないため、一意の要素が表示され、昇順に従います。

HashMap に関してもう 1 つ疑問があります。Hashmap は順序を維持しません。1 つの null キーと複数の null 値を持つ場合があります。私はこれを理解していませんが、実際にはどういう意味ですか? これの実用的な例はありますか?

私は少し知っています、ハッシュマップはこれに基づいて機能していました-バケットに入れるために使用されるキーと値もバケットに一意の番号を持っています。そのため、バケットからキーと値を識別して取得できます。キーと値のペアを、キーのハッシュコードである識別子のバケットに入れると。

例: キーのハッシュ コードは 101 であるため、バケット 101 に格納されます。1 つのバケットには、複数のキーと値のペアを格納できます。Object1 が「A」、object2 が「A」、object3 が「B」の場合、同じハッシュ コードを持っているとします。そのため、同じハッシュコードを同じバケットに共有することで、さまざまなオブジェクトを格納します。私の疑問は、同じハッシュコードを持つオブジェクトは等しくなければならず、異なるオブジェクトは異なるハッシュコードを持つべきですか?

これは HashSet を使用したプログラムです。

    import java.util.*;
    public class Simple{
    public static void main(String[] args){
    HashSet hh=new HashSet();
    hh.add("D");
    hh.add("A");
    hh.add("B");
    hh.add("C");
    hh.add("a");        
    System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
    System.out.println(i.next());
    }      
    }
    }

出力は、

Checking the size is:5
[D, A, B, a, C]
D
A
B
a
C

私の疑問は、なぜ「a」が「B」と「C」の間に挿入されているのかということです。

今、私は LinkedHashSet を使用しているので、

public class Simple{
public static void main(String[] args){
    LinkedHashSet hh=new LinkedHashSet();
            hh.add("D");
            hh.add("A");
    hh.add("B");
    hh.add("C");
            hh.add("a");  

        System.out.println("Checking the size is:"+hh.size()+"");
    System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

挿入順序に従い、要素の重複を回避することを理解しています。したがって、出力は、

Checking the size is:5
[D, A, B, C, a]
D
A
B
C
a

さて、ツリーセットを使用して:

import java.util.*;
public class Simple{
public static void main(String[] args){
    TreeSet hh=new TreeSet();
            hh.add("1");
            hh.add("5");
            hh.add("3");
            hh.add("5");
            hh.add("2");
            hh.add("7");  

System.out.println("Checking the size is:"+hh.size()+"");
System.out.println(hh);

    Iterator i=hh.iterator();
    while(i.hasNext()){
        System.out.println(i.next());
    }      
}
}

ここで、私は次のことを理解しています - Treeset は昇順に従います。

The output is,
Checking the size is:5
[1, 2, 3, 5, 7]
1
2
3
5
7

それから私の疑問は、Hashset が Java でどのように機能するかということです。そして、LinkedHashset が二重にリンクされたリストに従うことを知っています。二重連結リストを使用する場合、要素をどのように格納しますか? 二重にリンクされたリストとはどういう意味で、どのように機能しますか? それでは、これら 3 つの Hashset、Treeset、LinkedHashset はすべて Java で使用され、Java でのパフォーマンスが優れているのはどれでしょうか?

4

4 に答える 4

3

私の疑問は、なぜ「a」が「B」と「C」の間に挿入されているのかということです。

TreeSet はエントリを並べ替えます。

LinkedHashSet は挿入順序を保持します。

HashSet は挿入の順序を保持せず、エントリをソート/順序付けしません。つまり、セットを反復処理すると、エントリは理解するのが難しい順序で返されます...そして実際には意味がありません。"a"その時点で挿入される「理由」は特にありません。入力キーのセットとそれらが挿入された順序を考えると、それがまさにその結果でした。

私の唯一の疑問は、Hashset が Java でどのように機能するかということです。

ハッシュテーブルが実装されています。一般的な概要については、ハッシュ テーブルに関するウィキペディアのページを参照してください。詳細については、 と のソース コードをjava.util.HashMap参照java.util.HashSetしてください。

簡単に言えばHashSet、 とHashMapは両方とも、ハッシュ チェーンの配列として実装されたハッシュ テーブルです。

そして、LinkedHashset が二重にリンクされたリストに従うことを知っています。二重連結リストを使用する場合、要素をどのように格納しますか?

LinkedHashSet基本的には、挿入順序を記録する追加のリンク リストを持つハッシュ テーブルです。要素はメインのハッシュ テーブルに格納されます。これにより、高速な検索が可能になります。繰り返しますが、詳細についてはソース コードを参照してください。

二重にリンクされたリストとはどういう意味で、どのように機能しますか?

Wikipedia の双方向リンク リストに関する記事を読んでください。


次に、これら 3 つの Hashset、Treeset、Linkedhashset がすべて Java で使用される場所と、Java でのパフォーマンスが優れているのはどれですか?

これら 3 つのクラス (およびその他のクラス) を選択する際には、考慮すべきことがいくつかあります。

  • 必要な機能を提供しているか。たとえば、反復の順序に関して、それらが異なる動作をすることは既に見てきました。

  • 必要な同時実行プロパティがありますか? たとえば、それらはスレッドセーフですか? 彼らは競合に対処していますか?それらは同時変更を許可しますか?

  • どのくらいのスペースが必要ですか?

  • パフォーマンス (時間) 特性は何ですか。

最後の2点について?

  • ATreeSetが使用するスペースが最も少なく、 ALinkedHashSetが最も多く使用します。

  • HashSet大きなセットのルックアップ、挿入、および削除では、a が最も速くなる傾向があり、aはTreeSet最も遅くなる傾向があります。

于 2013-11-26T13:00:33.903 に答える
1

私は簡潔になります。

セットは、セットの数学理論に従います。Set (AbstractSet は Java のスーパータイプです) は、同じ要素を 2 回持つことができない点を除いて、リストに似ています。

HashSet は HashMap で実装し、TreeSet は Tree で実装し、LinkedHashset は二重リンク リストで実装します。

于 2013-11-26T12:46:59.220 に答える
0
  • HashSet は要素の順序を保持しないため、その順序を特定できません。
  • LinkedHashSet は、要素がセットに追加されるときに順序を保持します。挿入すると、順序が維持されます。

  • TreeSet は要素の順序を維持します。TreeSet は、要素の追加または削除のたびに要素を配置するため、最も低速です。

    それ以外の場合は、順序付きリスト、スレッドセーフなどが必要かどうかにかかわらず、すべてが要件に応じて返されます。

于 2015-08-10T06:28:29.343 に答える