2012-02-23 3 views
0

문자열이 HashSet에 저장되어 있는지 확인하기 위해 .contains를 사용하는 데 문제가 있습니다.HashSet <String> .contains()

import java.util.HashSet; 

public class Controller 
{ 
    private Queue<String> queue; 
    private HashSet<String> blocked; 

    public Controller() 
    { 
     queue = new Queue<String>(); 
     blocked = new HashSet<String>(); 
    } 

    public void add(String item) 
    {   
     if (!(blocked.contains(item))) queue.add(item); 
    } 
} 

나는 .equals 메서드를 재정의해야한다는 것을 살펴 봤습니다. 이것은 HashSet을 확장 한 새로운 클래스를 만들고 'HashSet blocked'대신에 새로운 클래스의 인스턴스를 선언해야한다는 것을 의미합니까?

두 문자열을 비교하는 데 단순히 ==를 사용하는 것이 효과가없는 이유를 알고 있지만 아래 코드가 경우에 따라 모두 작동하는 것 같기 때문에 혼란 스럽습니다.

모든 조언을 주시면 감사하겠습니다.

감사

+3

해당 코드가 작동해야합니다. 'String'은'equals()'와'hashCode()'를 오버라이드 (override)합니다. – SLaks

+1

어떤 경우 작동하지 않습니까? 대소 문자를 구분하십시오. – NightWolf

+1

내가 오해 할 것을 두려워합니다. 'HashSet'에서 객체를 사용한다면, 그 객체는'hashCode'와'equals' 메쏘드를 가져야합니다.'HashSet' 자체가 아닙니다. 'String'은 자신의'equals'와'hashCode' 메소드를 가지고 있기 때문에, 여러분이 할 일이 없어야합니다. 그 코드가 무엇을 기대하고 "작동하지 않는"이유가 무엇입니까? – Jeffrey

답변

2

당신은 equals 방법을 재정의해야하지 않음 - String 이미 CPU 사이클의 관점에서 서로 다른 해시 버킷에 다른 문자열을 분배의 측면에서 효율적이다 hashCode/equals의 아주 좋은 쌍을.

hashCode/equals 방법의 한 쌍의 용기의 정확한 작업 가능하게하기 위해 해시 세트에 배치 된 상품 필요 : hashCode 오브젝트가 배치 된 해시 "버킷"의 판단을하고 equals 비 사이의 충돌을 해결 동일한 해시 코드를 가진 동일 객체

위키 백과의 해시 테이블에 article 그림이 있습니다. hashCode/equals 개념에 대한 이해를 높이기 위해이 문서를 읽으면서 Java를 비롯한 모든 언어로 정렬되지 않은 연관 컨테이너를 사용하는 것이 기본입니다.

+0

빠른 응답을 보내 주셔서 감사합니다. 나는 그것이 '블록'HashSet에있는 문자열이 여전히 큐에 추가되는 것처럼 작동하지 않는다고 말한다. 확인을 위해 콘솔에 인쇄를 시도했는데 확실히 발생했습니다. 그것은 분명히 사건과 관련이 없습니다. 콘솔에 인쇄 할 때 볼 수없는 문자가 문자열 내에 포함되어있을 수 있습니까? – stasis

+0

@stasis 콘솔에 인쇄 할 때 단어 주위에 "작은 따옴표"또는 대괄호 같은 "보호 문자"를 추가하는 것을 고려하십시오. 이렇게하면 한 단어에 후행 공백이 있는지, 다른 단어에는 공백이 있는지 확인할 수 있습니다. 나는 당신의 코드가 다중 쓰레드가 아니라고 가정한다. – dasblinkenlight

+0

링크를 제공해 주셔서 감사합니다. 나는 둘러보기를 사용하여 equals 메서드를 재정의해야한다고 결론을 내렸고 비슷한 문제가 될 것이라고 생각했습니다. 사실을 만들어서 .equals를 만들기 위해 오버 라이드 할 필요가 없다는 사실을 생각해 보면, 왜이 경우에는 .contains가 작동하지 않을 것이라고 생각하십니까? 다시 도움을 주셔서 감사합니다. – stasis