セットとリストの違いは何ですか?


回答:


504

Listは要素の順序付けられたシーケンスですSetが、は順序付けされていない要素の個別のリストです(ありがとう、Quinn Taylor)。

List<E>:

順序付けられたコレクション(シーケンスとも呼ばれます)。このインターフェイスのユーザーは、リスト内の各要素を挿入する場所を正確に制御できます。ユーザーは、整数インデックス(リスト内の位置)を使用して要素にアクセスし、リスト内の要素を検索できます。

Set<E>:

重複する要素を含まないコレクション。より正式には、セットにはe1.equals(e2)のような要素e1とe2のペアが含まれず、最大で1つのnull要素が含まれます。その名前が示すように、このインターフェースは数学セットの抽象化をモデル化しています。


7
SortedSetの場合、equalsTo()== 0の要素は2つありません。equalsは呼び出されないためです。
Peter Lawrey

34
セットを注文することができるため、コレクションの注文を強制するためにリストを選択する必要がある場合でも、この回答の最初のステートメントは誤解を招く可能性があります
Samuel EUSTACHI 2013年

24
違う!Javaセットは、実装に応じて注文できます。たとえば、Java TreeSetが注文されます。Javaのコンテキストでは、リストとセットの唯一の違いは、セットに一意のアイテムが含まれていることです。数学の文脈では、セットの項目は一意であり、順序付けされていません。
stackoverflowuser2010 2013年

44
はい、Java Setは可能ですが、必ずしも注文する必要はありません。はい、もしあなたがTreeSetを持っているなら、あなたはそれが注文されることを期待できます。ただし、セットだけでなく、ツリーセットがあることを知っておく必要があります。セットが返された場合、そのセットに注文することはできません。一方、リストはその性質上順序付けされており、リストの実装は順序付けする必要があります。したがって、インターフェイスの定義に関しては、セットが順序付けられていないと言うことは特に間違っているわけではありませんが、セットは要素の順序を保証しないと言った方が少し技術的に正しいかもしれません。
Spanky Quigman 2013年

14
「ordered」と「sorted」を混同しないでください。同様に、インターフェースの契約とインターフェースの実装を混同しないでください。「順序付けられていない」ものに順序がないと言うのも誤りです。それは単に順序の実装について保証がないことを意味します(順序付けされたリストとは異なり、呼び出し間で順序が安定しない可能性があります)。
lilbyrdie 2014

223
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
                            List                     Set              
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
     Duplicates              YES                     NO               
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
       Order              ORDERED          DEPENDS ON IMPLEMENTATION  
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
 Positional Access          YES                      NO                
╚═══════════════════╩══════════════════════╩═════════════════════════════╝

2
注意すべき点の1つ:位置アクセスのパフォーマンスは、基盤となる実装、配列とリンクリストに大きく依存します。stackoverflow.com/ questions / 322715 /…
Christophe Roussy

1
位置アクセスでない場合、セットはどのようにインデックス付けされますか?(ASCIIテーブルの場合は+1)
tplive

72

要素の順序付けられたリスト(一意であるかどうかに関係なく)
という名前のJavaのインターフェースに準拠List
インデックスによってアクセスすることができます

を使用して実装

  • LinkedList
  • 配列リスト

ユニークな要素のリスト:
Set
「できない」というJavaのインターフェースに準拠インデックスでアクセス

を使用して実装

  • HashSet(順不同)
  • LinkedHashSet(順序付き)
  • TreeSet(自然順または提供されたコンパレーターでソート)

両方のインターフェースは、Javaの名前付きインターフェースSetList準拠Collection


28

セットには重複する要素を含めることはできませんが、リストには含めることができます。リスト(Java)も順序を意味します。


16
  • リストは、アイテムの順序付けられたグループです
  • セットは、(通常は)重複が許可されていない、順序付けられていないアイテムのグループです。

概念的には、通常、重複を許可する順序付けられていないグループをバッグとして参照し、重複を許可しないセットをセットと呼びます。


セットは重複できません。
karim79 2009年

一部のセット実装は順序付けられています(LinkedHashSetなど、舞台裏でLinkedListを維持します)。ただし、Set ADTには順序がありません。
マイケルマイヤーズ

10

リスト

  1. 要素の順序付けられたグループです。
  2. リストは、重複する要素のコレクションに使用されます。
  3. 新しいメソッドがListインターフェース内で定義されています。

セットする

  1. 要素の順不同のグループです。
  2. セットは、重複のない要素のコレクションに使用されます。
  3. 新しいメソッドはSetインターフェース内で定義されていないため、CollectionサブクラスでのみCollectionインターフェースメソッドを使用する必要があります。

10

リスト:

Listsは通常、オブジェクトの複製を許可します。 Listsは順序付けする必要があるため、インデックスでアクセスできます。

実装クラスが含まれます:ArrayListLinkedListVector

セットする:

Setないオブジェクトの重複許可され。ほとんどの実装は順序付けされていませんが、実装固有です。

実装クラスには以下が含まれます:( HashSet順序なし)、 LinkedHashSet(順序付き)、 TreeSet(自然順序または提供されたコンパレーターで順序付け)


7

Javaインターフェースについて話しているので、Javadocを見てみませんか?

  • A Listは順序付けられたコレクション(シーケンス)であり、通常は重複を許可します
  • a Setは、重複する要素を含まないコレクションです。反復順序は実装によって保証される場合があります

セットに関する順序の欠如については言及されていません。実装によって異なります。


2
正しい。LinkedHashSetには、挿入順に要素が含まれます。
ggb667 2013

それはインターフェースであり、すべては実装に依存します。List.get()は、piの最初の5つの小数を含むファイルを作成し、一部の実装ではStackOverFlowExceptionをスローできます。これは、「リストはファイルを作成できるものである」とは言えないことを意味しません。インターフェースによって定義されたコントラクト。docsクレームSetはセットの数学的概念をモデルにしており、定義上順序付けされていません。コードのセットを考えると、SOLIDの原則に違反することなく、セットが注文されていると想定することはできません。
サラ2015年

@kai、LinkedHashSetコードが後で順序に依存している場合、私は通常左側を維持します。Set基盤となる実装がa LinkedHashSetなどであることを想定できないため、実際にそれを実際に使用する場合にのみ使用しますが、今日であっても、明日はコードが変更され、失敗します。
Christophe Roussy、2015年

LinkedHashSetを宣言する場合、Setを扱っていないので、Setの動作について主張することはほとんど関係ありません。一部の実装に基づいてセットに(可能な)順序付けを帰することは、「Runnableのインスタンスには、いくつかのスレッドで実行されることを意図したrunメソッドがあります。また、実装に応じてDB接続を開き、顧客データを読み取ります。 」もちろん、いくつかの実装はそれを行うかもしれませんが、それはRunnable Interfaceが意味するものではありません。
サラ

5

これはあなたが探している答えではないかもしれませんが、コレクションクラスのJavaDocは実際にはかなり説明的です。コピー/貼り付け:

順序付けられたコレクション(シーケンスとも呼ばれます)。このインターフェイスのユーザーは、リスト内の各要素を挿入する場所を正確に制御できます。ユーザーは、整数インデックス(リスト内の位置)を使用して要素にアクセスし、リスト内の要素を検索できます。

セットとは異なり、リストは通常​​、重複する要素を許可します。より正式には、リストは通常​​、e1.equals(e2)のような要素e1とe2のペアを許可し、null要素を許可する場合は、通常、複数のnull要素を許可します。ユーザーがそれらを挿入しようとしたときにランタイム例外をスローすることにより、重複を禁止するリストを実装したいと考える人も少なくありませんが、この使用法はまれであると予想しています。


5

セットは、個別のオブジェクトの順序付けされていないグループです。重複するオブジェクトは許可されません。通常、挿入されるオブジェクトのハッシュコードを使用して実装されます。(特定の実装では順序が追加される場合がありますが、Setインターフェース自体では追加されません。)

リストは、重複を含む可能性のあるオブジェクトの順序付けられたグループです。それはで実装することができArrayListLinkedListなど


1
私は混乱しています😕!この文脈での順序付け/非順序付けとはどういう意味ですか?昇順、降順の関係ですか?もしそうなら、List注文されません😕– malhobayyeb 2017
1

4
Orderedは、入力データがユーザーの入力どおりに配置されている場合で、Sortedは、入力データが辞書式または昇順/降順(整数値)で並べ替えられている場合です。順序付けなしとは、入力データがユーザーの入力した順序で格納される場合と格納されない場合があります。
Akhil 2017年

5

リスト:
リストでは、重複する要素と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値と重複値を許可しません


3

1.リストは重複する値を許可し、セットは重複を許可しません

2.リストは、リストに要素を挿入した順序を維持しますセットは順序を維持しません。3.Listは要素の順序付けられたシーケンスですが、Setは順序付けされていない要素の個別のリストです。


3

リスト対セット

1)セットは重複を許可しません。リストは重複を許可します。Setの実装に基づいて、挿入Orderも維持します。

例:LinkedHashSet。挿入順序を維持します。参照してくださいます。こちらをください

2)メソッドを含みます。セットの性質上、アクセスのパフォーマンスが向上します。最良のケースはo(1)です。ただし、リストには呼び出すパフォーマンスの問題がありcontainsます。


2

すべてのListクラスは挿入の順序を維持します。パフォーマンスやその他の特性に基づいて異なる実装を使用します(ArrayList特定のインデックスへのアクセス速度など)LinkedList単に順序を維持するため)。キーがないため、重複は許可されます。

Setクラスは、挿入順序を維持しません。それらはオプションで特定の順序を課すことができます(と同様SortedSet)が、通常はいくつかのハッシュ関数(と同様HashSet)に基づいて実装定義の順序を持​​ちます。Setはキーによってアクセスされるため、重複は許可されません。


マップはキーによってオブジェクトを格納しますが、オブジェクトに関連する一意の値(通常はハッシュコード)を使用してストアオブジェクトを設定します。(マップは、キーの一意性をチェックするためにハッシュコードを使用する場合もありますが、必須ではありません。)
Quinn Taylor

1

順序付け...リストには順序がありますが、セットにはありません。


2
Set ADTは順序を指定しませんが、一部のSet実装(LinkedHashSetなど)は挿入順序を保持します。
マイケルマイヤーズ

3
ただし、より重要な違いは、セットでは重複が許可されないことです。バッグ/マルチセットにはあります。
クインテイラー

TreeSetには順序があります。
stackoverflowuser2010 2013年

1

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が適しています。


こんにちは@Vibha、両方の条件を満たしたい場合は?私は自分のデータに重複が含まれることを望まないことを意味し、またそれが順序であることを望みます。
Panadol Chong 2017

1

リスト:

  1. 許可された重複。
  2. グループ化要素で並べ替えられます(つまり、明確な順序があります。昇順で並べ替える必要はありません)。

セットする:

  1. 重複は許可されていません。
  2. グループ化要素で順序付けられていません(つまり、明確な順序はありません。昇順で配置されている場合とされていない場合があります)。

0

Set<E>とのList<E>両方のタイプの要素を格納するために使用されEます。違いはSet、順序付けされていない方法で格納され、重複する値を許可しないことです。List順序付けられた方法で要素を格納するために使用され、重複する値を許可します。

Set要素はインデックス位置でアクセスできず、List要素はインデックス位置でアクセスできます。


1
@BalusCは投稿日を見ずにコメントしないでください。当時の投稿をご覧ください。
Yash

0

こんにちは多くの回答が既に与えられています。これまで述べられていないいくつかのポイントを指摘させてください:

  • ほとんどのList実装(ArrayList、Vector)が実装しますRandomAccessは、より高速なアクセスのためのマーカーインターフェイスであるインターフェイスをます。Set実装はそれを行いません。
  • リストは、双方向の反復をサポートする、呼び出され 1つの特別なイテレーターを使用ListIterator します。セットは一方向反復のみをサポートするイテレーターを使用します
  • HashSetは、同じ数の要素を格納するために、ArrayListの5.5倍のメモリを必要とします。

@smurtiこれは少し遅れており、メモしたかどうかはわかりませんが、最初の点はそれ自体が矛盾します:「リスト実装のほとんど(ArrayList、Vector)はRandomAccess ...を実装します」および「...リストのどれも実装はそれを行います」
Peter M

0

最大の違いは基本的なコンセプトです。

以下からの設定およびリスト・インターフェース。セットは数学の概念です。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インターフェースです。重複する要素は概念の結果にすぎません。本質的な違いではありません。

したがって、本質的な違いはコンセプトです。セットは数学セットのコンセプトです。リストはシーケンスの概念です。


-1

これはグルーヴィーな明確な例です。セットとリストを作成します。次に、各リスト内にランダムに生成された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]

違いは次のとおりです。

  • セットは重複する値を許可しません。
  • リストは重複する値を許可します。

1
リストは順序も維持します。
glen3b 2014年

-1

SETには重複する値がなく、リストにはできるので、答えと同様に。もちろん、順序は、それらを区別する別の1つのことです。


-1

セット: セットのコレクションに重複要素を含めることはできません。また、順不同のコレクションです。Setからデータにアクセスするには、イテレータのみを使用する必要があり、インデックスベースの取得はできません。主に一意性コレクションが必要なときに使用されます。

リスト: リストには、挿入時に自然な順序で重複する要素を含めることができます。したがって、インデックスまたはイテレータに基づいてデータを取得できます。インデックスに基づいてアクセスする必要があるコレクションを格納するために広く使用されています。


-2

トピック名:リストVSセット

私は、Javaの最も重要なトピックであるCollections Frameworkについて説明しました。コレクションに関する私の小さな知識をあなたと共有したいと思いました。リスト、セット、マップは、その中で最も重要なトピックです。それでは、リストとセットから始めましょう。

リストとセットの違い:

  1. Listは、クラスを拡張AbstractListするコレクションクラスです。Setは、クラスを拡張するコレクションクラスですがAbstractSet、どちらもCollectionインターフェースを実装しています。

  2. リストインターフェイスは重複する値(要素)を許可しますが、セットインターフェイスは重複する値を許可しません。セット内の要素が重複している場合は、古い値を置き換えます。

  3. リストインターフェイスはNULL値を許可しますが、セットインターフェイスはNULL値を許可しません。SetでNull値を使用する場合は、が返されますNullPointerException

  4. リストインターフェイスは挿入順序を維持します。つまり、イテレータまたはfor-eachスタイルを使用して取得するのと同じ方法で、リストに要素を追加する方法です。一方、Set実装では必ずしも挿入順序が維持されません。(ただし、をSortedSet使用しTreeSetLinkedHashSet挿入順序を維持します)。

  5. リストインターフェイスには独自のメソッドが定義されていますが、セットインターフェイスには独自のメソッドがないため、セットはコレクションインターフェイスメソッドのみを使用します。

  6. リストインターフェイスには1つのレガシークラスが呼び出されVectorますが、セットインターフェイスにはレガシークラスがありません

  7. 最後になりましたが、このlistIterator()メソッドはリストクラス内の要素を循環するためにのみ使用できますが、iterator()メソッドを使用してSetクラス要素にアクセスできます。

他に何か追加できますか?私にお知らせください。

ありがとう。


いずれかの、ListおよびSetまた(あなたが言及)抽象クラスの形で「ベース」の実装を持っているインターフェースです。また、#3は完全に不正確です。これは、ほとんどのセットでnull値が許可されるためです(ただし、実装に依存します)。私は#5と#7を理解していません。#6 Vectorはレガシーではありませんが、同期されているだけで、同期が必要な場合を除いて使用するのは好ましくありません。
glen3b 2014年

-3

セットする:

値を重複させることはできません。順序は実装によって異なります。デフォルトでは順序付けされていませんインデックスによるアクセスはできません

リスト:

重複する値を持つことができますデフォルトで順序付けされますインデックスでアクセスできます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.