Map.clear () vs new Map : 어느 것이 더 좋을까요? [복제]
이 질문에 이미 답변이 있습니다.
구문으로 Map이 Map<String, String> testMap = new HashMap<String, String>();
. 이지도에는 1000 개의 데이터가있을 수 있습니다.
내 애플리케이션에 새 데이터 목록이 필요한 경우 맵을 지워야합니다. 하지만 Map.clear () 코드를
/**
* Removes all of the mappings from this map.
* The map will be empty after this call returns.
*/
public void clear() {
modCount++;
Entry[] tab = table;
for (int i = 0; i < tab.length; i++)
tab[i] = null;
size = 0;
}
clear 메서드가 n 번 반복된다는 것을 알고 있습니다 (n은 Map의 데이터 수입니다). 그래서 testMap = new HashMap<String, String>();
이전에 사용한 맵이 가비지 수집이되는 맵 을 재정의하는 방법이 있다고 생각했습니다 .
그러나 이것이 좋은 방법이 될 것이라고 확신하지 않습니다. 모바일 애플리케이션을 개발 중입니다.
저를 안내해 주시겠습니까?
복잡한 질문입니다. 무슨 일이 일어나는지 보자.
새 배열로 지원되는 새 인스턴스를 인스턴스화합니다. 따라서 가비지 수집기는 이전 맵에서 모든 키와 값을 지우고 자신에 대한 참조를 지워야합니다. 따라서 O (n) 알고리즘은 어쨌든 가비지 수집기 스레드에서 실행됩니다. 1000 개의 레코드에 대해서는 차이가 없습니다. 그러나. 성능 가이드 는 가능한 한 새 개체를 만들지 않는 것이 항상 낫다고 말합니다 . 그래서 나는 clear()
방법으로 갈 것입니다 .
어쨌든 두 가지 변형을 모두 시도하고 측정 해보십시오. 항상 측정하십시오!
Map.clear()
크기의지도에 대해 말할 때 n
... GC에 2*n
(Key & Value) 개체 를 정리하도록 요청하는 것 입니다. null
동일한 맵에 말할 때 GC에 2*n+1
(Map 자체의 경우 1) 개체 를 정리하도록 요청하는 것 입니다. 그런 다음 새 Map 인스턴스를 생성해야하지만 또 다른 오버 헤드가 발생합니다. 그러니 Map.clear()
. 인스턴스화하는 동안 맵의 크기를 미리 설정하는 것이 현명 할 것입니다.
나는 자바에서 객체를 만드는 것이 메모리 측면에서 더 비싸다고 생각했기 때문에 함께가는 것이 더 낫기 .clear()
때문에 새 객체를 만드는 대신 동일한 객체를 사용하고 있습니다.
clear () 메서드를 사용하는 아이디어는 맵에서 다른 객체에 대한 참조를 제거하여 "맵이 다른 곳에서 참조되는 경우"키 / 값이 gcing에서 유지되지 않도록하는 것입니다.
그러나지도가 특정 코드에서만 사용되는 로컬지도 인 경우 (예 : "지도는 다른 곳에서 참조되지 않습니다") 대신 새지도를 사용하지만 null에 대한 참조 1000 개를 설정하는 것은 성능에 큰 영향을주지 않습니다. 어쨌든.
지도의 다시 채우기를 잊지 마세요
새 맵에 용량을 지정하지 않으면 새로 생성 된 맵에서 리해시 (각각 O (n) (당시)이고 발생 O (log (n))로 인해 상당한 오버 헤드가 발생합니다. 시간이 O (n) 총액으로 상각 될 수 있지만 처음에 발생하지 않으면 여전히 더 좋습니다)
용량이 변경되지 않기 때문에 클리어 된 맵에서는 발생하지 않습니다.
모든 데이터를 제거 할 map.clear (). 이렇게하면 모든 항목 만 삭제되지만 항목을 저장하는 데 사용되는 내부 배열은 초기 용량으로 축소되지 않고 동일한 크기로 유지됩니다. 이를 제거해야하는 경우 가장 쉬운 방법은 전체 HashMap을 버리고 새 인스턴스로 바꾸는 것입니다. 물론지도에 대한 포인터가있는 사람을 제어하는 경우에만 작동합니다.
메모리를 회수하려면 가비지 수집기가 작업을 수행하도록해야합니다.
당신의 가치도 길습니까? 이 경우 GNU Trove 라이브러리 에있는 TLongLongHashMap과 같은 일반적인 HashMap보다 더 (메모리) 효율적인 구현을보고 싶을 수 있습니다 . 그것은 많은 메모리를 절약 할 것입니다.
나는 new HashMap ()을 호출하는 것이 해시 맵을 지우는 것만 큼 많은 처리를 할 필요가 없기 때문에 더 나은 생각이라고 생각합니다. 또한 새 해시 맵을 만들면 해시 맵이 데이터를 사용하는 컨트롤에 여전히 바인딩되어 해시 맵을 지울 때 문제가 발생할 가능성을 제거 할 수 있습니다.
참고 URL : https://stackoverflow.com/questions/6757868/map-clear-vs-new-map-which-one-will-be-better
'programing tip' 카테고리의 다른 글
파이썬에서 a-= b와 a = a-b의 차이점 (0) | 2020.09.10 |
---|---|
libcurl을 사용하는 HTTP 상태 코드? (0) | 2020.09.10 |
스크립트 및 스타일 요소에 대한 HTML "nonce"속성의 목적은 무엇입니까? (0) | 2020.09.10 |
내 컴퓨터에서 fuslogvw.exe를 찾을 수 없습니다. (0) | 2020.09.10 |
Moq 콜백을 이해하도록 도와 주시겠습니까? (0) | 2020.09.10 |