기본적으로 몇 가지 데이터 구조로 된 객체가 있으며이 구조는 여러 스레드에서 액세스 할 수 있으므로이를 고려해야합니다.ArrayList 대 HashMap - 많은 반복 및 객체 조작
많은 반복과 개체 조작이 끊임없이 수행되어야합니다 (각 주 루프 반복은 데이터 구조의 모든 단일 개체가 최악의 경우 수정되고 최상/정상적인 경우 수정되지 않을 수 있음).
현재 내 구조는 CopyOnWriteArrayList
입니다. 또한 각 반복마다 목록의 크기를 줄이기 위해 중복을 추가하지 않도록합니다.
locks/synchronized를 사용하는 것이 이상적인 것은 아닙니다. 이러한 작업을 위해 스레드를 유지하지 않으려합니다.
다음과 같이 지금까지 내가 말할 수있는 건,이 내 옵션은 다음과 같습니다 각 요소는 목록에서 HashSet
을 만들고 다시 변환
- 는 기본적으로 (A
contains()
검사를 실행합니다 모든 중복 제거) - 데이터 구조 목록 대신
ConcurrentHashMap
을 사용하십시오. - 다른 방법이 있습니까?
나는 ArrayLists
객체 조작 및 중복 검사를 더 엄격하게 HashMap
을 사용하여 처리하는 동안 반복 훨씬 더 나은 것을 알고 있습니다. 내 경우에는 둘 다 필요하기 때문에, 나는 최선의 해결책이 여기에 무엇인지 궁금 하네.
또한 요소의 순서가 중요하지 않음을 언급해야합니다.
편집 :이를 더 명확히하기 위해 컬렉션에 지속적으로 추가, 제거 및 수정되는 요소가있을 것입니다. 어느 정도까지는 각 특정 실행 시간 (일반적으로 임의의 이벤트를 기반으로 함)에 따라 다르므로 얼마나 자주 발생할지에 대해 어떤 가정을하는 것에 조심합니다. 일어날 수있는 유일한 일은 컬렉션이 완전히 매번 반복되어 각 요소에 대해 여러 검사를 수행한다는 것입니다.
빠른 고유성 검사가 필요한 경우 HashMap에서의 반복은 그리 나쁘지 않습니다. 전체 컬렉션에 대해 ConcurrentHashMap이라고 말하고 싶습니다. –
만약 당신이 필요로하는 것은'Collections.newSetFromMap (new ConcurrentHashMap <>());'을 사용할 수있는 집합이라면 - 맵과리스트에서 반복이 그렇게 나쁠 지 확신 할 수 없다. – assylias
STO에서 ArrayList를 반복하는 방법이 HashMap의 키 집합을 반복하는 것보다 평균 3 ~ 4 배 빠르다는 것을 알았습니다. –