2014-12-01 1 views
0

디버깅하는 동안 이상한 동작이 발견되었습니다.Java HashMap에 디버그보기에 Null 값이 포함 된 이유

:

enter image description here

내가이 얻을의 HashMap의 테이블 속성을 클릭하면 :

은 내가이 HashMap<Integer, Set<Term>> (기간은 문자열을 포함하는 클래스) 정상 toString()이 보여주고 있어요

enter image description here

내 질문 이제 테이블에 null 값이 있습니까? toString()?

편집 : 빠른 답변 주셔서 감사합니다. 만약 내가 할 수 있다면, 나는 그들 모두를 받아 들일 것이다. ...

+0

그 라인을 건너 뛰고 디버거를 다음 라인으로 향하게하고 실제로 HashMap –

답변

2

HashMap은 일정 시간 O (1) 조회가 중요한 기능인지도 구현입니다.

일정 시간 조회가있는 컴퓨터 과학의 유일한 데이터 구조는 고정 된 길이의 배열입니다. HashMap을 초기화하면 고정 길이 배열이 생성되어 항목이 현재 배열 크기를 초과 할 때 확장됩니다.

편집 : @kutschkem은 항목 수가 현재 배열의 크기를 초과하지 않고, 항목 수가 현재 배열의 크기의 약 80 % 인 경우 java.util.HashMap이 고정 길이 배열을 확장한다고 지적했습니다.

+0

의 값을 확인하십시오. 현재 배열 크기의 80 %와 비슷하다고 생각합니다. 내 대답을 보라. – kutschkem

+0

@kutschkem 이것은 당신이 사용하는 HashMap 구현에 달려있다. 나는 더 많은 개념적 레벨에 대한 나의 답을 유지하려고 노력했다. 여기서 중요한 점은 HashMap은 고정 길이 배열을 사용하여 O (1) (충돌이 없다고 가정) 조회를 얻고 null이 표시되는 이유입니다. –

2

당신이 사용하고있는 맵 구현은 시작 부분에 NULL (initialCapacity에 의해 결정됨) 중 일부 인 HashBuckets의 시작 집합으로 작업하기 때문에. 항목 수를 초과하면 개체에 대한 더 많은 HashBuckets/슬롯이 만들어집니다. 이것을 HashMap이 자동으로 생성하는 성장 보전이라고 생각하십시오.

더 읽기 : https://docs.oracle.com/javase/7/docs/api/java/util/HashMap.html

2

해시 맵은 해시 테이블의 항목을 저장합니다. 이것은 배열이고 해시 함수는 키를 배열 항목 중 하나 (해시 버킷이라고도 함)에 매핑합니다.

해시 버킷은 항상 20 % 이상 비어 있습니다. 그렇지 않은 경우 배열의 크기가 조정되어 여유 공간이 충분한 지 확인합니다.

해시 테이블이 채워지면 해시 간의 충돌이 점점 더 많아지기 때문입니다. 충돌이 너무 자주 발생하면 HashMap의 모든 이점을 잃게됩니다. 너무 꽉 차서 HashMap은 LinkedList보다 좋을 것입니다 (예, LinkedList가 아니라 ArrayList). 아마 더 나빠질 것입니다.

1

해시 맵 작업 방법 즉 : 큰 배열 (table), 그리고 몇 가지 주요 내용은 다음 표 항목이 시도된다

table[key.hashCode() % table.length] 

다음 사용되는 테이블 슬롯. Rehashing은 이미 equals(key)이 아닌 키가있는 경우에 사용됩니다. 처음에는 테이블에 널 (NULL) 만 포함되고 크기는 initialCapacity입니다. 해시 맵이 너무 가득 차면 배열을 늘릴 수 있습니다 (loadFactor).

1

HashMap은 배열을 내부적으로 사용하여 항목을 저장합니다. 대단히 단순화 된 것은 array_index = hashcode % array_length과 같은 역할을합니다 (다시 말하면 매우 간단합니다. 해시 충돌 등을 처리해야하기 때문입니다). 이 내부 배열은 일반적으로 HashMap에 저장하는 요소의 수보다 큽니다. 그렇지 않으면 요소를 추가 할 때마다 배열의 크기를 조정해야합니다. 따라서 null으로 보이는 것은 아직 배열에서 사용되지 않은 슬롯입니다.

1

이것은 정상적인 동작입니다.

테이블 배열이 null로 채워지 기 때문에 null 값이 있으며 null을 사용하여 해당 해시 버킷에 저장된 값이 없음을 나타냅니다.

제공된 toString() 함수는 HashMap 구현을 디버깅하는 폴드에 유용하기 때문에 건너 뜁니다.

null이없는 내용을 보려면 HashMap을 서브 클래 싱하고 toString()을 재정의하거나 코드 어딘가에 편리한 함수를 제공하여 사용자 고유의 표시 함수를 작성해야합니다.

관련 문제