hashset java tutorial with programming examples
このチュートリアルでは、JavaでのHashSetとは何か、HashSetメソッド、プログラミング例を使用して、HashSetを実装および反復する方法、およびその他の関連概念について説明します。
HashSetは、オブジェクトを格納するコレクションです。 JavaのHashSetは、java.utilパッケージの「HashSet」クラスを使用して実装されます。
このクラスは、setインターフェイスを実装します。ストレージ用のHashMapインスタンスであるHashTableを使用します。
学習内容:
Java HashSet
HashSetの特徴のいくつかを以下に示します。
- 内部構造としてHashTableを持つSetインターフェースを実装します。次に、HashTableはHashMapインスタンスです。
- 要素の順序は保持されません。要素はランダムな順序で保存されます。
- HashSetは重複する値を許可しません。
- Setインターフェイスとは別に、CloneableおよびSerializableインターフェイスを実装します。
- HashSetにはnull値を含めることができます。
HashSetクラス階層
HashSetクラスの階層を以下に示します。
上の図に示すように、HashSetクラスはAbstractSetクラスを拡張し、AbstractSetクラスはSetインターフェイスを実装します。 setインターフェースは、Iterableインターフェースを拡張するCollectionインターフェースを継承します。
Java8リリースでは新しいメソッドが導入されました 「Spliterator」 HashSetで、HashSetの要素に対して遅延バインディングを実行するフェイルファストスプリッターを作成します。
HashSetクラスの一般的な宣言は次のとおりです。
パブリッククラスHashSetはAbstractSetを拡張し、Setを実装します。
クローン可能、シリアル化可能
HashSetをインポートする
以下に示すように、importステートメントを使用して、HashSet機能をプログラムに含めることができます。
import java.util.HashSet;
または
java.utilをインポートします。*;
JavaでHashSetを宣言する
以下に示すように、JavaでHashSetオブジェクトを作成できます。
HashSet h = new HashSet();
HashSetクラスは、オブジェクトを作成するために次のコンストラクターを提供します。
コンストラクターのプロトタイプ | 説明 | |
---|---|---|
削除する | ブール値remove(Object o) | 指定された要素oがHashSetの一部である場合、HashSetから削除します。 |
HashSet() | HashSetのデフォルトコンストラクタ | |
HashSet(int容量) | 指定された「容量」でHashSetオブジェクトを構築します。 | |
HashSet(int容量、float loadFactor) | 指定された「capacity」と「loadFactor」を使用してHashSetオブジェクトを構築します。 | |
HashSet(コレクションc) | 指定されたコレクションからHashSetオブジェクトを作成します。 |
上記の表に示されているように、このクラスは、デフォルトのコンストラクターとは別に、容量と負荷係数、および別のコレクションを引数として取るコンストラクターも提供します。これらのコンストラクターのいずれかを使用して、このクラスのオブジェクトを作成できます。
HashSetを初期化します
次のJavaコードは、HashSetクラスオブジェクトの宣言と初期化を示しています。このプログラムでは、ArrayListからHashSetクラスオブジェクトを作成します。最初に、ArrayListを作成して初期化し、次にこのArrayListを使用してHashSetオブジェクトを作成して初期化します。
import java.util.*; class Main{ public static void main(String args()){ //declare and initialize ArrayList ArrayList<String> myList=new ArrayList<String>(); myList.add('Red'); myList.add('Green'); myList.add('Blue'); //Create a HashSet and provide ArrayList in its constructor HashSet<String> mySet=new HashSet(myList); mySet.add('Yellow'); //print the HashSet System.out.println('The HashSet contents:'); Iterator<String> i=mySet.iterator(); while(i.hasNext()) { System.out.print(i.next() + ' '); } } }
出力:
HashSetはJavaの内部でどのように機能しますか?
内部的には、HashTableを使用して実装されます。 HashTableはHashMapのインスタンスです。ただし、HashMapはキーと値のペアのコレクションです。では、HashSetをHashMapに格納するにはどうすればよいでしょうか。
HashSetのオブジェクト値は、HashMapのキーです。
JavaHashSetの例
JavaでのHashSetの詳細な例を見てみましょう。
import java.util.*; class Main{ public static void main(String args()){ //Create a HashSet and add elements to it HashSet<String> mySet=new HashSet<String>(); mySet.add('Blue'); mySet.add('Green'); mySet.add('Blue'); mySet.add('Green'); mySet.add('Red'); mySet.add('Brown'); mySet.add('Yellow'); //Iterate through the HashSet and print its elements System.out.println('HashSet contents:'); Iterator<String> itr=mySet.iterator(); while(itr.hasNext()){ System.out.print(itr.next() + ' '); } } }
出力:
ここでは、デフォルトのコンストラクターを使用してHashSetオブジェクトを作成します。次に、addメソッドを使用して、要素(色)をHashSetに追加します。次に、イテレータを使用してHashSetをトラバースし、コンテンツを出力します。
HashSetイテレータ
Javaでは、HashSetは、以下で説明する2つの方法でトラバースまたは反復できます。
イテレータを使用せずに
ここでは、HashSetでイテレータを定義していません。代わりに、forEachループを使用します。次のプログラムは、forEachループを使用したHashSetのトラバーサルを示しています。
import java.util.HashSet; import java.util.Set; class Main{ public static void main(String() args) { // Create a HashSet Set<String> cities_HashSet = new HashSet<String>(); //Initialize HashSet with elements cities_HashSet.add('Mumbai'); cities_HashSet.add('Delhi'); cities_HashSet.add('Pune'); cities_HashSet.add('Chennai'); cities_HashSet.add('Bangaluru'); //use foreach loop to iterate through the HashSet System.out.println('HashSet contents:'); for (String city : cities_HashSet) { System.out.print(city + ' '); } } }
出力:
イテレータの使用
反復の次のアプローチは、イテレーターを使用することです。ここでは、HashSetクラスのイテレーターを定義し、それをトラバースします。
次のプログラムは、このアプローチを示しています。
import java.util.HashSet; import java.util.Set; import java.util.Iterator; class Main{ public static void main(String() args) { // Create a HashSet Set<String> cities_HashSet = new HashSet<String>(); //Initialize HashSet with elements cities_HashSet.add('Mumbai'); cities_HashSet.add('Delhi'); cities_HashSet.add('Pune'); cities_HashSet.add('Chennai'); cities_HashSet.add('Bangaluru'); //use iterator to iterate through the HashSet System.out.println('HashSet contents using Iterator:'); Iterator<String> iter = cities_HashSet.iterator(); while(iter.hasNext()){ System.out.print(iter.next() + ' '); } } }
出力:
HashSetメソッド/ API
次の表は、HashSetクラスによって提供されるメソッドを示しています。各メソッドのプロトタイプと説明を提供しました。ご覧のとおり、追加、削除、サイズ変更などの基本的な操作のメソッドと、内容、空、イテレーター、スプリッターなどをチェックする他のメソッドがあります。
方法 | メソッドプロトタイプ | 説明 |
---|---|---|
追加 | ブールadd(E e) | 指定された要素eがまだ存在しない場合は、HashSetに追加します。 |
晴れ | ボイドクリア() | HashSetからすべての要素をクリアまたは削除します |
クローン | オブジェクトclone() | これは、このHashSetインスタンスの浅いコピーを返すために使用されます。要素自体は複製されません。 |
含まれています | ブールcontains(Object o) | HashSetに指定されたオブジェクトoが含まれているかどうかを確認し、含まれている場合はtrueを返します。 |
isEmpty | ブールisEmpty() | HashSetが空かどうかを確認します。はいの場合はtrueを返します。 |
イテレータ | イテレータiterator() | HashSetをトラバースするために使用されるイテレータを返します。 |
サイズ | Int size() | HashSetに存在する要素のサイズまたは数を返します。 |
スプリッター | スプリッタースプリッター() | HashSetをトラバースするために、フェイルファストで遅延バインディングのスプリッターを返します。 このメソッドはJava8で導入されました。 |
HashSetクラスによって提供されるメソッドについて説明したので、次に、クラスの主要なメソッドを示す例を実装しましょう。
以下のJavaプログラムは、このクラスのメソッドを示しています。
import java.util.*; class Main{ public static void main(String args()){ //create a HashSet and initialize it HashSet<String> colors_set=new HashSet<String>(); colors_set.add('Red'); colors_set.add('Green'); colors_set.add('Blue'); colors_set.add('Cyan'); System.out.println('Initial HashSet: '+colors_set); //remove() method => remove specified element colors_set.remove('Red'); System.out.println('
HashSet after remove(Red): '+colors_set); //declare and initialize another list HashSet<String> colors_hash=new HashSet<String>(); colors_hash.add('Yellow'); colors_hash.add('Magenta'); //addAll() method => add another HashSet to existing colors_set.addAll(colors_hash); System.out.println('
HashSet after add(colors_hash): '+colors_set); //removeAll() method => remove all elements specified in the argument colors_set.removeAll(colors_hash); System.out.println('
HashSet after removeAll(colors_hash) method: '+colors_set); //removeIf() => remove if given condition is fulfilled colors_set.removeIf(str->str.contains('Green')); System.out.println('
HashSet after removeIf(contains(Green)) method: '+colors_set); //clear() => delete all elements from the HashSet colors_set.clear(); System.out.println('
HashSet after clear() method: '+colors_set); } }
出力:
HashSetを配列に変換する
HashSetのtoArray()メソッドを使用して、指定されたHashSetを配列に変換できます。配列のデータ型とサイズはHashSetのものと一致する必要があることに注意してください。
次のJavaプログラムは、この変換を示しています。
import java.util.HashSet; class Main{ public static void main(String() args) { // Create a HashSet & inintialize it HashSet<String> num_HashSet = new HashSet<String>(); num_HashSet.add('One'); num_HashSet.add('Two'); num_HashSet.add('Three'); num_HashSet.add('Four'); // Print HashSet contents System.out.println('HashSet contents: '+ num_HashSet); // Declare an array with size = HashSet size String() numArray = new String(num_HashSet.size()); //use toArray method to convert HashSet to an array num_HashSet.toArray(numArray); // Print Array System.out.println('Array from HashSet: '); for(String val : numArray){ System.out.print(val + ' '); } } }
出力:
HashSetを並べ替える
JavaでHashSetをソートできます。 HashSet要素は、要素の順序を維持しないため、元々ソートされていません。 JavaでHashSetをソートするには、2つのアプローチに従うことができます。
Collections.sort()メソッドの使用
このアプローチでは、HashSetをリストに変換します。次に、Collections.sort()メソッドを使用してリストを並べ替えます。次に、このリストが印刷されます。
import java.util.*; public class Main { public static void main(String args()) { // Create a HashSet & initialize it HashSet<String> cities_HashSet = new HashSet<String>(); cities_HashSet.add('Pune'); cities_HashSet.add('Mumbai'); cities_HashSet.add('Bangaluru'); cities_HashSet.add('Hyderabad'); System.out.println('Original HashSet: ' + cities_HashSet); // Convert HashSet to ArrayList List<String> cities_list = new ArrayList<String>(cities_HashSet); // Use Collections.sort () method to sort the list Collections.sort(cities_list); // Print the Sorted ArrayList (HashSet) System.out.println('Sorted HashSet:'+ cities_list); } }
出力:
スクラムチームが提供するビジネス価値に責任を持つのは誰か
HashSetをTreeSetに変換する
このアプローチを使用して、HashSetをTreeSetに変換します。 TreeSetは、要素の順序を維持します。したがって、HashSetがTreeSetにカバーされると、要素が整理されます。
次のJavaプログラムは、この変換を示し、それによってHashSetをソートします。
import java.util.*; public class Main { public static void main(String args()) { // Create and initialize a HashSet HashSet<String> cities_HashSet = new HashSet<String>(); cities_HashSet.add('Pune'); cities_HashSet.add('Mumbai'); cities_HashSet.add('Bangaluru'); cities_HashSet.add('Hyderabad'); System.out.println('Original HashSet:'+ cities_HashSet); // Sort HashSet using TreeSet TreeSet<String> treeSet = new TreeSet<String>(cities_HashSet); // Print the sorted HashSet System.out.println('HashSet sorted using using TreeSet:' + treeSet); } }
出力:
次に、HashSetとHashMapの違いについて説明します。また、HashSetとTreeSetの違いについても説明します。
HashSetとHashMap
次の表は、HashSetとHashMapの主な違いを示しています。
HashSet | HashMap |
---|---|
オブジェクトは、Add()メソッドを使用して追加されます。 | HashMapは、put()メソッドを使用してキーと値のペアを追加します。 |
Setインターフェースを実装します。 | Mapインターフェースを実装します。 |
特定のタイプのオブジェクトを格納します。 | キーと値のデータのペアを格納します。 |
オブジェクトの重複値を許可しません。 | 重複する値は許可されますが、重複するキーは許可されません。 |
単一のnull値を持つことができます。 | 単一のnullキーと複数のnull値を許可します。 |
データを格納するために内部的にHashMapオブジェクトを使用します。 | データの保存にハッシュ手法を使用します。 |
HashMapと比較すると遅いです。 | HashMapはより高速です。 |
HashSetとTreeSet
以下に、HashSetとTreeSetの違いを示します。
HashSet | TreeSet |
---|---|
機能が制限されています。 | さまざまな操作を提供し、HashSetよりもTreesetを使いやすくする関数を提供します。 |
要素の順序は維持されません。オブジェクトをランダムな順序で格納します。 | 要素の自然な順序を維持します。 |
null値を許可します。 | null値を持つことはできません。 |
基本的な操作に一定の時間がかかるため、パフォーマンスが向上します。 | 基本操作のlogn時間コストを提供します。 |
Treesetよりもはるかに高速です。 | ツリーセットは遅いです。 |
HashMapを使用して内部的に実装されています。 | ツリーセットは、ナビゲート可能なツリーマップを使用して内部的に実装されます。 |
比較にequals()メソッドを使用します。 | 比較にcompareTo()メソッドを使用します。 |
よくある質問
Q#1)HashSetはJavaでどのように機能しますか?
回答: JavaのHashSetは、HashMapを使用してオブジェクトを格納します。 HashSetオブジェクトが作成されると、1つのHashMapオブジェクトが作成されます。 HashSetに入力された要素またはオブジェクトは、HashMapにキーとして保存されます。
Q#2)HashSetはJavaで注文されていますか?
回答: いいえ、Javaでは注文されていません。要素をランダムな順序で格納します。
Q#3)HashSetはnullを許可しますか?
回答: はい、単一のnull値を許可します。これは、1つの要素またはオブジェクトのみがnullになり、すべてではないことを意味します。
Q#4)JavaでHashSetが使用されるのはなぜですか?
回答: これは、Javaでキーと値のペアを格納するために使用されます。 HashSetが非同期であり、HashTableとは異なり、null値と単一のnullキーを許可することを除いて、HashTableに似ています。 HashSetは順序付けられておらず、順序付けされていないオブジェクトを格納するため、またはオブジェクトの順序が不要な場合に使用できます。
Q#5)HashSetはJavaで同期されていますか?
回答: HashSetはJavaで同期されていません。また、スレッドセーフではありません。ただし、synchronizedSet()メソッドを使用して同期させることができます。
結論
HashSetは、ランダムな順序のオブジェクトを含むコレクションです。 JavaでHashSetを実装するHashSetクラスは、HashMapを実装するHashTableを内部的に使用します。
HashSetクラスによって提供されるメソッドとともに、HashSetの宣言と初期化を確認しました。
=> EasyJavaトレーニングシリーズをお読みください。