요소의 수에 관계없이 add, remove 작업에서 ArrayList 또는 LinkedList보다 훨씬 효율적이지만 항상 HashMap을 사용할 수없는 이유는 무엇입니까?
나는 그것을 봤고 몇 가지 이유를 찾았지만 HashMap을 사용하는 데는 항상 장점이 남아있는 해결 방법이있었습니다.
요소의 수에 관계없이 add, remove 작업에서 ArrayList 또는 LinkedList보다 훨씬 효율적이지만 항상 HashMap을 사용할 수없는 이유는 무엇입니까?
나는 그것을 봤고 몇 가지 이유를 찾았지만 HashMap을 사용하는 데는 항상 장점이 남아있는 해결 방법이있었습니다.
답변:
목록은 요소의 순차적 순서를 나타냅니다. 맵은 키 / 값 쌍의 모음을 나타내는 데 사용됩니다.
지도를 목록으로 사용할 수 있지만 그렇게하면 몇 가지 확실한 단점이 있습니다.
순서 유지 : -정의에 따라 목록이 정렬됩니다. 항목을 추가 한 다음 항목을 삽입 한 순서대로 목록을 다시 반복 할 수 있습니다. 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);
도움이 되었기를 바랍니다,
목록과 맵은 서로 다른 데이터 구조입니다. 맵은 키를 값과 연결하려는 경우에 사용되며 목록은 정렬 된 컬렉션입니다.
Map은 Java Collection Framework의 인터페이스이며 HashMap은 Map 인터페이스의 한 구현입니다. HashMap은 키를 기반으로 값을 찾고 키를 기반으로 값을 삽입 및 삭제하는 데 효율적입니다. HashMap의 항목은 정렬되지 않습니다.
ArrayList 및 LinkedList는 List 인터페이스의 구현입니다. LinkedList는 순차 액세스를 제공하며 일반적으로 목록에서 요소를 삽입하고 삭제하는 데 더 효율적이지만 목록의 요소에 액세스하는 데는 덜 효율적입니다. ArrayList는 임의 액세스를 제공하며 요소 액세스에 더 효율적이지만 일반적으로 요소 삽입 및 삭제 속도가 느립니다.
여기에 몇 가지 실제 사례와 시나리오를 넣을 것입니다. 다른 사람에게 도움이 될 수 있습니다.
HashMap
애플리케이션에서 캐시를 사용해야 할 때. Redis와 membase는 확장 된 HashMap의 일부 유형입니다. (요소의 순서는 중요하지 않습니다. 키를 사용하여 빠른 (O (1)) 읽기 액세스 (값)가 필요합니다.
LinkedList
순서가 중요한 경우 (LinkedList에 추가 된대로 순서가 지정됨) 요소 수를 알 수 없으며 (메모리 할당을 낭비하지 마십시오) 빠른 삽입 시간이 필요합니다 (O (1)). 추가되는대로 순차적으로 나열 할 수있는 할 일 항목 목록이 좋은 예입니다.
ArrayList 및 LinkedList의 단점은 검색 알고리즘에 따라 반복 할 때 항목을 찾는 데 걸리는 시간이 목록의 크기에 따라 늘어난다는 것입니다.
해싱의 장점은 요소를 검색하는 데 약간의 추가 시간을 희생하더라도 소요 시간이 맵 크기에 따라 증가하지 않는다는 것입니다. 이는 HashMap이 검색중인 요소를 인덱스로 직접 변환하여 정보를 찾아서 점프 할 수 있기 때문입니다.
간단히 말해서 ... LinkedList : ArrayList보다 약간 더 많은 메모리를 소모하며, 삽입 (추가 및 제거) 비용이 저렴합니다 . ArrayList : 메모리를 적게 소모하지만 LinkedList와 비슷하며 큰 경우 검색에 추가 시간이 걸립니다. HashMap : 큰지도의 검색 시간을 일정하게 만들어 값으로 점프 할 수 있습니다. 작은 목록보다 더 많은 메모리를 사용하고 값을 찾는 데 더 오래 걸립니다.
Lists
그리고Maps
두 가지 전혀 다른 동작과 불변와 다른 데이터 구조. 둘 다 수용 가능한 솔루션이 될 수있는 상황 / 요구 사항을 설명 할 수 있습니까?