Share via


Hashtable クラス

キーのハッシュ コードに基づいて編成された、キーと値の組み合わせのコレクションを表します。

この型のすべてのメンバの一覧については、Hashtable メンバ を参照してください。

System.Object
   System.Collections.Hashtable
      System.Data.PropertyCollection

<Serializable>
Public Class Hashtable   Implements IDictionary, ICollection, IEnumerable, ISerializable, _   _   IDeserializationCallback, ICloneable
[C#]
[Serializable]
public class Hashtable : IDictionary, ICollection, IEnumerable,   ISerializable, IDeserializationCallback, ICloneable
[C++]
[Serializable]
public __gc class Hashtable : public IDictionary, ICollection,   IEnumerable, ISerializable, IDeserializationCallback, ICloneable
[JScript]
public
   Serializable
class Hashtable implements IDictionary, ICollection,   IEnumerable, ISerializable, IDeserializationCallback, ICloneable

スレッドセーフ

1 つ以上の書き込み操作をサポートするには、 Hashtable のすべての操作が Synchronized メソッドから返されるラッパー経由で実行される必要があります。

コレクションの列挙処理は、本質的にはスレッド セーフな処理ではありません。コレクションが同期されている場合でも、他のスレッドがそのコレクションを変更する可能性はあり、そのような状況が発生すると列挙子は例外をスローします。列挙処理を確実にスレッド セーフに行うには、列挙中にコレクションをロックするか、他のスレッドによって行われた変更によってスローされる例外をキャッチします。

解説

各要素は、 DictionaryEntry オブジェクトに格納されているキーと値の組み合わせです。キーには null 参照 (Visual Basic では Nothing) は使用できませんが、値は null でもかまいません。

Hashtable でキーとして使用されるオブジェクトは、 Object.GetHashCode メソッドおよび Object.Equals メソッドを実装または継承している必要があります。キーが等値で単純に参照が等値である場合は、これらのメソッドを継承して実装するだけで十分です。また、これらのメソッドは、キーが Hashtable に存在している間に同じパラメータを指定して呼び出された場合は、同じ結果を生成する必要があります。キー オブジェクトは、 Hashtable でキーとして使用されている間は不変であることが必要です。

Hashtable に要素が追加されると、その要素はキーのハッシュ コードに基づいてバケットに配置されます。それ以後にキーを検索する際には、そのキーのハッシュ コードを使用して、1 つのバケットだけを検索します。これにより、要素を見つけるために必要となるキーの比較回数を減らすことができます。

Hashtable のテーブル占有率は、バケット数に対する要素数の最大比率を決定します。テーブル占有率を小さくすると、検索時間は平均的に短くなりますが、メモリの消費量は増加します。既定のテーブル占有率は 1.0 です。通常、この値は、検索速度とサイズの最適なバランスを実現します。 Hashtable を作成するときに、既定値とは異なるテーブル占有率を指定することもできます。

Hashtable に要素が追加されると、 Hashtable の実際のテーブル占有率は大きくなります。実際のテーブル占有率が所定の占有率に達すると、 Hashtable のバケット数は、現在の Hashtable のバケット数の 2 倍より大きい範囲で最小の素数になるように、自動的に増やされます。

Hashtable の各キー オブジェクトは、 GetHash を呼び出すことによってアクセスできる独自のハッシュ関数を用意する必要があります。ただし、 IHashCodeProvider を実装するオブジェクトは Hashtable コンストラクタに渡すことができ、そのハッシュ関数はテーブル内のすべてのオブジェクトに対して使用できます。

[Visual Basic, C#] C# 言語の foreach ステートメント (Visual Basic では for each) は、コレクション内の各要素の型を必要とします。 Hashtable の各要素はキーと値の組み合わせであるため、要素の型は、キーの型や値の型にすることはできません。その代わり、要素の型は DictionaryEntry になります。例:

 
foreach (DictionaryEntry myDE in myHashtable) {...}
[Visual Basic] 
Dim myDE As DictionaryEntry
For Each myDE In myHashtable
   ...
Next myDE

[Visual Basic, C#] foreach ステートメントは、列挙子のラッパーです。これは、コレクションからの読み取りだけを許可し、コレクションへの書き込みを防ぎます。

使用例

Hashtable を作成および初期化する方法と、そのキーと値を出力する方法の例を次に示します。

 
Imports System
Imports System.Collections
Imports Microsoft.VisualBasic

Public Class SamplesHashtable    
    
    Public Shared Sub Main()
        
        ' Creates and initializes a new Hashtable.
        Dim myHT As New Hashtable()
        myHT.Add("First", "Hello")
        myHT.Add("Second", "World")
        myHT.Add("Third", "!")
        
        ' Displays the properties and values of the Hashtable.
        Console.WriteLine("myHT")
        Console.WriteLine("  Count:    {0}", myHT.Count)
        Console.WriteLine("  Keys and Values:")
        PrintKeysAndValues(myHT)
    End Sub
    
    Public Shared Sub PrintKeysAndValues(myList As Hashtable)
        Dim myEnumerator As IDictionaryEnumerator = myList.GetEnumerator()
        Console.WriteLine(ControlChars.Tab + "-KEY-" + ControlChars.Tab _
           + "-VALUE-")
        While myEnumerator.MoveNext()
            Console.WriteLine(ControlChars.Tab + "{0}:" + ControlChars.Tab _
               + "{1}", myEnumerator.Key, myEnumerator.Value)
        End While
        Console.WriteLine()
    End Sub
End Class

' This code produces the following output.
' 
' myHT
'   Count:    3
'   Keys and Values:
'     -KEY-    -VALUE-
'     Third:    !
'     Second:    World
'     First:    Hello 

[C#] 
using System;
using System.Collections;
public class SamplesHashtable  {

   public static void Main()  {

      // Creates and initializes a new Hashtable.
      Hashtable myHT = new Hashtable();
      myHT.Add("First", "Hello");
      myHT.Add("Second", "World");
      myHT.Add("Third", "!");

      // Displays the properties and values of the Hashtable.
      Console.WriteLine( "myHT" );
      Console.WriteLine( "  Count:    {0}", myHT.Count );
      Console.WriteLine( "  Keys and Values:" );
      PrintKeysAndValues( myHT );
   }


   public static void PrintKeysAndValues( Hashtable myList )  {
      IDictionaryEnumerator myEnumerator = myList.GetEnumerator();
      Console.WriteLine( "\t-KEY-\t-VALUE-" );
      while ( myEnumerator.MoveNext() )
         Console.WriteLine("\t{0}:\t{1}", myEnumerator.Key, myEnumerator.Value);
      Console.WriteLine();
   }
}
/* 
This code produces the following output.

myHT
  Count:    3
  Keys and Values:
    -KEY-    -VALUE-
    Third:    !
    Second:    World
    First:    Hello
*/ 

[C++] 
#using <mscorlib.dll>
#using <system.dll>

using namespace System;
using namespace System::Collections;

public __gc class SamplesHashtable  {

public:
    static void PrintKeysAndValues(Hashtable __gc *myList ) {
        IDictionaryEnumerator __gc *myEnumerator = myList->GetEnumerator();
        Console::WriteLine(S"\t-KEY-\t-VALUE-");
        while (myEnumerator->MoveNext())
            Console::WriteLine(S"\t{0}:\t{1}", myEnumerator->Key, myEnumerator->Value);
        Console::WriteLine();
    };
};

int main()  {

    // Creates and initializes a new Hashtable.
    Hashtable __gc *myHT = new Hashtable();
    myHT->Add(S"First", S"Hello");
    myHT->Add(S"Second", S"World");
    myHT->Add(S"Third", S"!");

    // Displays the properties and values of the Hashtable.
    Console::WriteLine(S"myHT");
    Console::WriteLine(S"  Count:    {0}", __box(myHT->Count));
    Console::WriteLine(S"  Keys and Values:");
    SamplesHashtable::PrintKeysAndValues(myHT);
}
/* 
This code produces the following output.

myHT
Count:    3
Keys and Values:
-KEY-    -VALUE-
Third:    !
Second:    World
First:    Hello
*/ 

[JScript] 
import System
import System.Collections

// Creates and initializes a new Hashtable.
var myHT : Hashtable = new Hashtable()
myHT.Add("First", "Hello")
myHT.Add("Second", "World")
myHT.Add("Third", "!")

// Displays the properties and values of the Hashtable.
Console.WriteLine("myHT")
Console.WriteLine("  Count:    {0}", myHT.Count)
Console.WriteLine("  Keys and Values:")
PrintKeysAndValues(myHT)
    
function PrintKeysAndValues(myList : Hashtable){
    var myEnumerator : IDictionaryEnumerator = myList.GetEnumerator()
    Console.WriteLine("\t-KEY-\t-VALUE-")
    while(myEnumerator.MoveNext())
        Console.WriteLine("\t{0}:\t{1}", myEnumerator.Key, myEnumerator.Value)
    Console.WriteLine()
}

// This code produces the following output.
// 
// myHT
//   Count:    3
//   Keys and Values:
//     -KEY-    -VALUE-
//     Third:    !
//     Second:   World
//     First:    Hello 

必要条件

名前空間: System.Collections

プラットフォーム: Windows 98, Windows NT 4.0, Windows Millennium Edition, Windows 2000, Windows XP Home Edition, Windows XP Professional, Windows Server 2003 ファミリ, .NET Compact Framework - Windows CE .NET

アセンブリ: Mscorlib (Mscorlib.dll 内)

参照

Hashtable メンバ | System.Collections 名前空間 | IDictionary | IHashCodeProvider | Object.GetHashCode | Object.Equals | DictionaryEntry