Set<E>
とList<E>
インターフェースの基本的な違いは何ですか?
Set<E>
とList<E>
インターフェースの基本的な違いは何ですか?
回答:
List
は要素の順序付けられたシーケンスですSet
が、は順序付けされていない要素の個別のリストです(ありがとう、Quinn Taylor)。
順序付けられたコレクション(シーケンスとも呼ばれます)。このインターフェイスのユーザーは、リスト内の各要素を挿入する場所を正確に制御できます。ユーザーは、整数インデックス(リスト内の位置)を使用して要素にアクセスし、リスト内の要素を検索できます。
重複する要素を含まないコレクション。より正式には、セットにはe1.equals(e2)のような要素e1とe2のペアが含まれず、最大で1つのnull要素が含まれます。その名前が示すように、このインターフェースは数学セットの抽象化をモデル化しています。
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
要素の順序付けられたリスト(一意であるかどうかに関係なく)
という名前のJavaのインターフェースに準拠List
インデックスによってアクセスすることができます
を使用して実装
ユニークな要素のリスト:
Set
「できない」というJavaのインターフェースに準拠インデックスでアクセス
を使用して実装
両方のインターフェースは、Javaの名前付きインターフェースSet
にList
準拠Collection
概念的には、通常、重複を許可する順序付けられていないグループをバッグとして参照し、重複を許可しないセットをセットと呼びます。
リスト
セットする
Javaインターフェースについて話しているので、Javadocを見てみませんか?
List
は順序付けられたコレクション(シーケンス)であり、通常は重複を許可しますSet
は、重複する要素を含まないコレクションです。反復順序は実装によって保証される場合がありますセットに関する順序の欠如については言及されていません。実装によって異なります。
LinkedHashSet
コードが後で順序に依存している場合、私は通常左側を維持します。Set
基盤となる実装がa LinkedHashSet
などであることを想定できないため、実際にそれを実際に使用する場合にのみ使用しますが、今日であっても、明日はコードが変更され、失敗します。
これはあなたが探している答えではないかもしれませんが、コレクションクラスのJavaDocは実際にはかなり説明的です。コピー/貼り付け:
順序付けられたコレクション(シーケンスとも呼ばれます)。このインターフェイスのユーザーは、リスト内の各要素を挿入する場所を正確に制御できます。ユーザーは、整数インデックス(リスト内の位置)を使用して要素にアクセスし、リスト内の要素を検索できます。
セットとは異なり、リストは通常、重複する要素を許可します。より正式には、リストは通常、e1.equals(e2)のような要素e1とe2のペアを許可し、null要素を許可する場合は、通常、複数のnull要素を許可します。ユーザーがそれらを挿入しようとしたときにランタイム例外をスローすることにより、重複を禁止するリストを実装したいと考える人も少なくありませんが、この使用法はまれであると予想しています。
セットは、個別のオブジェクトの順序付けされていないグループです。重複するオブジェクトは許可されません。通常、挿入されるオブジェクトのハッシュコードを使用して実装されます。(特定の実装では順序が追加される場合がありますが、Setインターフェース自体では追加されません。)
リストは、重複を含む可能性のあるオブジェクトの順序付けられたグループです。それはで実装することができArrayList
、LinkedList
など
List
注文されません😕– malhobayyeb 2017
リスト:
リストでは、重複する要素とnull値を使用できます。要素の対応するインデックスを使用して簡単に検索でき、要素を挿入順に表示します。例:(linkedlist)
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
を表示する順序は維持されません。昇順でのみ表示されます。
例:(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値と重複値を許可しません
リスト対セット
1)セットは重複を許可しません。リストは重複を許可します。Setの実装に基づいて、挿入Orderも維持します。
例:LinkedHashSet
。挿入順序を維持します。参照してくださいます。こちらをください
2)メソッドを含みます。セットの性質上、アクセスのパフォーマンスが向上します。最良のケースはo(1)です。ただし、リストには呼び出すパフォーマンスの問題がありcontains
ます。
すべてのList
クラスは挿入の順序を維持します。パフォーマンスやその他の特性に基づいて異なる実装を使用します(ArrayList
特定のインデックスへのアクセス速度など)LinkedList
単に順序を維持するため)。キーがないため、重複は許可されます。
Set
クラスは、挿入順序を維持しません。それらはオプションで特定の順序を課すことができます(と同様SortedSet
)が、通常はいくつかのハッシュ関数(と同様HashSet
)に基づいて実装定義の順序を持ちます。Set
はキーによってアクセスされるため、重複は許可されません。
順序付け...リストには順序がありますが、セットにはありません。
JavaでのListとSetの価値ある違いは次のとおりです。
1) JavaのListとSetの根本的な違いにより、要素の重複が許可されています。Javaのリストでは重複が許可されていますが、セットでは重複が許可されていません。Setに重複を挿入すると、古い値が置き換えられます。Set in Javaの実装には、一意の要素のみが含まれます。
2) Javaのリストとセットのもう1つの重要な違いは順序です。リストは順序付けられたコレクションですが、セットは順序付けられていないコレクションです。リストは要素の挿入順序を維持します。つまり、前に挿入された要素は、後に挿入された要素よりも低いインデックスになります。Javaで設定すると、順序は維持されません。Setは、SortedSetと呼ばれる別の代替手段を提供しますが、Set要素は、Setに格納されたオブジェクトのComparableメソッドとComparatorメソッドによって定義された特定のソート順で格納できます。
3) JavaのListインターフェースの一般的な実装には、ArrayList、Vector、およびLinkedListが含まれます。Setインターフェースの一般的な実装には、HashSet、TreeSet、LinkedHashSetが含まれます。
挿入順序またはオブジェクトを維持する必要があり、コレクションに重複が含まれる可能性がある場合は、Listを使用するよりも明らかです。一方、セットが重複なしに一意のコレクションを維持することが要件である場合は、Setが適しています。
こんにちは多くの回答が既に与えられています。これまで述べられていないいくつかのポイントを指摘させてください:
RandomAccess
は、より高速なアクセスのためのマーカーインターフェイスであるインターフェイスをます。Set実装はそれを行いません。ListIterator
します。セットは一方向反復のみをサポートするイテレーターを使用します最大の違いは基本的なコンセプトです。
以下からの設定およびリスト・インターフェース。セットは数学の概念です。Setメソッドはコレクションを拡張しますが、新しいメソッドを追加しません。size()はカーディナリティーを意味します(詳細はBitSet.cardinality、線形カウンター、ログログ、HyperLogLogです))。addAll()は共用体を意味します。RetainAll()は交差を意味します。removeAll()は違いを意味します。
しかしリストは、これらの概念の欠如します。リストは、コレクションインターフェイスが提供しないシーケンスコンセプトをサポートするための多くのメソッドを追加します。コアコンセプトはINDEXです。add(index、element)、get(index)、search(indexOf())、remove(index)要素のように。リストは「コレクションビュー」のサブリストも提供します。セットにビューがありません。位置アクセスはありません。Listは、Collectionsクラスの多くのアルゴリズムも提供します。sort(リスト)、binarySearch(リスト)、reverse(リスト)、shuffle(リスト)、fill(リスト)。メソッドparamsはListインターフェースです。重複する要素は概念の結果にすぎません。本質的な違いではありません。
したがって、本質的な違いはコンセプトです。セットは数学セットのコンセプトです。リストはシーケンスの概念です。
これはグルーヴィーな明確な例です。セットとリストを作成します。次に、各リスト内にランダムに生成された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セット
私は、Javaの最も重要なトピックであるCollections Frameworkについて説明しました。コレクションに関する私の小さな知識をあなたと共有したいと思いました。リスト、セット、マップは、その中で最も重要なトピックです。それでは、リストとセットから始めましょう。
リストとセットの違い:
Listは、クラスを拡張AbstractList
するコレクションクラスです。Setは、クラスを拡張するコレクションクラスですがAbstractSet
、どちらもCollectionインターフェースを実装しています。
リストインターフェイスは重複する値(要素)を許可しますが、セットインターフェイスは重複する値を許可しません。セット内の要素が重複している場合は、古い値を置き換えます。
リストインターフェイスはNULL値を許可しますが、セットインターフェイスはNULL値を許可しません。SetでNull値を使用する場合は、が返されますNullPointerException
。
リストインターフェイスは挿入順序を維持します。つまり、イテレータまたはfor-eachスタイルを使用して取得するのと同じ方法で、リストに要素を追加する方法です。一方、Set
実装では必ずしも挿入順序が維持されません。(ただし、をSortedSet
使用しTreeSet
、LinkedHashSet
挿入順序を維持します)。
リストインターフェイスには独自のメソッドが定義されていますが、セットインターフェイスには独自のメソッドがないため、セットはコレクションインターフェイスメソッドのみを使用します。
リストインターフェイスには1つのレガシークラスが呼び出されVector
ますが、セットインターフェイスにはレガシークラスがありません
最後になりましたが、このlistIterator()
メソッドはリストクラス内の要素を循環するためにのみ使用できますが、iterator()メソッドを使用してSetクラス要素にアクセスできます。
他に何か追加できますか?私にお知らせください。
ありがとう。
List
およびSet
また(あなたが言及)抽象クラスの形で「ベース」の実装を持っているインターフェースです。また、#3は完全に不正確です。これは、ほとんどのセットでnull値が許可されるためです(ただし、実装に依存します)。私は#5と#7を理解していません。#6 Vector
はレガシーではありませんが、同期されているだけで、同期が必要な場合を除いて使用するのは好ましくありません。
セットする:
値を重複させることはできません。順序は実装によって異なります。デフォルトでは順序付けされていませんインデックスによるアクセスはできません
リスト:
重複する値を持つことができますデフォルトで順序付けされますインデックスでアクセスできます