3

기본적으로 몇 가지 데이터 구조로 된 객체가 있으며이 구조는 여러 스레드에서 액세스 할 수 있으므로이를 고려해야합니다.ArrayList 대 HashMap - 많은 반복 및 객체 조작

많은 반복과 개체 조작이 끊임없이 수행되어야합니다 (각 주 루프 반복은 데이터 구조의 모든 단일 개체가 최악의 경우 수정되고 최상/정상적인 경우 수정되지 않을 수 있음).

현재 내 구조는 CopyOnWriteArrayList입니다. 또한 각 반복마다 목록의 크기를 줄이기 위해 중복을 추가하지 않도록합니다.

locks/synchronized를 사용하는 것이 이상적인 것은 아닙니다. 이러한 작업을 위해 스레드를 유지하지 않으려합니다.

다음과 같이 지금까지 내가 말할 수있는 건,이 내 옵션은 다음과 같습니다 각 요소는 목록에서 HashSet을 만들고 다시 변환

  • 를 추가 할 수 있도록

    1. 는 기본적으로 (A contains() 검사를 실행합니다 모든 중복 제거)
    2. 데이터 구조 목록 대신 ConcurrentHashMap을 사용하십시오.
    3. 다른 방법이 있습니까?

    나는 ArrayLists 객체 조작 및 중복 검사를 더 엄격하게 HashMap을 사용하여 처리하는 동안 반복 훨씬 더 나은 것을 알고 있습니다. 내 경우에는 둘 다 필요하기 때문에, 나는 최선의 해결책이 여기에 무엇인지 궁금 하네.

    또한 요소의 순서가 중요하지 않음을 언급해야합니다.

    편집 :이를 더 명확히하기 위해 컬렉션에 지속적으로 추가, 제거 및 수정되는 요소가있을 것입니다. 어느 정도까지는 각 특정 실행 시간 (일반적으로 임의의 이벤트를 기반으로 함)에 따라 다르므로 얼마나 자주 발생할지에 대해 어떤 가정을하는 것에 조심합니다. 일어날 수있는 유일한 일은 컬렉션이 완전히 매번 반복되어 각 요소에 대해 여러 검사를 수행한다는 것입니다.

  • +0

    빠른 고유성 검사가 필요한 경우 HashMap에서의 반복은 그리 나쁘지 않습니다. 전체 컬렉션에 대해 ConcurrentHashMap이라고 말하고 싶습니다. –

    +1

    만약 당신이 필요로하는 것은'Collections.newSetFromMap (new ConcurrentHashMap <>());'을 사용할 수있는 집합이라면 - 맵과리스트에서 반복이 그렇게 나쁠 지 확신 할 수 없다. – assylias

    +0

    STO에서 ArrayList를 반복하는 방법이 HashMap의 키 집합을 반복하는 것보다 평균 3 ~ 4 배 빠르다는 것을 알았습니다. –

    답변

    1

    이 대답은 당신의 동시성 문제 해결 : 반복의

    많은과 (각 주요 루프 반복 데이터 구조에있는 모든 단일 개체가 발생할 수 있습니다 수정되고 지속적으로 수행 할 필요가 조작 객체 최악의 경우, 최상/정상적인 경우에는 수정되지 않음).

    컬렉션이 수정 되나요? 컬렉션이 가장 의미있는 것을 선택하지 않고 객체를 동기화하는 경우. 컬렉션에 포함되면 CopyOnWriteArraylist 또는 ConcurrentHashMap의 동기화 혜택을받지 못합니다.

    컬렉션이 수정되는 경우 후속 작업은 얼마나 자주 수행됩니까?

    많은 경우 CopyOnWriteArrayList를 사용하지 않습니다. 조금이라도 그렇다면 가장 높은 검색 성능을 기준으로 선택하십시오.

    +0

    글쎄, 정확하게 대답하지는 못했지만 적어도 시도해 줘서 고마워요. 당신은 최고의 대답을 얻습니다. –