자바 집합 클래스, ArrayList, HashSet, LinkedLlist

4674 단어 기술 블 로그

ArrayList 는 동적 배열 을 바탕 으로 하 는 데이터 구 조 를 실현 하고 LinkedList 는 링크 를 바탕 으로 하 는 데이터 구 조 를 실현 한다.
읽 기와 쓰기 효율
HashSet 읽 기와 쓰 기 는 가장 느 립 니 다. HashSet 은 매번 add 가 hashcode 를 판단 해 야 하기 때문에 HashSet 두 가지 순환 에서 iterator 방식 이 불안정 하지만 항상 foreach 보다 빠 릅 니 다.ArrayList 읽 기와 쓰기 효율 그 다음 에 ArrayList 중간 에 하나의 요 소 를 삽입 하거나 삭제 합 니 다. 전체 집합 에서 이 요소 뒤의 모든 요소 의 아래 표 시 된 위 치 를 바 꿔 야 합 니 다.LinkedList 읽 기와 쓰기 속도 가 가장 빠 릅 니 다. LinkedList 의 중간 에 하나의 요 소 를 삽입 하거나 삭제 하 는 비용 은 고정 적 입 니 다. 삽입 위치 전후의 요소 지침 만 수정 하면 됩 니 다.
집합 내부 중복 요소 제거
집합 에 있 는 요 소 를 HashSet 로 무 게 를 제거 하려 면 이 방법 을 추천 하지 않 습 니 다. hash 알고리즘 은 하나의 Array List 를 옮 겨 다 니 는 것 보다 속도 가 훨씬 느 리 기 때 문 입 니 다.Array List 에서 두 번 순환 하 더 라 도 HashSet 의 구조 방법 을 직접 사용 하 는 것 보다 시간 이 빠르다.
String stocks="001,002,003,002";
LinkedHashSet stocksSet=new LinkedHashSet

 Array List 의 reove 방법 은 요 소 를 한 위치 로 옮 깁 니 다. 요 소 를 빠 뜨리 거나 오류 가 발생 하지 않도록 역순 으로 삭제 합 니 다.
String stocks="001,002,003,002";
ArrayList list=new ArrayList<>(Arrays.asList(stocks.split(",")));
for  ( int  i  =   0 ; i    i; j -- )  {       
      if  (list.get(j).equals(list.get(i)))  {       
              list.remove(j);       
       }        
    }        
}        
return String.join(",",list);      

 
접근 요소
ArrayList 의 내부 구현 은 기본 적 인 대상 배열 을 기반 으로 하기 때문에 get 방법 으로 목록 의 임의의 요 소 를 방문 할 때 (random - access) 는 LinkedList 보다 속도 가 빠르다.물론 사용 for (int i < 0; i 
공간 복잡 도
ArrayList 와 LinkedList 는 공간 복잡 도 에 있어 서 일정한 공간 적 여 유 를 가지 고 있 습 니 다. ArrayList 의 공간 낭 비 는 주로 list 목록 의 끝 에 일정한 용량 공간 을 남 겨 두 는 데 나타 나 며, LinkedList 의 공간 소 비 는 모든 요소 가 상당 한 공간 을 소모 해 야 하 는 것 으로 나 타 났 습 니 다. LinkedList 에는 개인 적 인 내부 클래스 가 있 습 니 다. 정 의 는 다음 과 같 습 니 다.
private static class Entry {
         Object element; 
         Entry next; 
         Entry previous; 
     }

모든 Entry 대상 reference 목록 에 있 는 요소 중 하나 이 며, LinkedList 에 있 는 이전 요소 와 다음 요소 도 있 습 니 다. 1000 개의 요소 가 있 는 LinkedList 대상 은 1000 개의 연 결 된 Entry 대상 이 있 습 니 다. 모든 대상 은 목록 에 있 는 원소 에 대응 합 니 다. 그러면 하나의 LinkedList 구조 에 큰 공간 이 있 습 니 다.이 1000 개의 Entity 대상 에 대한 정 보 를 저장 해 야 합 니 다.
ArrayList 는 내 장 된 배열 을 사용 하여 요 소 를 저장 합 니 다. 이 배열 의 시작 용량 은 10 입 니 다. 배열 이 증가 해 야 할 때 새로운 용량 은 다음 과 같은 공식 에 따라 얻 을 수 있 습 니 다. 새 용량 = (구 용량 * 3)/ 2 + 1, 즉 매번 용량 이 50% 정도 증가 한 다 는 것 입 니 다. 이 는 대량의 요 소 를 포함 하 는 Array List 대상 이 있다 면 결국 많은 공간 이 낭 비 될 것 입 니 다. 이 낭 비 는 Array List 의 작업 방식 자체 에 의 한 것 입 니 다. 새로운 요 소 를 저장 할 공간 이 충분 하지 않 으 면 배열 은 다시 분배 되 어 증가 할 수 있 도록 해 야 합 니 다.새로운 요소 입 니 다. 배열 을 재배 치 하면 성능 이 급 격 히 떨 어 집 니 다. 하나의 Array List 에 몇 개의 요소 가 있 는 지 알 고 있다 면 구조 적 인 방법 으로 용량 을 지정 할 수 있 습 니 다. trimToSize 방법 을 통 해 Array List 가 분 배 된 후에 낭비 되 는 공간 을 없 앨 수 있 습 니 다.
ArrayList 와 LinkedList 순환 스 트 리밍 방식 의 성능 분석
1、for-each
List testList = new ArrayList();

for (String tmp : testList)

{  

  //use tmp;

}

2. 교체 기 방식 은 이러한 옮 겨 다 니 는 방식 이 가장 자주 사용 되 는 옮 겨 다 니 는 방식 입 니 다. 쓰기 가 비교적 편리 하고 배열 의 경 계 를 넘 는 문 제 를 고려 할 필요 가 없 기 때문에 Effective - 자바 에 서 는 이러한 쓰기 방법 을 사용 하 는 것 을 추천 합 니 다.
List testList = new ArrayList();

for (Iterator iterator = testList.iterator(); iterator.hasNext();)

{

    //String tmp = iterator.next();

}

 
3. 아래 표 시 는 점점 증가 하거나 감소 하 는 순환
List testList = new ArrayList();

for (int i = 0; i < testList.size(); i++;)

{

    //String tmp = testList.get(i);

}

상기 세 가지 옮 겨 다 니 는 방식 은 list 를 사용 할 때 가장 자주 사용 하 는 방식 입 니 다. 그러면 이 세 가지 방식 은 옮 겨 다 니 는 속도 가 이미 성능 에 있어 서 어떤 차이 가 있 습 니까? 우 리 는 데이터 의 밑바닥 에서 분석 합 니 다. 아래 표 시 는 증가 하거나 감소 순환 은 최초 로 접 한 옮 겨 다 니 는 방식 으로 배열 의 경 계 를 넘 는 문제 가 자주 발생 합 니 다.
List 바 텀 저장 은 모두 배열 로 저장 되 어 있 으 며, Array List 는 배열 을 통 해 직접 저장 되 어 있 으 며, LinkedList 는 배열 시 뮬 레이 션 지침 을 사용 하여 링크 를 실현 하 는 방식 이기 때문에 여기 서 정리 할 수 있 듯 이 Array List 는 아래 표 시 된 방식 으로 순환 할 때 성능 이 가장 좋 고, 아래 표 시 를 통 해 직접 데 이 터 를 추출 할 수 있 으 며 속도 가 가장 빠르다.포인터 가 있 기 위해 서 는 해당 하 는 아래 표 시 를 직접 찾 을 수 없 기 때문에 아래 표 시 를 옮 겨 다 닐 때 해당 하 는 아래 요 소 를 계산 해 야 합 니 다. 포인터 의 첫 걸음 한 걸음 걸 어가 기 때문에 효율 이 낮 습 니 다. 지침 을 생각하면 교체 기 를 연상 시 킬 수 있 습 니 다. 교체 기 는 다음 요 소 를 가리 킬 수 있 고 교체 기 는 지침 을 사용 하여 이 루어 집 니 다. 따라서 LinkedList 는 교체 기 를 사용 하고 있 습 니 다.기 계 를 옮 겨 다 닐 때 효율 이 가장 높 습 니 다. 교체 기 는 LinkedList 의 지침 을 통 해 직접 옮 겨 다 닙 니 다. Array List 는 교체 기 를 사용 할 때 Array List 씨 를 통 해 지침 을 만들어 야 하기 때문에 효율 이 아래 표 시 된 방식 보다 낮 고 for - each 는 교체 기 를 바탕 으로 포장 을 했 기 때문에 효율 은 더욱 낮 지만 교체 기 에 가 깝 습 니 다.
list 달력 을 진행 할 때 Array List 를 옮 겨 다 니 는 경우 아래 표 시 를 사용 하 는 것 을 추천 합 니 다. LinkedList 라면 교체 기 를 사용 하 는 것 을 추천 합 니 다.

좋은 웹페이지 즐겨찾기