programing tip

Map.clear () vs new Map : 어느 것이 더 좋을까요?

itbloger 2020. 9. 10. 07:29
반응형

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

반응형