Set과 List의 차이점은 무엇입니까?


답변:


504

List순서가 지정된 요소의 순서이지만 Set정렬되지 않은 요소의 고유 목록입니다 (감사합니다, Quinn Taylor ).

List<E>:

정렬 된 컬렉션 (시퀀스라고도 함). 이 인터페이스의 사용자는 목록에서 각 요소가 삽입되는 위치를 정확하게 제어 할 수 있습니다. 사용자는 정수 인덱스 (목록의 위치)로 요소에 액세스하고 목록에서 요소를 검색 할 수 있습니다.

Set<E>:

중복 요소가없는 컬렉션입니다. 보다 공식적으로, 세트에는 e1.equals (e2)와 같은 한 쌍의 요소 e1과 e2가없고 최대 하나의 null 요소가 포함됩니다. 이름에서 알 수 있듯이이 인터페이스는 수학 집합 추상화를 모델링합니다.


7
SortedSet의 경우 equals가 호출되지 않으므로 compareTo () == 0 인 두 요소가 없습니다.
Peter Lawrey 2016 년

34
세트 주문이 가능하므로,이 답변의 첫 번째 진술은 물론 수집 명령을 시행하기 위해 목록을 선택해야하더라도 오해의 소지가 있습니다.
Samuel EUSTACHI

24
잘못된! 구현에 따라 Java 세트를 주문할 수 있습니다. 예를 들어, Java TreeSet이 주문됩니다. Java와 관련하여 List와 Set의 유일한 차이점은 Set에 고유 항목이 포함되어 있다는 것입니다. 수학의 맥락에서, 세트의 항목은 독특하고 순서가 없습니다.
stackoverflowuser2010 년

44
예, Java 세트 CAN 일 수 있지만 반드시 주문되지는 않습니다. 예, TreeSet이 있으면 주문한 것을 믿을 수 있습니다. 그러나 당신은 단지 Set이 아니라 TreeSet이 있다는 것을 알아야합니다. 당신이 세트를 반환하면, 당신은 주문에 의존 할 수 없습니다. 반면에 목록은 본질적으로 주문되며 목록의 구현은 주문해야합니다. 따라서 인터페이스 정의의 관점에서 Set이 정렬되지 않았다고 말하는 것은 특히 잘못이 아니지만 Set이 요소 순서를 보장하지 않는다고 말하는 것은 기술적으로 더 정확할 수 있습니다.
Spanky Quigman

14
"정렬"과 "정렬"을 혼동하지 마십시오. 마찬가지로 인터페이스 계약과 인터페이스 구현을 혼동하지 마십시오. "정렬되지 않은"항목에는 순서가 없다고 말하는 것은 잘못입니다. 이는 단순히 순서의 구현에 대한 보장이 없음을 의미합니다 (순서 목록과 달리 호출간에 순서가 안정적이지 않을 수 있음).
lilbyrdie

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

2
위치 액세스 성능이 링크리스트 대, 기본이되는 구현에 배열을 많이 따라 달라집니다 주에 한 가지 stackoverflow.com/questions/322715/...
크리스토프 후씨

1
위치 액세스가 아닌 경우 세트는 어떻게 색인화됩니까? (ASCII 테이블의 경우 +1)
tplive

72

(독특한 여부) 요소의 정렬 된 목록
라는 이름의 자바의 인터페이스에 적합List
색인으로 액세스 가능

사용하여 구현

  • 연결 목록
  • 배열 목록

고유 한 요소 목록 : Can not
이라는 Java 인터페이스를 준수하십시오Set .
색인으로 액세스

사용하여 구현

  • 해시 세트 (순서 없음)
  • LinkedHashSet (주문)
  • TreeSet (자연 순서 또는 제공된 비교기로 정렬)

두 인터페이스 모두 Java라는 인터페이스 SetList준수합니다.Collection


28

세트는 목록이 할 수있는 동안 중복 요소를 포함 할 수 없습니다. 목록 (Java)도 순서를 의미합니다.


16
  • 목록은 주문 된 항목 그룹입니다.
  • 세트는 중복이 허용되지 않는 항목 (일반적으로)의 순서가없는 그룹화입니다.

개념적으로 우리는 일반적으로 가방으로 복제를 허용하고 복제를 허용하지 않는 순서가없는 그룹화를 참조합니다.


세트는 복제본을 가질 수 없습니다.
karim79 2016 년

일부 집합 구현 (예 : LinkedList를 유지하는 LinkedHashSet)이 순서화됩니다. 그러나 Set ADT에는 주문이 없습니다.
Michael Myers

10

명부

  1. 정렬 된 요소 그룹입니다.
  2. List는 중복 된 요소를 수집하는 데 사용됩니다.
  3. 새로운 메소드는 List 인터페이스 내에 정의되어 있습니다.

세트

  1. 정렬되지 않은 요소 그룹입니다.
  2. 세트는 중복없이 요소를 수집하는 데 사용됩니다.
  3. Set 인터페이스에는 새로운 메소드가 정의되어 있지 않으므로 Set 서브 클래스에서만 Collection 인터페이스 메소드를 사용해야합니다.

10

명부:

List일반적으로 중복 오브젝트를 허용합니다. List주문해야하므로 색인으로 액세스 할 수 있습니다.

구현 클래스에는 다음이 포함됩니다. ArrayList,LinkedList ,Vector

세트:

SetS는 할 수 없습니다중복 오브젝트를 허용 . 대부분의 구현은 순서가 맞지 않지만 구현에 따라 다릅니다.

구현 클래스에는 HashSet(정렬되지 않음), LinkedHashSet(순서대로), TreeSet(자연 순서로 또는 제공된 비교기로 정렬)


7

Java 인터페이스에 대해 이야기하면서 Javadoc을 보지 않겠습니까?!

  • A List는 정렬 된 컬렉션 (시퀀스)이며 일반적으로 복제본을 허용합니다
  • SetA는 중복 요소가없는 콜렉션, 반복 순서는 구현에 의해 보장 될 수있다

세트에 관한 순서 부족에 대해서는 언급이 없습니다. 구현에 따라 다릅니다.


2
옳은. LinkedHashSet에는 삽입 순서로 요소가 포함됩니다.
ggb667

인터페이스는 모든 것이 구현에 달려 있습니다. List.get ()은 pi의 처음 5 자리를 포함하는 파일을 생성하고 일부 구현에서 StackOverFlowException을 발생시킬 수 있습니다. 인터페이스에 의해 정의 된 계약. 문서 클레임 세트는 정의에 따라 순서가 지정되지 않은 수학적 개념의 세트를 모델로합니다. 코드 세트가 주어지면 SOLID 원칙을 위반하지 않고 주문했다고 가정 할 수 없습니다.
sara

@kai, LinkedHashSet코드가 나중에 주문에 의존하는 경우 일반적으로 왼쪽에 유지 합니다. 난 단지 사용 Set정말 하나처럼 사용하는 경우가 기본이되는 구현이 있다고 가정 할 수 없기 때문에, LinkedHashSet또는, 그것은 오늘, 그러나 내일 코드 변경 및 실패합니다 수 있습니다.
Christophe Roussy

LinkedHashSet을 선언하면 Set을 다루지 않으므로 Set의 동작 방식에 대한 주장은 거의 관련이 없습니다. "일부 구현에 기반한 세트에 (가능한) 순서를 부여하는 것은"Runnable의 인스턴스에는 일부 스레드에서 실행되는 실행 방법이 있습니다. 또한 DB 연결을 열고 구현에 따라 고객 데이터를 읽습니다. "라고 말하고 싶습니다. " 물론 일부 구현은 그렇게 할 수 있지만 Runnable Interface가 암시하는 것은 아닙니다.
sara

5

이것은 당신이 찾고있는 대답이 아닐 수도 있지만 컬렉션 클래스의 JavaDoc은 실제로 매우 설명 적입니다. 복사 / 붙여 넣기 :

정렬 된 컬렉션 (시퀀스라고도 함). 이 인터페이스의 사용자는 목록에서 각 요소가 삽입되는 위치를 정확하게 제어 할 수 있습니다. 사용자는 정수 인덱스 (목록의 위치)로 요소에 액세스하고 목록에서 요소를 검색 할 수 있습니다.

집합과 달리 목록은 일반적으로 중복 요소를 허용합니다. 보다 공식적으로,리스트는 일반적으로 e1.equals (e2)와 같이 요소 e1과 e2의 쌍을 허용하며, 널 요소를 전혀 허용하지 않으면 일반적으로 여러 널 요소를 허용합니다. 사용자가 삽입하려고 할 때 런타임 예외를 발생시켜 중복을 금지하는 목록을 구현하려는 사람은 상상할 수 없지만,이 사용법은 드물 것으로 예상됩니다.


5

세트는 정렬되지 않은 개별 객체 그룹으로, 중복 객체는 허용되지 않습니다. 일반적으로 삽입되는 객체의 해시 코드를 사용하여 구현됩니다. (구체적인 구현은 순서를 추가 할 수 있지만 Set 인터페이스 자체는 그렇지 않습니다.)

목록은 중복 된 개체를 포함 할 수있는 정렬 된 개체 그룹입니다. 그것은가 구현 될 수있다 ArrayList, LinkedList


1
혼란 스러워요! 이 문맥에서 주문 / 무 순서 란 무엇을 의미합니까? 오름차순 및 내림차순과 관련이 있습니까? 그렇다면 Listis
malhobayyeb

4
정렬 은 입력 데이터가 사용자가 입력 한대로 정확하게 정렬 되는 경우 이며 정렬 은 입력 데이터가 사전 식으로 또는 오름차순 / 내림차순으로 정렬되는 경우 (정수 값)입니다. 정렬되지 않음은 입력 데이터가 사용자 입력 순서대로 저장되거나 저장 되지 않을 수 있음을 의미합니다.
Akhil

5

리스트 :
리스트는 중복 요소와 널값을 허용합니다. 해당 요소 색인을 사용하여 쉽게 검색 할 수 있으며 삽입 순서대로 요소를 표시합니다. 예 : (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


값 : 1
값 : 555
값 : 333
값 : 888
값 : 555
값 : NULL
값 : NULL

Set :
Set은 중복 요소를 허용하지 않으며 단일 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");
    }

 }

}

산출:

모두
hello
welcome
world
java.lang.NullPointerException
Set은 null 값과 중복 값을 허용하지 않습니다.


3

1. 목록은 중복 값을 허용하고 설정은 중복을 허용하지 않습니다

2. List는 목록에 요소를 삽입 한 순서를 유지합니다. Set은 순서를 유지하지 않습니다. 3. List는 순서가 지정된 요소의 순서이며 Set은 순서가없는 고유 한 요소 목록입니다.


3

목록 대 설정

1) 세트는 복제를 허용하지 않습니다. 목록은 중복을 허용합니다. Set 구현을 기반으로 삽입 순서를 유지 관리합니다.

예 : LinkedHashSet . 게재 신청서를 유지합니다. 여기를 참조 하십시오

2) 방법이 포함되어 있습니다 . 세트의 특성상 액세스 성능이 향상됩니다. 가장 좋은 경우는 o (1)입니다. 그러나 List에는 성능 문제가 contains있습니다.


2

모든 List클래스는 삽입 순서를 유지합니다. 이들은 성능 및 기타 특성 (예 : ArrayList특정 LinkedList순서 의 액세스 속도, 단순히 순서 유지)에 따라 다른 구현을 사용 합니다. 키가 없으므로 중복이 허용됩니다.

Set클래스 삽입 순서를 유지하지 않습니다. 선택적으로 특정 순서를 가할 수 SortedSet있지만 (와 같이 ) 일부 해시 함수를 기반으로 구현 정의 순서를가집니다 (와 HashSet). Set키로 s에 액세스 하므로 중복은 허용되지 않습니다.


맵은 객체를 키별로 저장하지만 객체와 관련된 고유 한 값 (일반적으로 해시 코드)을 사용하여 스토어 객체를 설정합니다. (지도는 키 고유성을 확인하기 위해 해시 코드를 사용할 수도 있지만 반드시 그럴 필요는 없습니다.)
Quinn Taylor

1

주문 ... 목록에는 주문이 있지만 세트에는 없습니다.


2
Set ADT는 순서를 지정하지 않지만 일부 Set 구현 (예 : LinkedHashSet)은 삽입 순서를 유지합니다.
Michael Myers

3
그러나 더 중요한 차이점은 세트가 중복을 허용하지 않는다는 것입니다. 가방 / 멀티 세트.
Quinn Taylor

TreeSet에 순서가 있습니다.
stackoverflowuser2010 년

1

Java에서 List와 Set의 가치있는 차이점은 다음과 같습니다.

1) Java에서 List와 Set의 근본적인 차이점은 중복 요소를 허용한다는 것입니다. Java의 목록은 중복을 허용하지만 설정은 중복을 허용하지 않습니다. Set에 중복을 삽입하면 이전 값이 대체됩니다. Java에서 Set의 모든 구현에는 고유 한 요소 만 포함됩니다.

2) Java에서 List와 Set의 또 다른 중요한 차이점은 순서입니다. List는 Ordered Collection이고 Set은 정렬되지 않은 Collection입니다. 목록은 요소의 삽입 순서를 유지합니다. 이전에 삽입 된 요소는 이후에 삽입 된 요소보다 낮은 색인으로 이동합니다. Java로 설정하면 순서가 유지되지 않습니다. Set은 SortedSet이라는 또 다른 대안을 제공하지만 Set에 저장된 객체의 Comparable 및 Comparator 메서드에 의해 정의 된 특정 정렬 순서로 Set 요소를 저장할 수 있습니다.

3) Java에서 List 인터페이스의 일반적인 구현에는 ArrayList, Vector 및 LinkedList가 포함됩니다. Set 인터페이스의 일반적인 구현에는 HashSet, TreeSet 및 LinkedHashSet이 포함됩니다.

삽입 순서 또는 객체를 유지 관리해야하고 컬렉션보다 중복이 포함될 수있는 경우 목록 방법이 좋습니다. 반면에 요구 사항이 Set보다 중복되지 않고 고유 한 컬렉션을 유지 해야하는 경우 Set이 갈 길입니다.


안녕하세요 @ Vibha, 두 조건을 모두 원한다면? 내 데이터에 중복이 포함되지 않도록하고 주문하기를 원합니다.
Panadol Chong

1

명부:

  1. 중복 허용.
  2. 그룹화 요소로 정렬 됨 (즉, 명확한 순서를 가짐. 오름차순으로 정렬 할 필요가 없음)

세트:

  1. 중복은 허용되지 않습니다.
  2. 그룹화 요소에서 정렬되지 않음 (즉, 명확한 순서가 없음. 오름차순으로 정렬되거나 정렬되지 않을 수 있음)

0

Set<E>그리고 List<E>두 종류의 요소를 저장하는데 사용된다 E. 차이점은 Set순서가없는 방식으로 저장되며 중복 값을 허용하지 않는다는 것입니다. List요소를 순서대로 저장하는 데 사용되며 중복 값을 허용합니다.

Set인덱스 위치로 List요소에 액세스 할 수 없으며 인덱스 위치로 요소에 액세스 할 수 있습니다.


1
@BalusC 게시 날짜를 보지 않고 의견을 말하지 마십시오. 당시 가치있는 게시물을 참조하십시오.
Yash

0

안녕하세요 너무 많은 답변이 이미 제공되어 있습니다 .. 지금까지 언급되지 않은 몇 가지 사항을 알려 드리겠습니다.

  • 대부분의 List 구현 (ArrayList, Vector) 구현RandomAccess 은 빠른 액세스를위한 마커 인터페이스 인 인터페이스를 합니다. Set 구현 중 어느 것도 그렇게하지 않습니다.
  • List는 양방향에서 반복을 지원 하는 하나의 특수 반복자를 사용 ListIterator 합니다. . Set은 단방향 반복 만 지원하는 Iterator를 사용합니다.
  • HashSet은 동일한 수의 요소를 저장하기 위해 ArrayList보다 5.5 배 더 많은 메모리 를 사용합니다.

@ smurti 이것은 조금 늦었고, 당신이 언급했는지 여부는 확실하지 않지만, 첫 번째 요점은 "대부분의 List 구현 (ArrayList, Vector)은 RandomAccess를 구현합니다 ..."와 "... 구현은 그렇게한다 "
Peter M

0

가장 큰 차이점은 기본 개념입니다.

로부터 설정목록 인터페이스를 제공합니다. 세트 는 수학 개념입니다. Set 메소드는 collection을 확장하지만 새로운 메소드를 추가하지는 않습니다. size ()는 카디널리티를 의미합니다 (더 자세한 내용은 BitSet.cardinality, Linear counter, Log Log, HyperLogLog입니다 ). addAll ()은 공용체를 의미합니다. retainAll ()은 교차점을 의미합니다. removeAll ()은 차이를 의미합니다.

그러나 이러한 개념의 부족을 나열하십시오 . ListCollection 인터페이스가 제공하지 않는 시퀀스 개념을 지원하는 많은 방법을 추가합니다 . 핵심 개념은 INDEX 입니다. add (index, element), get (index), search (indexOf ()), remove (index) 요소와 같습니다. 리스트는 또한 " 컬렉션 뷰 " 하위 리스트를 제공합니다 . 보기가 없습니다로 설정 합니다. 위치 접근 권한이 없습니다. ListCollections 클래스 에서 많은 알고리즘을 제공합니다 . 정렬 (목록), 이진 검색 (목록), 역방향 (목록), 셔플 (목록), 채우기 (목록). 메소드 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

-1

SET과 같은 대답은 중복 값이 ​​없으며 List는 할 수 있습니다. 물론 질서가 다른 점이 있습니다.


-1

집합 : 집합에는 컬렉션에 중복 요소가있을 수 없습니다. 정렬되지 않은 컬렉션이기도합니다. Set에서 데이터에 액세스하려면 Iterator 만 사용해야하며 인덱스 기반 검색은 불가능합니다. 고유성 수집이 필요할 때마다 주로 사용됩니다.

목록 : 목록은 삽입 된대로 자연 순서대로 중복 요소를 가질 수 있습니다. 따라서 인덱스 또는 반복자를 기반으로 데이터를 검색 할 수 있습니다. 인덱스를 기반으로 액세스해야하는 컬렉션을 저장하는 데 널리 사용됩니다.


-2

주제 이름 : List VS Set

Collections Framework라는 Java의 가장 중요한 주제를 살펴 보았습니다. 컬렉션에 대한 나의 작은 지식을 당신과 공유하려고 생각했습니다. 목록, 설정,지도가 가장 중요한 주제입니다. 이제 List and Set부터 시작하겠습니다.

리스트와 세트의 차이점 :

  1. List는 클래스를 확장하는 컬렉션 클래스이며, AbstractList여기서 Set은 클래스를 확장 AbstractSet하지만 Collection 인터페이스를 구현 하는 컬렉션 클래스입니다 .

  2. List 인터페이스는 중복 값 (요소)을 허용하지만 Set 인터페이스는 중복 값을 허용하지 않습니다. Set에 중복 요소가있는 경우 이전 값을 대체합니다.

  3. List 인터페이스는 Set 인터페이스가 Null 값을 허용하지 않는 경우 NULL 값을 허용합니다. Set에서 Null 값을 사용하는 경우 제공합니다 NullPointerException.

  4. 리스트 인터페이스는 삽입 순서를 유지합니다. 이는 반복자 또는 각 스타일을 사용하여 얻는 것과 같은 방식으로 List에 요소를 추가하는 방식을 의미합니다. 반면 Set구현 반드시 삽입 순서를 유지하지 않습니다. (비록 SortedSet사용하여 수행 TreeSet하고, LinkedHashSet신청서를 유지한다).

  5. List 인터페이스에는 자체 메서드가 정의되어 있지만 Set 인터페이스에는 자체 메서드가 없으므로 Set 인터페이스 메서드 만 사용합니다.

  6. List 인터페이스에는 레거시 클래스가 하나 Vector있지만 Set 인터페이스에는 레거시 클래스가 없습니다.

  7. 마지막은 아니지만 ... listIterator()메소드는 List Classes 내의 요소를 순환하는 데만 사용할 수 있지만 iterator () 메소드를 사용하여 Set 클래스 요소에 액세스 할 수 있습니다

다른 것을 더할 수 있습니까? 알려주세요.

감사.


하나를 들어, ListSet도 (당신이 언급 한) 추상 클래스의 형태로 "기본"구현을 인터페이스입니다. 또한 대부분의 세트가 null 값을 허용하지만 구현에 따라 다르 므로 # 3은 완전히 정확하지 않습니다 . # 5와 # 7을 이해하지 못하고 # 6의 Vector경우 레거시가 아니지만 동기화가 필요한 경우를 제외하고는 동기화되어 사용하기에 적합하지 않습니다.
glen3b

-3

세트:

중복 값을 가질 수 없음 순서는 구현에 따라 다릅니다. 기본적으로 주문되지 않음 인덱스로 액세스 할 수 없습니다

명부:

중복 값을 가질 수 있음 기본적으로 주문 됨 색인별로 액세스 할 수 있음

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.