HashSet과 HashMap의 차이점은 무엇입니까?


168

HashSet중복 값을 허용하지 않는다는 사실 외에도 HashMapHashSet? 의 차이점은 무엇 입니까?

나는 현명한 구현을 의미합니까? 둘 다 해시 테이블 을 사용 하여 값을 저장 하기 때문에 약간 모호 합니다.


HashSet의는 HashMap에 사용하여 구현
therealprashant

: HashSet의 당신이 당신의 위 질문에 대한 답 이해하는 데 도움이 될 것입니다 ArrayList에 다른 이유를 나는 알고 생각 stackoverflow.com/questions/18706870/...
djangofan

답변:


150

그것들은 완전히 다른 구성입니다. 의 HashMap구현입니다 Map. 지도 키를 값에 매핑합니다. 키 조회는 해시를 사용하여 발생합니다.

반면에 a HashSet는의 구현입니다 Set. 설정은 집합의 수학적 모델에 맞게 설계되었습니다. 언급했듯이 A HashSetHashMap구현을 지원하기 위해 a 를 사용합니다 . 그러나 완전히 다른 인터페이스를 구현합니다.

Collection자신의 목적에 가장 적합한 것이 무엇인지 찾고 있다면 이 자습서 는 좋은 출발점입니다. 실제로 무슨 일이 일어나고 있는지 알고 싶다면 그 책 도 있습니다.


그 말은 약간 단순합니다. ""지정된 개체에 대한 해시 값을 반환합니다. 객체 자체의 hashCode 외에도이 메소드는 "보완 해시 함수"를 적용하여 품질이 낮은 해시 함수를 방지합니다. HashMap의 두 길이 해시 테이블 전원으로 사용하기 때문에 매우 중요하다 ". weblogs.java.net/blog/2005/06/18/hashmap-implementation - 당신이 문서를 보면하지만,이 해시 물건을 배포하는 것을 볼 수 있습니다 "버킷"이상으로, 결국 두 가지가 동일한 버킷에 매핑 될 수 있다고 생각합니다.
justkt

1
두 번째 질문에 대답하려면 @Bruno Rothgiesser의 탁월한 답변에 정의 된대로 원하는 경우 (키-> 값) 맵입니다. 중복되지 않은 요소에 대한 집합입니다. 키-> 값이 아닌 중복을 원한다면 java.util.List 구현을 확인하십시오. 확실한 안내서는 Collection 자습서를 참조하십시오. java.sun.com/docs/books/tutorial/collections/index.html
justkt

@ justk : 예, 하나의 버킷에 두 개의 키를 얻을 수 있으며 equals ()를 사용하여 키를 구별합니다. 따라서 hashCode () 및 equals ()가 호환되어야합니다.
Michael Borgwardt

6
@SpikETidE : HashMap 또는 HashSet 모두 중복을 허용하지 않습니다. 그게 요점입니다.
Michael Borgwardt

23
@SpikETidE : 세트에는 키 / 값 쌍이없고 요소 만 있습니다. 그리고 HashSet은 설정된 요소를 키로하고 값을 무시하는 HashMap을 사용하여 구현됩니다.
Michael Borgwardt

300

HashSet은 집합입니다 (예 : {1,2,3,4,5}).

HashMap은 키-> 값 (키 대 값) 맵입니다 (예 : {a-> 1, b-> 2, c-> 2, d-> 1}).

위의 예제에서 HashMap에는 중복 키가 없어야하지만 중복 값이있을 수 있습니다.

HashSet에는 중복 요소가 없어야합니다.


그러나 혼란의 가장 흥미로운 이유는 HashSet에서도 요소에 액세스하기 위해 "키"가 필요하기 때문입니다. 즉, 수학에서도 객체에 액세스하거나 참조 할 경우 이름 (또는 주소)이 있습니다. 따라서 이러한 의미에서 HashSet은 요소의 이름 (또는 주소)으로 키가 지정된 특히 간단한 HashMap입니다.
Andrew Marshall

65

해시 세트

  1. HashSet 클래스는 Set 인터페이스를 구현합니다.
  2. HashSet에는 객체 (요소 또는 값)를 저장합니다. 예를 들어 문자열 요소의 HashSet이있는 경우 HashSet 요소 집합을 나타낼 수 있습니다. {“Hello”,“Hi”,“Bye”,“Run”}
  3. HashSet은 중복 요소를 허용하지 않으므로 HashSet에 중복 값을 저장할 수 없습니다.
  4. HashSet은 단일 null 값을 가질 수 있습니다.
  5. HashSet이 동기화되지 않았으므로 명시 적으로 동기화하지 않는 한 스레드 안전 작업에 적합하지 않습니다. [유사]

                          add      contains next     notes
    HashSet               O(1)     O(1)     O(h/n)   h is the table 

해시 맵

  1. HashMap 클래스는 Map 인터페이스를 구현합니다.
  2. HashMap은 키 및 값 쌍을 저장하는 데 사용됩니다. 즉, 키와 값의 매핑을 유지 관리합니다 (HashMap 클래스는 동기화되지 않고 null을 허용한다는 점을 제외하고는 Hashtable과 거의 동일합니다). 예 : {1->”Hello”, 2->”Hi”, 3->”Bye”, 4->”Run”}
  3. HashMap은 중복 키를 허용하지 않지만 중복 값을 가질 수 있습니다.
  4. HashMap은 단일 널 키와 임의의 수의 널 값을 허용합니다.
  5. HashMap이 동기화되지 않았으므로 명시 적으로 동기화하지 않는 한 스레드 안전 작업에 적합하지 않습니다. [유사]

                           get      containsKey next     Notes
     HashMap               O(1)     O(1)        O(h/n)   h is the table 

자세한 내용은 이 기사 를 참조하십시오 .


36

두 이름이 모두 Hash로 시작한다는 것은 정말 부끄러운 일입니다 . 그것은 그들 중 가장 중요한 부분입니다. 중요한 부분은 다른 사람들이 지적했듯이 해시 - 집합지도 뒤에옵니다 . 그것들 각각 은 순서가없는 컬렉션 인 세트 이있는 액세스가 가능한 컬렉션 인 세트입니다. 그것들은 이름에서 유래 한 해시로 구현되지만 그들의 본질은 이름의 그 부분 뒤에 숨겨져 있습니다.

그들의 이름으로 혼동하지 마십시오. 그들은 매우 다른 것들입니다.


@HiteshSahu 둘 다 해시 테이블 ( en.wikipedia.org/wiki/Hash_table )로 구현됩니다 . 이것은 올바른 방법으로 효율적인 세트를 표현하기에 좋은 데이터 구조이며, 기본적으로 HashMap의 키는 HashSet으로 구현됩니다. 그래서 그들을 지명 한 사람은 구현하기 위해 어려움을 겪었고 목적보다는 구현에 중점을 두었습니다 (추측).
Carl Manaster

1
잘 설명했다. 감사합니다.
user3932000

5

Hashset내부적으로 구현 HashMap. 내부 구현을 보면 HashSet에 삽입 된 값은 HashMap에 키로 저장되며 값은 Object 클래스의 Dummy 객체입니다.
HashMap과 HashSet의 차이점은 다음과 같습니다.

  1. HashMap 키 값 쌍을 포함하며 get 메소드가 없으므로 매번 HashSet을 반복해야하므로 키로 각 ​​값에 액세스 할 수 있습니다.
  2. HashMapMap 인터페이스를 구현하고 하나의 null 값을 키로 허용하고 여러 null 값을 값으로 허용합니다 .Set HashSet인터페이스 를 구현하는 경우 하나의 null 값만 허용하고 중복 된 값은 허용하지 않습니다. HashSet은 HashMap을 내부적으로 구현합니다.
  3. HashSet그리고 HashMap반복하면서 삽입의 순서를 유지하지 않습니다.

3

HashSet을 사용하면 HashMap을 사용하여 키와 값을 기준으로 객체를 저장할 수있는 세트에 객체를 저장할 수 있습니다. 모든 객체 또는 저장된 객체에는 키가 있습니다.


2

이름에서 알 수 있듯이 HashMap 은 연관 (키에서 값으로 매핑)이며 HashSetSet 입니다.


2
@SpikETidE 고유성이 구현되는 방법에 대한 세부 사항이지만 HashSet의 의미는 세트를 구현하는 것입니다.
Michael Borgwardt

1
그래서 .. "중복을 원하지 않으면 hashSet을 사용하십시오. 중복에 대해 신경 쓰지 않으면 HashMap을 사용하십시오"....?
SpikETidE

3
Java는 "잠재적으로 중복 된 요소가있는 콜렉션"( "가방")에 대한 특정 클래스를 구현하지 않으므로이를 위해 List를 사용할 수 있습니다 (목록은 가방에 의미를 추가하지만 순서는 무시하지만 무시할 수는 있음).
leonbloy

2

Java에서 HashSet과 HashMap의 차이점

1) HashMap과 HashSet의 가장 중요한 차이점은 HashMap은 Map 인터페이스의 구현이고 HashSet은 Set 인터페이스의 구현입니다. 즉, HashMap은 주요 값 기반 데이터 구조이며 HashSet은 중복을 허용하지 않음으로써 고유성을 보장합니다. 현실 HashSet은 Java에서 HashMap을 감싸는 래퍼입니다. HashSet.java의 add (E e) 메소드 코드를 보면 다음 코드가 표시됩니다.

public boolean add(E e) 
{
    return map.put(e, PRESENT)==null;
}

여기서 오브젝트를 키와 값으로 맵에 넣는 것은 더미 인 최종 오브젝트 PRESENT입니다.

2) HashMap과 HashSet의 두 번째 차이점은 add () 메서드를 사용하여 요소를 Set에 넣지 만 put () 메서드를 사용하여 키와 값을 Java의 HashMap에 삽입한다는 것입니다.

3) HashSet은 하나의 null 키만 허용하지만 HashMap은 하나의 null 키 + 다중 null 값을 허용 할 수 있습니다.

그것은 자바에서 HashSet과 HashMap의 차이점에 있습니다. 요약하자면, HashSet과 HashMap은 하나는 Set이고 다른 하나는 Map입니다.


2

Java에서 HashSet과 HashMap의 차이점

HashSet은 내부적으로 HashMap을 사용하여 객체를 저장합니다. add (String) 메소드가 호출되면 HahsMap put (key, value) 메소드를 호출합니다. 여기서 key = String object & value = new Object (Dummy)입니다. 목적.

Hashset / HashMap에서 키로 저장된 객체는 해시 코드를 무시하고 계약과 동일해야합니다.

HashMap에서 값 개체에 액세스 / 저장하는 데 사용되는 키는 수정 될 때 Value 개체를 찾을 수없고 null을 반환하므로 Final로 선언해야합니다.


1

A HashMap는 모든 유형의 사용자 정의 키로 인덱싱 된 객체를 추가, 가져 오기, 제거하는 것입니다.
A HashSet는 요소를 추가하고, 요소를 제거하고, 해시를 비교하여 요소가 있는지 확인하는 것입니다.

따라서 HashMap에는 요소가 포함되며 HashSet은 해시를 기억합니다.


1
해시를 비교하고 equals()메소드를 호출 합니다.
Lorne의 후작

1

차이점 : 계층 구조와 관련하여 : HashSet은 Set을 구현합니다. HashMap은 Map을 구현하고 키와 값의 매핑을 저장합니다.

데이터베이스와 관련하여 HashSet 및 HashMap을 사용하면 각각의 중요성을 이해하는 데 도움이됩니다.
HashSet : 일반적으로 고유 한 컬렉션 개체를 저장하는 데 사용됩니다. 예 :
(Item이 많은 입찰 을 가짐 ) HashMap : 키를 값에 매핑하는 데 사용됩니다. 값이 null이거나 모든 Object 일 수 있습니다. / 객체의 목록입니다 (자체 자체입니다).



0

HashSet은 HashMap을 내부적으로 사용하여 항목을 저장합니다. 내부 HashMap의 각 항목에는 단일 Object가 지정되므로 모든 항목이 동일한 버킷으로 해시됩니다. 내부 HashMap이 값을 저장하는 데 사용하는 것을 기억하지는 않지만 내부 컨테이너에 중복 값이 ​​포함되지 않으므로 실제로 중요하지 않습니다.

편집 : 매튜의 의견을 해결하기 위해 그는 맞습니다. 나는 그것을 뒤로했다. 내부 HashMap 에는 Set 요소를 구성하는 Object가 있습니다 . HashMap의 값은 단순히 HashMap 버킷에 저장되는 객체입니다.


그건 맞지 않습니다. 설정된 요소는 HashMap 키로 직접 사용됩니다.
Matthew Flaschen

0

HashMapA는 Map, 구현 수 있도록 중복 값중복되지 키를. . 객체를 추가하려면 키 / 값 쌍이 필요합니다. 널 키와 널 값이 허용됩니다. 예 :

{The-> 3, world-> 5, is-> 2, nice-> 4}

HashSetA는 Set않습니다 구현, 중복을 허용하지 중복 된 객체에 대한 호출 추가하려고 .If public boolean add(Object o)방법은, 다음 세트가 변경되지 않고 반환 남아있다 false. 예 :

[세계는 훌륭하다]


-1

당신은 자신의 질문에 거의 대답했습니다. 해시 세트는 중복 값을 허용하지 않습니다. 백업 해시 맵을 사용하여 해시 셋을 작성하는 것은 쉽지 않습니다 (그리고 값이 이미 존재하는지 확인하기 만하면됩니다). 다양한 Java 구현이 그렇게하거나 더 효율적으로 수행하기 위해 사용자 정의 코드를 구현한다고 생각합니다.


1
@oedo- java.util.HashSet이 지원합니다 java.util.HashMap.
justkt

2
중복을 허용하지 않는 것은 차이점이 아닙니다.
Lorne의 후작

-1

기본적으로 HashMap에서는 사용자가 Key와 Value를 모두 제공해야하지만 HashSet에서는 Value 만 제공하면 해시 함수를 사용하여 Key가 Value에서 자동으로 파생됩니다. 따라서 Key와 Value를 모두 가지고 나면 HashSet을 내부적으로 HashMap으로 저장할 수 있습니다.


HashSet의 값입니다.
Lorne의 후작

-1

HashSet과 HashMap은 쌍을 저장합니다. 차이점은 HashMap에서는 키를 지정할 수 있지만 HashSet에서는 키가 객체의 해시 코드에서 오는 것입니다


그것이 사실이라면, HashSet은 동일한 hashCode를 가진 여러 객체를 저장할 수 없었습니다.
Lorne의 후작

-1

HashMaps하나의 널 키와 널 값을 허용하십시오. 동기화되지 않아 효율성이 향상됩니다. 필요한 경우 다음을 사용하여 동기화 할 수 있습니다.Collections.SynchronizedMap()

Hashtables null 키를 허용하지 않으며 동기화됩니다.


그는 Hashtables와 접촉하지 않았다. 질문에 대답하지 않습니다.
Lorne의 후작

-2

HashMap은 Map 인터페이스의 구현입니다. HashSet은 Set Interface의 구현입니다.

HashMap 키 값 쌍의 형태로 데이터를 저장합니다. HashSet 객체 만 저장

Put 메소드는 맵에 요소를 추가하는 데 사용됩니다. Add 메소드는 요소를 추가하는 데 사용됩니다.

해시 맵에서 해시 코드 값은 키 객체를 사용하여 계산됩니다. 여기서 멤버 객체는 두 객체에 대해 동일 할 수있는 해시 코드 값을 계산하는 데 사용되므로 equal () 메서드는 false를 반환하면 동등성을 확인하는 데 사용되므로 두 객체가 다릅니다.

고유 키를 사용하여 개체에 액세스하는 데 HashMap이 더 빠릅니다.


1
본질적으로 동일한 성능을 가지며 '고유 키를 사용하기 때문에'이 올바르지 않습니다.
Lorne의 후작
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.