LinkedList 또는 ArrayList를 통해 또는 그 반대로 HashMap을 사용하는 경우


82

요소의 수에 관계없이 add, remove 작업에서 ArrayList 또는 LinkedList보다 훨씬 효율적이지만 항상 HashMap을 사용할 수없는 이유는 무엇입니까?

나는 그것을 봤고 몇 가지 이유를 찾았지만 HashMap을 사용하는 데는 항상 장점이 ​​남아있는 해결 방법이있었습니다.


11
Lists그리고 Maps두 가지 전혀 다른 동작과 불변와 다른 데이터 구조. 둘 다 수용 가능한 솔루션이 될 수있는 상황 / 요구 사항을 설명 할 수 있습니까?
Mark Peters 2011

3
분명히 당신은 특정 순서 로 물건을 보관할 필요가 없었습니다 ...
Brian Roach 2011

52
반대 투표, 왜? 나는 이것이 적절한 질문이라고 생각합니다. 그러나 지식이 부족하다는 것을 보여 주지만, 그래서 질문에 대한 지식이 부족하다는 이유로 찬성해서는 안됩니다. 사실 질문은 항상 지식 부족의 결과입니다.

답변:


96

목록은 요소의 순차적 순서를 나타냅니다. 맵은 키 / 값 쌍의 모음을 나타내는 데 사용됩니다.

지도를 목록으로 사용할 수 있지만 그렇게하면 몇 가지 확실한 단점이 있습니다.

순서 유지 : -정의에 따라 목록이 정렬됩니다. 항목을 추가 한 다음 항목을 삽입 한 순서대로 목록을 다시 반복 할 수 있습니다. HashMap에 항목을 추가 할 때 항목을 넣은 순서대로 항목을 검색 할 수 있다는 보장은 없습니다. LinkedHashMap과 같이 순서를 유지하는 HashMap의 하위 클래스가 있지만 일반적으로 Map에서는 순서가 보장되지 않습니다.

키 / 값 의미 : -맵의 목적은 나중에 항목을 검색하는 데 사용할 수있는 키를 기반으로 항목을 저장하는 것입니다. 유사한 기능은 키가 목록의 위치에있는 제한된 경우에만 목록을 사용하여 얻을 수 있습니다.

코드 가독성 다음 예제를 고려하십시오.

    // Adding to a List
    list.add(myObject);         // adds to the end of the list
    map.put(myKey, myObject);   // sure, you can do this, but what is myKey?
    map.put("1", myObject);     // you could use the position as a key but why?

    // Iterating through the items
    for (Object o : myList)           // nice and easy
    for (Object o : myMap.values())   // more code and the order is not guaranteed

컬렉션 기능 컬렉션 클래스를 통해 목록에 몇 가지 훌륭한 유틸리티 함수를 사용할 수 있습니다. 예를 들어 ...

    // Randomize the list
    Collections.shuffle(myList);

    // Sort the list
    Collections.sort(myList, myComparator);  

도움이 되었기를 바랍니다,


LinkedList는 종종 성능 문제로 인해 나쁘다고합니다. 요소 순서 때문에 ArrayLists보다 LinkedLists를 자주 사용합니다. 위치와 함께 HashMaps를 키로 사용하면 더 좋을까요 (성능 및 메모리)?
Cesar Castro

33

목록과 맵은 서로 다른 데이터 구조입니다. 맵은 키를 값과 연결하려는 경우에 사용되며 목록은 정렬 된 컬렉션입니다.

Map은 Java Collection Framework의 인터페이스이며 HashMap은 Map 인터페이스의 한 구현입니다. HashMap은 키를 기반으로 값을 찾고 키를 기반으로 값을 삽입 및 삭제하는 데 효율적입니다. HashMap의 항목은 정렬되지 않습니다.

ArrayList 및 LinkedList는 List 인터페이스의 구현입니다. LinkedList는 순차 액세스를 제공하며 일반적으로 목록에서 요소를 삽입하고 삭제하는 데 더 효율적이지만 목록의 요소에 액세스하는 데는 덜 효율적입니다. ArrayList는 임의 액세스를 제공하며 요소 액세스에 더 효율적이지만 일반적으로 요소 삽입 및 삭제 속도가 느립니다.


1

여기에 몇 가지 실제 사례와 시나리오를 넣을 것입니다. 다른 사람에게 도움이 될 수 있습니다.

HashMap

애플리케이션에서 캐시를 사용해야 할 때. Redis와 membase는 확장 된 HashMap의 일부 유형입니다. (요소의 순서는 중요하지 않습니다. 키를 사용하여 빠른 (O (1)) 읽기 액세스 (값)가 필요합니다.

LinkedList

순서가 중요한 경우 (LinkedList에 추가 된대로 순서가 지정됨) 요소 수를 알 수 없으며 (메모리 할당을 낭비하지 마십시오) 빠른 삽입 시간이 필요합니다 (O (1)). 추가되는대로 순차적으로 나열 할 수있는 할 일 항목 목록이 좋은 예입니다.


0

ArrayList 및 LinkedList의 단점은 검색 알고리즘에 따라 반복 할 때 항목을 찾는 데 걸리는 시간이 목록의 크기에 따라 늘어난다는 것입니다.

해싱의 장점은 요소를 검색하는 데 약간의 추가 시간을 희생하더라도 소요 시간이 맵 크기에 따라 증가하지 않는다는 것입니다. 이는 HashMap이 검색중인 요소를 인덱스로 직접 변환하여 정보를 찾아서 점프 할 수 있기 때문입니다.

간단히 말해서 ... LinkedList : ArrayList보다 약간 더 많은 메모리를 소모하며, 삽입 (추가 및 제거) 비용이 저렴합니다 . ArrayList : 메모리를 적게 소모하지만 LinkedList와 비슷하며 큰 경우 검색에 추가 시간이 걸립니다. HashMap : 큰지도의 검색 시간을 일정하게 만들어 값으로 점프 할 수 있습니다. 작은 목록보다 더 많은 메모리를 사용하고 값을 찾는 데 더 오래 걸립니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.