Set<E>
와 List<E>
인터페이스 의 근본적인 차이점은 무엇입니까 ?
Set<E>
와 List<E>
인터페이스 의 근본적인 차이점은 무엇입니까 ?
답변:
List
순서가 지정된 요소의 순서이지만 Set
정렬되지 않은 요소의 고유 목록입니다 (감사합니다, Quinn Taylor ).
정렬 된 컬렉션 (시퀀스라고도 함). 이 인터페이스의 사용자는 목록에서 각 요소가 삽입되는 위치를 정확하게 제어 할 수 있습니다. 사용자는 정수 인덱스 (목록의 위치)로 요소에 액세스하고 목록에서 요소를 검색 할 수 있습니다.
중복 요소가없는 컬렉션입니다. 보다 공식적으로, 세트에는 e1.equals (e2)와 같은 한 쌍의 요소 e1과 e2가없고 최대 하나의 null 요소가 포함됩니다. 이름에서 알 수 있듯이이 인터페이스는 수학 집합 추상화를 모델링합니다.
╔═══════════════════╦══════════════════════╦═════════════════════════════╗
║ ║ List ║ Set ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Duplicates ║ YES ║ NO ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Order ║ ORDERED ║ DEPENDS ON IMPLEMENTATION ║
╠═══════════════════╬══════════════════════╬═════════════════════════════╣
║ Positional Access ║ YES ║ NO ║
╚═══════════════════╩══════════════════════╩═════════════════════════════╝
(독특한 여부) 요소의 정렬 된 목록
라는 이름의 자바의 인터페이스에 적합List
색인으로 액세스 가능
사용하여 구현
고유 한 요소 목록 :
Can not
이라는 Java 인터페이스를 준수하십시오Set
.
색인으로 액세스
사용하여 구현
두 인터페이스 모두 Java라는 인터페이스 Set
를 List
준수합니다.Collection
개념적으로 우리는 일반적으로 가방으로 복제를 허용하고 복제를 허용하지 않는 순서가없는 그룹화를 참조합니다.
명부
세트
Java 인터페이스에 대해 이야기하면서 Javadoc을 보지 않겠습니까?!
List
는 정렬 된 컬렉션 (시퀀스)이며 일반적으로 복제본을 허용합니다Set
A는 중복 요소가없는 콜렉션, 반복 순서는 구현에 의해 보장 될 수있다세트에 관한 순서 부족에 대해서는 언급이 없습니다. 구현에 따라 다릅니다.
LinkedHashSet
코드가 나중에 주문에 의존하는 경우 일반적으로 왼쪽에 유지 합니다. 난 단지 사용 Set
정말 하나처럼 사용하는 경우가 기본이되는 구현이 있다고 가정 할 수 없기 때문에, LinkedHashSet
또는, 그것은 오늘, 그러나 내일 코드 변경 및 실패합니다 수 있습니다.
이것은 당신이 찾고있는 대답이 아닐 수도 있지만 컬렉션 클래스의 JavaDoc은 실제로 매우 설명 적입니다. 복사 / 붙여 넣기 :
정렬 된 컬렉션 (시퀀스라고도 함). 이 인터페이스의 사용자는 목록에서 각 요소가 삽입되는 위치를 정확하게 제어 할 수 있습니다. 사용자는 정수 인덱스 (목록의 위치)로 요소에 액세스하고 목록에서 요소를 검색 할 수 있습니다.
집합과 달리 목록은 일반적으로 중복 요소를 허용합니다. 보다 공식적으로,리스트는 일반적으로 e1.equals (e2)와 같이 요소 e1과 e2의 쌍을 허용하며, 널 요소를 전혀 허용하지 않으면 일반적으로 여러 널 요소를 허용합니다. 사용자가 삽입하려고 할 때 런타임 예외를 발생시켜 중복을 금지하는 목록을 구현하려는 사람은 상상할 수 없지만,이 사용법은 드물 것으로 예상됩니다.
세트는 정렬되지 않은 개별 객체 그룹으로, 중복 객체는 허용되지 않습니다. 일반적으로 삽입되는 객체의 해시 코드를 사용하여 구현됩니다. (구체적인 구현은 순서를 추가 할 수 있지만 Set 인터페이스 자체는 그렇지 않습니다.)
목록은 중복 된 개체를 포함 할 수있는 정렬 된 개체 그룹입니다. 그것은가 구현 될 수있다 ArrayList
, LinkedList
등
List
is
리스트 :
리스트는 중복 요소와 널값을 허용합니다. 해당 요소 색인을 사용하여 쉽게 검색 할 수 있으며 삽입 순서대로 요소를 표시합니다. 예 : (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 값과 중복 값을 허용하지 않습니다.
모든 List
클래스는 삽입 순서를 유지합니다. 이들은 성능 및 기타 특성 (예 : ArrayList
특정 LinkedList
순서 의 액세스 속도, 단순히 순서 유지)에 따라 다른 구현을 사용 합니다. 키가 없으므로 중복이 허용됩니다.
Set
클래스 삽입 순서를 유지하지 않습니다. 선택적으로 특정 순서를 가할 수 SortedSet
있지만 (와 같이 ) 일부 해시 함수를 기반으로 구현 정의 순서를가집니다 (와 HashSet
). Set
키로 s에 액세스 하므로 중복은 허용되지 않습니다.
주문 ... 목록에는 주문이 있지만 세트에는 없습니다.
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이 갈 길입니다.
안녕하세요 너무 많은 답변이 이미 제공되어 있습니다 .. 지금까지 언급되지 않은 몇 가지 사항을 알려 드리겠습니다.
RandomAccess
은 빠른 액세스를위한 마커 인터페이스 인 인터페이스를 합니다. Set 구현 중 어느 것도 그렇게하지 않습니다.ListIterator
합니다. . Set은 단방향 반복 만 지원하는 Iterator를 사용합니다.가장 큰 차이점은 기본 개념입니다.
로부터 설정 및 목록 인터페이스를 제공합니다. 세트 는 수학 개념입니다. Set 메소드는 collection을 확장하지만 새로운 메소드를 추가하지는 않습니다. size ()는 카디널리티를 의미합니다 (더 자세한 내용은 BitSet.cardinality, Linear counter, Log Log, HyperLogLog입니다 ). addAll ()은 공용체를 의미합니다. retainAll ()은 교차점을 의미합니다. removeAll ()은 차이를 의미합니다.
그러나 이러한 개념의 부족을 나열하십시오 . List 는 Collection 인터페이스가 제공하지 않는 시퀀스 개념을 지원하는 많은 방법을 추가합니다 . 핵심 개념은 INDEX 입니다. add (index, element), get (index), search (indexOf ()), remove (index) 요소와 같습니다. 리스트는 또한 " 컬렉션 뷰 " 하위 리스트를 제공합니다 . 보기가 없습니다로 설정 합니다. 위치 접근 권한이 없습니다. List 는 Collections 클래스 에서 많은 알고리즘을 제공합니다 . 정렬 (목록), 이진 검색 (목록), 역방향 (목록), 셔플 (목록), 채우기 (목록). 메소드 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]
차이점은 다음과 같습니다.
주제 이름 : List VS Set
Collections Framework라는 Java의 가장 중요한 주제를 살펴 보았습니다. 컬렉션에 대한 나의 작은 지식을 당신과 공유하려고 생각했습니다. 목록, 설정,지도가 가장 중요한 주제입니다. 이제 List and Set부터 시작하겠습니다.
리스트와 세트의 차이점 :
List는 클래스를 확장하는 컬렉션 클래스이며, AbstractList
여기서 Set은 클래스를 확장 AbstractSet
하지만 Collection 인터페이스를 구현 하는 컬렉션 클래스입니다 .
List 인터페이스는 중복 값 (요소)을 허용하지만 Set 인터페이스는 중복 값을 허용하지 않습니다. Set에 중복 요소가있는 경우 이전 값을 대체합니다.
List 인터페이스는 Set 인터페이스가 Null 값을 허용하지 않는 경우 NULL 값을 허용합니다. Set에서 Null 값을 사용하는 경우 제공합니다 NullPointerException
.
리스트 인터페이스는 삽입 순서를 유지합니다. 이는 반복자 또는 각 스타일을 사용하여 얻는 것과 같은 방식으로 List에 요소를 추가하는 방식을 의미합니다. 반면 Set
구현 반드시 삽입 순서를 유지하지 않습니다. (비록 SortedSet
사용하여 수행 TreeSet
하고, LinkedHashSet
신청서를 유지한다).
List 인터페이스에는 자체 메서드가 정의되어 있지만 Set 인터페이스에는 자체 메서드가 없으므로 Set 인터페이스 메서드 만 사용합니다.
List 인터페이스에는 레거시 클래스가 하나 Vector
있지만 Set 인터페이스에는 레거시 클래스가 없습니다.
마지막은 아니지만 ... listIterator()
메소드는 List Classes 내의 요소를 순환하는 데만 사용할 수 있지만 iterator () 메소드를 사용하여 Set 클래스 요소에 액세스 할 수 있습니다
다른 것을 더할 수 있습니까? 알려주세요.
감사.
List
및 Set
도 (당신이 언급 한) 추상 클래스의 형태로 "기본"구현을 인터페이스입니다. 또한 대부분의 세트가 null 값을 허용하지만 구현에 따라 다르 므로 # 3은 완전히 정확하지 않습니다 . # 5와 # 7을 이해하지 못하고 # 6의 Vector
경우 레거시가 아니지만 동기화가 필요한 경우를 제외하고는 동기화되어 사용하기에 적합하지 않습니다.
세트:
중복 값을 가질 수 없음 순서는 구현에 따라 다릅니다. 기본적으로 주문되지 않음 인덱스로 액세스 할 수 없습니다
명부:
중복 값을 가질 수 있음 기본적으로 주문 됨 색인별로 액세스 할 수 있음