Collections.synchronizedMap(new LinkedHashMap())
링크 드 하 쉬 맵 과 링크 드 하 쉬 셋 은 JDK 1.4 에 도 입 된 두 개의 새로운 집합 류 다.5 년 이 지 났 지만 많은 사람들 이 사용 해 본 적 이 없 기 때문이다.그러나 이 두 가 지 는 어떤 경우 에 도 매우 유용 하 다. 과거 에는 소 용이 없 었 고 지금 은 소 용이 없 으 며 모두 관계 가 없다.하지만 이 두 컬 렉 션 프레임 워 크 의 새 멤버 에 대해 서 는 알 아야 한다. 나중에 도착 할 수도 있 고, 아니면 지금 이라도 사용 해 야 하기 때문이다.
링크 드 HashMap / 링크 드 HashSet 은 말 그대로 Hash 의 실현 에 링크 드 의 지원 을 추가 한 것 이다.HashMap / HashSet 의 모든 노드 에 하나의 링크 를 통 해 연결 하면 정확 한 순 서 를 확보 할 수 있 습 니 다.상수 복잡 도 를 원 하 는 효율 적 인 액세스 성능 에 대한 요구 와 정렬 을 요구 하 는 상황 에서 이 제 는 링크 드 하 쉬 맵 / set 을 직접 사용 할 수 있 습 니 다.
링크 드 하 쉬 맵 에 대해 서 는 특히 주의 할 점 이 있 습 니 다. 링크 드 하 쉬 맵 은 두 가지 정렬 을 지원 합 니 다. 삽입 순서, 방문 순서 입 니 다.전 자 는 삽입 시의 순서에 따라 정렬 하 는 것 을 말 하 며, 후 자 는 가장 오래된 것 에 따라 최근 에 사용 하 는 순 서 를 말한다.즉, 하나의 링크 드 HashMap 에 5 개의 노드 가 있다 면 현재 의 순 서 는 e1, e2, e3, e4, e5 입 니 다. 사용 순서 라면 현재 e2 를 한 번 방문 하면 e2 노드 는 링크 의 끝으로 이동 합 니 다.현재 순 서 는 e1, e3, e4, e5, e2 로 바 뀌 었 습 니 다.
이것 은 심각 한 성능 문 제 를 일 으 킬 수 있 습 니까?답 은 당연히 부정 적 이다.여기 있 는 링크 작업 은 상수 급 이기 때문이다.링크 드 하 쉬 맵 / 세트 가 트 리 맵 / 세트 보다 성능 이 높 은 이유 다.
마찬가지 로
링크 드 해시 맵 / set 도 thread - safe 가 아 닙 니 다.다 중 스 레 드 에서 접근 하려 면 외부 동기 화 또는 사용 이 필요 합 니 다.
Collections.synchronizedMap() thread-safe Map/Set。
특히 주의해 야 할 것 은 '접근 순서' 를 사용 할 때 노드 를 읽 는 작업 도 '구조 변화' 의 작업 이다.요소 가 옮 겨 다 니 는 순 서 를 바 꾸 기 때문이다.따라서 링크 드 HashMap 의 iterator () 방법 을 사용 하여 요 소 를 옮 겨 다 닐 때 다른 스 레 드 에서 읽 기 동작 이 있 으 면 동기 화 해 야 합 니 다.그렇지 않 으 면 다른 fail - fast 와 같은 삭제 나 추가 작업 으로 인 한 Current ModificationException 의 예 외 를 던 집 니 다.
LinkedHashMap, HashMap 등
회전:
얼마 전에 비 즈 니스 사 이 트 를 만 들 었 는데 저 는 eclipse 3.2 + jdk 6.0 + tomcat 5.5 로 개 발 했 습 니 다. 서버 에 제출 할 때 예상 치 못 한 문제 가 발생 했 습 니 다.자바 류 함수 에 대해 아직 잘 모 르 는 것 도 있 고 jdk 버 전의 문제 도 있 습 니 다. 한두 가지 예 를 찾 아 설명 하 세 요.
질문 1: HashMap
이런 종류 가 비교적 유용 한 것 은 바로 '키 - 값' 을 일일이 대응 시 켜 put (K key, V value) 함 수 를 이용 한 것 이다.처음에 제 가 실현 한 목적 은 불 러 온 순서대로 HashMap 을 넣 은 다음 에 (HashMap). values (). iterator () 를 Iterator 대상 으로 불 러 온 순서대로 출력 하 는 것 입 니 다.그러나 최종 효 과 는 출력 값 이 어 지 러 운 것 을 발 견 했 습 니 다. 자 료 를 찾 아 보 니 HashMap 은 무 작위 로 출력 되 었 습 니 다. 입력 순서에 따라 출력 하려 면 HashMap 의 하위 클래스 LinkedHashMap 을 사용 해 야 합 니 다.그 러 자 성명 할 때 뉴 링크 드 해시 맵 () 으로 바로 바 뀌 었 는데 성공 했다.
그리고 put (K key, V value) 함 수 를 이용 할 때 키 K 가 int 형식의 숫자 라면 jdk 1.4 와 다음 버 전에 서 오 류 를 보고 합 니 다. 컴 파일 할 때 int 형식 과 자동 으로 일치 하지 않 는 것 같 습 니 다. 해결 방법 은 이 int 형 데 이 터 를 String 형식 으로 변환 하 는 것 입 니 다. 예 를 들 어 String. value Of (int pId) 입 니 다.jdk 5.0 이상 버 전에 서 는 이런 문제 가 발생 하지 않 을 것 입 니 다.
질문 2: String. index Of () 와 String. contains ()
이 두 함 수 는 하나의 문자열 에 문자 나 일부 문자열 이 포함 되 어 있 는 지 판단 하 는 데 사용 할 수 있다.그러나 전 자 는 jdk 1.4 버 전이 나 왔 다.후 자 는 jdk 5.0 의 새로운 특성 에 속 하기 때문에 원래 이 문 제 를 주의 하지 못 했 는데 나중에 함 수 를 바 꿀 수 밖 에 없 었 다.
이 두 함수 (jdk 문서 참조): int index Of (String str): 이 문자열 에 처음 나타 난 지정 한 하위 문자열 의 색인 을 되 돌려 줍 니 다. 반환 - 1 을 포함 하지 않 습 니 다.boolean contains (CharSequence s): 이 문자열 이 char 값 의 지정 한 서열 을 포함 할 때 만 true 로 돌아 갑 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
【Java】 STS (Eclipse)에 AdoptOpen JDK 설정· Eclipse를 2020-09로 업데이트하면 jre로 Eclipse를 움직이고 있습니다! 라는 메시지가 나온다. ・메모리 상태의 파악을 위해 MissionControl 넣으려고 하면 JDK로 움직이지 않으면 안 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.