Set<E>
とList<E>
インターフェイスの根本的な違いは何ですか?
26 に答える
List
は要素の順序付けられたシーケンスですが、Set
は順序付けられていない要素の個別のリストです (ありがとう、Quinn Taylor )。
順序付きコレクション (シーケンスとも呼ばれます)。このインターフェースのユーザーは、各要素がリスト内のどこに挿入されるかを正確に制御できます。ユーザーは整数インデックス (リスト内の位置) で要素にアクセスし、リスト内の要素を検索できます。
重複する要素を含まないコレクション。より正式には、セットには、e1.equals(e2) のような要素 e1 と e2 のペアが含まれず、最大でも 1 つの null 要素が含まれます。その名前が示すように、このインターフェイスは数学的集合の抽象化をモデル化します。
リスト | 設定 | |
---|---|---|
重複 | はい | いいえ |
注文 | 順序付けられました | 実装に依存 |
ポジションアクセス | はい | いいえ |
要素の順序付けられたリスト (一意かどうか)
という名前の Java のインターフェースに準拠List
インデックスでアクセス可能
を使用して実装
- リンクされたリスト
- 配列リスト
一意の要素のリスト:
という名前の Java のインターフェイスに準拠しますSet
。インデックスによってアクセス
できません。
を使用して実装
- HashSet (順不同)
- LinkedHashSet (順序付き)
- TreeSet (自然順序または提供されたコンパレーターでソート)
インターフェースSet
とList
Java のインターフェースの両方に準拠し、Collection
Set には重複する要素を含めることはできませんが、List には含めることができます。リスト (Java の場合) も順序を意味します。
- リストは項目の順序付けられたグループです
- セットは、重複が許可されていないアイテムの順序付けられていないグループです (通常)
概念的には、通常、重複を許可する順序付けられていないグループをバッグとして参照し、重複を許可しないグループをセットと呼びます。
リスト:
List
■ 通常、オブジェクトの重複を許可します。
List
s は順序付けする必要があるため、インデックスによってアクセスできます。
実装クラスには次ArrayList
のものがありますLinkedList
。Vector
設定:
Set
■オブジェクトの重複は許可されません。ほとんどの実装は順不同ですが、実装固有です。
実装クラスには
HashSet
、(順序なし)、
LinkedHashSet
(順序
あり)、 TreeSet
(自然順序または提供されたコンパレータによる順序) が含まれます。
リスト
- 要素の順序付きグループです。
- リストは、重複する要素のコレクションに使用されます。
- List インターフェイス内で新しいメソッドが定義されます。
設定
- 要素の順序付けられていないグループです。
- セットは、重複のない要素のコレクションに使用されます。
- Set インターフェース内で新しいメソッドは定義されていないため、Set サブクラスでのみ Collection インターフェース メソッドを使用する必要があります。
リスト:
リストでは、要素の重複と null 値を使用できます。要素の対応するインデックスを使用して簡単に検索でき、要素を挿入順に表示します。例:(リンクリスト)
import java.util.*;
public class ListExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
List<Integer> l=new LinkedList<Integer>();
l.add(001);
l.add(555);
l.add(333);
l.add(888);
l.add(555);
l.add(null);
l.add(null);
Iterator<Integer> il=l.iterator();
System.out.println(l.get(0));
while(il.hasNext()){
System.out.println(il.next());
}
for(Integer str : l){
System.out.println("Value:"+str);
}
}
}
出力:
1
1
555
333
888
555
null
null
値:1
値:555
値:333
値:888
値:555
値:null
値:null
セット:
セットは重複する要素を許可せず、単一の null 値を許可します。要素TreeSet
を表示する順序は維持されません。昇順でのみ表示されます。
例:(ツリーセット)
import java.util.TreeSet;
public class SetExample {
public static void main(String[] args) {
// TODO Auto-generated method stub
TreeSet<String> set = new TreeSet<String>();
try {
set.add("hello");
set.add("world");
set.add("welcome");
set.add("all");
for (String num : set) {
System.out.println( num);
}
set.add(null);
} catch (NullPointerException e) {
System.out.println(e);
System.out.println("Set doesn't allow null value and duplicate value");
}
}
}
出力:
すべて
こんにちは
ようこそ
世界
java.lang.NullPointerException
Set は null 値と重複値を許可しません
Javaインターフェースについて話しているので、Javadocを見てみませんか?!
- A
List
は順序付けられたコレクション(シーケンス)であり、通常は重複が許可されます - a
Set
は重複する要素を含まないコレクションであり、反復順序は実装によって保証される場合があります
セットに関する順序の欠如についての言及はありません:それは実装に依存します。
セットは、個別のオブジェクトの順序付けられていないグループです。オブジェクトの重複は許可されません。通常、挿入されるオブジェクトのハッシュ コードを使用して実装されます。(特定の実装では順序付けが追加される場合がありますが、Set インターフェイス自体では追加されません。)
リストは、重複を含む可能性があるオブジェクトの順序付けられたグループです。ArrayList
、LinkedList
などで実装できます。
これはあなたが探している答えではないかもしれませんが、コレクション クラスの JavaDoc は実際にはかなり説明的です。コピー/貼り付け:
順序付きコレクション (シーケンスとも呼ばれます)。このインターフェースのユーザーは、各要素がリスト内のどこに挿入されるかを正確に制御できます。ユーザーは整数インデックス (リスト内の位置) で要素にアクセスし、リスト内の要素を検索できます。
セットとは異なり、リストは通常、要素の重複を許可します。より正式には、リストは通常、e1.equals(e2) のような要素 e1 と e2 のペアを許可し、null 要素を許可する場合は通常、複数の null 要素を許可します。ユーザーが重複を挿入しようとしたときに実行時例外をスローすることにより、重複を禁止するリストを実装したいと考える人がいるかもしれませんが、この使用法はまれであると予想されます。
要素 | リスト | 設定 |
---|---|---|
順序付けられたグループ化要素ですか? | はい | いいえ |
インデックスによる位置アクセスを提供しますか? | はい | いいえ |
重複した要素を保存できますか? | はい | いいえ |
null 複数の要素を保存できますか? |
はい | いいえ |
チャイルズ: | ArrayList 、LinkedList 、Vector 、およびStack |
HashSet とLinkedHashSet |
リスト対セット
1) セットは重複を許可しません。リストは複製を許可します。Set の実装に基づいて、挿入 Order も維持します。
例: LinkedHashSet
. 広告掲載順を保持します。こちらをご参照ください。
2)メソッドを含む。Set の性質上、アクセスのパフォーマンスが向上します。最良のケースは o(1) です。しかし、リストには呼び出すパフォーマンスの問題がありcontains
ます。
1.リストは値の重複を許可し、セットは重複を許可しません
2.List は、要素をリストに挿入した順序を維持します。 Set は順序を維持しません。3.List は要素の順序付けられたシーケンスですが、Set は順序付けられていない要素の個別のリストです。
Java での List と Set の重要な相違点は、次のとおりです。
1) Java における List と Set の根本的な違いは、要素の重複を許可することです。Java の List は重複を許可しますが、Set は重複を許可しません。Set に重複を挿入すると、古い値が置き換えられます。Java での Set の実装には、一意の要素のみが含まれます。
2) Java の List と Set のもう 1 つの重要な違いは順序です。List は順序付けられたコレクションですが、Set は順序付けられていないコレクションです。リストは要素の挿入順序を維持します。つまり、前に挿入された要素は、後に挿入された要素よりも低いインデックスになります。Java で設定すると、順序が維持されません。Set は SortedSet と呼ばれる別の代替手段を提供しますが、Set に格納されたオブジェクトの Comparable および Comparator メソッドによって定義された特定の並べ替え順序で Set 要素を格納できます。
3) Java での List インターフェイスの一般的な実装には、ArrayList、Vector、および LinkedList が含まれます。Set インターフェイスの一般的な実装には、HashSet、TreeSet、および LinkedHashSet が含まれます。
挿入順序またはオブジェクトを維持する必要があり、コレクションに重複が含まれる可能性がある場合は、リストよりも優れていることは明らかです。一方、重複なしで一意のコレクションを維持することが要件である場合は、 Set が最適です。
すべてのList
クラスは、挿入の順序を維持します。ArrayList
パフォーマンスやその他の特性 (特定のインデックスへのアクセス速度、LinkedList
単純な順序の維持など)に基づいて、さまざまな実装を使用します。キーがないため、重複が許可されます。
クラスはSet
挿入順序を維持しません。オプションで特定の順序を課すこともできますが ( のようにSortedSet
)、通常は何らかのハッシュ関数に基づいて実装定義の順序を持ちます ( のようにHashSet
)。Set
s はキーでアクセスされるため、重複は許可されません。
一番大きな違いは基本コンセプトです。
Set and Listインターフェイスから。セットは数学の概念です。Setメソッドはコレクションを拡張します。ただし、新しいメソッドは追加しません。size() はカーディナリティを意味します(さらにBitSet.cardinality, Linear counter,Log Log,HyperLogLog )。addAll() はユニオンを意味します。keepAll() は交差を意味します。removeAll() は違いを意味します。
ただし、これらの概念の欠如を挙げてください。Collectionインターフェイスが提供しないシーケンスの概念をサポートするために、リストに多くのメソッドを追加します。コアコンセプトはINDEXです。add(index,element)、get(index)、search(indexOf())、remove(index)要素のように。リストには、「コレクション ビュー」サブリストも用意されています。セットにはビューがありません。位置アクセスがありません。ListはCollectionsクラスにも多くのアルゴリズムを提供します。sort(リスト)、binarySearch(リスト)、reverse(リスト)、shuffle(リスト)、fill(リスト)。メソッド params はListインターフェイスです。重複する要素は、概念の結果にすぎません。本質的な違いではありません。
したがって、本質的な違いはコンセプトです。セットは数学セットの概念です。リストはシーケンスの概念です。
リスト:
- 許可された重複。
- グループ化された要素で順序付けられます。(つまり、明確な順序があります。昇順でソートする必要はありません)。
設定:
- 重複は許可されていません。
- 要素のグループ化で順序付けされていません。(つまり、明確な順序がありません。昇順で配置されている場合とされていない場合があります)
順序付け... リストには順序がありますが、セットにはありません。
Set<E>
とList<E>
は両方ともタイプの要素を格納するために使用されE
ます。違いはSet
、順序付けられていない方法で保存され、重複する値を許可しないことです。List
順序付けられた方法で要素を格納するために使用され、重複する値を許可します。
Set
要素にはインデックス位置からアクセスできません。また、List
要素にはインデックス位置からアクセスできます。
これは、groovy を使用した明確な例です。セットとリストを作成します。次に、各リスト内にランダムに生成された 20 個の値を格納しようとします。生成される値は 0 から 5 の範囲です
s = [] as Set
l = []
max = 5
print "random Numbers :"
20.times{
e = (int)Math.random()*max
s << e
l << e
print "$e, "
}
println "\n"
println "Set : $s "
println "list : $l
結果 :
乱数:4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3
設定 :[4, 1, 0, 2, 3]
リスト:[4, 1, 4, 0, 1, 2, 4, 0, 0, 3, 4, 3, 2, 0, 4, 0, 1, 3, 1, 3]
違いは次のとおりです。
- Set は重複する値を許可しません。
- リストは重複する値を許可します。
トピック名: リスト VS セット
Collections Framework と呼ばれる Java の最も重要なトピックについて説明しました。コレクションについての私の小さな知識をあなたと共有することを考えました. List、Set、Map が最も重要なトピックです。それでは、List と Set から始めましょう。
リストとセットの違い:
List はクラスを拡張するコレクション クラスで
AbstractList
あり、Set はクラスを拡張するコレクション クラスですAbstractSet
が、両方とも Collection インターフェイスを実装します。List インターフェイスでは値 (要素) の重複が許可されますが、Set インターフェイスでは値の重複は許可されません。Set に要素が重複している場合は、古い値を置き換えます。
List インターフェイスは NULL 値を許可しますが、Set インターフェイスは Null 値を許可しません。Set で Null 値を使用する場合は、 が得られ
NullPointerException
ます。List インターフェイスは挿入順序を維持します。これは、イテレータまたは for-each スタイルを使用してリストを取得するのと同じ方法で、リストに要素を追加する方法を意味します。一方
Set
、実装は必ずしも挿入順序を維持するとは限りません。(ただし、SortedSet
を使用しTreeSet
、LinkedHashSet
挿入順序を維持します)。List インターフェイスには独自のメソッドが定義されていますが、Set インターフェイスには独自のメソッドがないため、Set には Collection インターフェイス メソッドのみが使用されます。
List インターフェイスには 1 つのレガシー クラスが呼び出され
Vector
ますが、Set インターフェイスにはレガシー クラスがありません。最後になりましたが、
listIterator()
メソッドは List クラス内の要素を循環するためにのみ使用できますが、 iterator() メソッドを使用して Set クラス要素にアクセスできます
他に何か追加できますか?私にお知らせください。
ありがとう。
設定:
重複する値を持つことはできません。順序は実装によって異なります。デフォルトでは順序付けされていません インデックスによるアクセスはできません
リスト:
重複する値を持つことができます デフォルトで並べ替えられます インデックスでアクセスできます