[Java] Java의 그래픽 데이터 구조 및 원리

여기에 사진 설명 삽입
원본 : http://www.javastack.cn/article/2018/data-structure-and-the-principle-diagram/

최근에는 데이터 구조에 대한 지식을 정리하기 위해 Java에서 일반적으로 사용되는 데이터 구조를 체계적으로 살펴보고 갑자기 애니메이션을 사용하여 데이터 흐름 프로세스를 그리고 싶었습니다.

주로 jdk8을 기반으로하며 jdk7 이전과 다른 기능이있을 수 있습니다. 예를 들어 LinkedList LinkedHashMap의 양방향 목록은 더 이상 루프백이 아닙니다.

HashMap의 단일 연결 목록은 헤드 등이 아닌 끝에 삽입되며 이러한 차이점은 다음 텍스트에서 반복되지 않습니다.이 기사의 디렉토리 구조는 다음과 같습니다.

여기에 사진 설명 삽입

LinkedList

고전적인 이중 연결 목록 구조는 순서가 맞지 않는 삽입 및 삭제에 적합합니다. 지정된 시퀀스 작업의 성능은 데이터 구조에 의해 결정되는 ArrayList만큼 좋지 않습니다.

add (E) / addLast (E)

여기에 사진 설명 삽입

추가 (색인, E)

여기에 작은 최적화가 있는데, 그는 먼저 인덱스가 헤드에 가까운 지 아니면 팀의 끝에 있는지를 결정하여 체인을 횡단 할 방향을 결정합니다.

1         if (index < (size >> 1)) {
    
    
2             Node<E> x = first;
3             for (int i = 0; i < index; i++)
4                 x = x.next;
5             return x;
6         } else {
    
    
7             Node<E> x = last;
8             for (int i = size - 1; i > index; i--)
9                 x = x.prev;
10             return x;
11         }

여기에 사진 설명 삽입

끝까지
여기에 사진 설명 삽입

get (인덱스)

또한 인덱스를 먼저 판단하지만 성능이 여전히 좋지 않기 때문에 for (int i = 0; i <lengh; i ++)를 사용하여 연결 목록을 탐색하지 않고 반복자를 사용하여 탐색하지 않는 것이 좋습니다.

여기에 사진 설명 삽입

여기에 사진 설명 삽입

제거 (E)

여기에 사진 설명 삽입

ArrayList의
맨 아래 계층은 배열이므로 순서대로 검색하고 순서를 벗어난 삽입 및 삭제는 요소를 뒤로 이동하므로 성능이 느립니다.

추가 (색인, E)

여기에 사진 설명 삽입

확장

일반적으로 기본 용량은 10이며 확장 후 길이 * 1.5입니다.

여기에 사진 설명 삽입

제거 (E)

배열을 반복하여 E가 현재 요소와 같은지 확인하고 삭제 성능이 LinkedList만큼 좋지 않습니다.

여기에 사진 설명 삽입

스택의
고전적인 데이터 구조 인 맨 아래 계층도 벡터에서 상속 된 배열이며 선입 선출 FILO이며 기본 새 Stack () 용량은 자동 확장을 초과하는 10입니다.

밀기 (E)
여기에 사진 설명 삽입

팝()

여기에 사진 설명 삽입

접미사 식
Stack의 일반적인 응용은 9 + (3-1) * 3 + 10/2와 같은 식을 계산하는 것입니다. 컴퓨터는 중위 식을 접미사 식으로 변환 한 다음 접미사 식을 계산합니다. 추천 자료 : 자바 프로그래머가 숙달해야하는 8 가지 데이터 구조 인터뷰 질문, 얼마나 많이 알고 있습니까?

접미사에 접미사

디지털 직접 출력

스택이 비어 있으면 연산자가 발생하고 스택이 직접 푸시됩니다.

왼쪽 괄호를 만나 스택에 올려

오른쪽 괄호가 발견되면 팝 연산이 수행되고, 팝된 요소는 스택에서 왼쪽 괄호가 팝될 때까지 출력되고 왼쪽 괄호는 출력되지 않습니다.

연산자 발생 (더하기, 빼기, 곱하기 및 나누기) : 우선 순위가 연산자보다 크거나 같은 스택의 모든 최상위 요소를 팝한 다음 연산자를 스택으로 푸시합니다.

마지막으로 스택의 요소가 순차적으로 튀어 나와 출력됩니다.

여기에 사진 설명 삽입

접미사 식 계산

숫자를 만나면 숫자를 스택에 밀어 넣습니다.

연산자를 만나면 스택 맨 위에있는 두 숫자를 팝하고 연산자를 사용하여 해당 계산을 수행 한 다음 결과를 스택에 푸시합니다.

표현식의 맨 오른쪽 끝까지 위 과정을 반복하십시오.

연산으로 얻은 값은 다음 표현식의 결과입니다.
여기에 사진 설명 삽입

Queue
와 Stack의 차이점은 Stack의 삭제 및 추가는 대기열의 끝에서 수행되는 반면 Queue의 삭제는 대기열의 선두에 있고 추가는 대기열의 끝에 수행된다는 것입니다.

ArrayBlockingQueue

프로덕션 소비자 FIFO에서 일반적으로 사용되는 차단 제한 대기열입니다.

넣어 (E)
여기에 사진 설명 삽입

put (E) 대기열이 꽉 찼습니다.

1 최종 ReentrantLock 잠금 = this.lock;
2 lock.lockInterruptibly ();
3 try { 4 while (count == items.length) 5 notFull.await (); 6 인큐 (e); 7} 마침내 { 8 lock.unlock (); 9}






여기에 사진 설명 삽입

취하다()

요소를 꺼낼 때 배열 뒤의 요소를 이동하지 않고 다음 요소를 가리 키도록 takeIndex를 업데이트합니다.

takeIndex는 순환 성장으로 큐의 끝으로 이동하면 0을 가리키고 다시 반복됩니다.

1 private E dequeue () { 2 // assert lock.getHoldCount () == 1; 3 // 항목 주장 [takeIndex]! = null; 4 최종 Object [] 항목 = this.items; 5 @SuppressWarnings ( "확인되지 않음") 6 E x = (E) 항목 [takeIndex]; 7 개 항목 [takeIndex] = null; 8 if (++ takeIndex == items.length) 9 takeIndex = 0; 10 카운트 –; 11 if (itrs! = null) 12 itrs.elementDequeued (); 13 notFull.signal (); 14 반환 x; 15}













여기에 사진 설명 삽입

HashMap은
가장 일반적으로 사용되는 해시 테이블로, 인터뷰를위한 아동 신발에 필요한 지식입니다. 내부적으로 배열 + 단일 연결 목록을 통해 구현됩니다. jdk8에는 Red-black 트리를 도입하여 길이가 8 인 연결 목록을 최적화합니다. 추천 자료 : 자바 프로그래머가 숙달해야하는 8 가지 데이터 구조 인터뷰 질문, 얼마나 많이 알고 있습니까?

넣어 (K, V **) **

여기에 사진 설명 삽입

put (K, V) 동일한 해시 값
여기에 사진 설명 삽입

동적 확장 크기 조정

맵의 요소가 설정된 임계 값을 초과하면 크기 조정 (길이 * 2) 작업이 수행되고 확장 과정에서 요소가 작업되어 새 위치에 배치됩니다. 추천 자료 : 자바 프로그래머가 숙달해야하는 8 가지 데이터 구조 인터뷰 질문, 얼마나 많이 알고 있습니까?

구체적인 작업은 다음과 같습니다.

jdk7에서 직접 모든 요소를 ​​다시 해시하고 새 위치에 배치합니다.

jdk8에서 요소의 원래 해시 값에 새로 추가 된 비트가 0인지 1인지 판단합니다. 0은 인덱스가 변경되지 않음을 의미하고 1은 인덱스가 "원래 인덱스 + oldTable.length"가됨을 의미합니다.

1 // 두 체인을 정의합니다.
2 // 비트가 0 인 새로 추가 된 체인의 원래 해시 값, 머리와 꼬리
3 Node <K, V> loHead = null, loTail = null;
4 // 원래 해시 값은 new입니다. 증가 된 비트가 1 인 체인, 머리 및 꼬리
5 Node <K, V> hiHead = null, hiTail = null;
6 Node <K, V> next;
7 // 체인을 통해 루프
8 do { 9 next = e.next; 10 if ((e.hash & oldCap) == 0) { 11 if (loTail == null) 12 loHead = e; 13 else 14 loTail.next = e; 15 loTail = e; 16} 17 else { 18 if (hiTail == null) 19 hiHead = e; 20 else 21 hiTail.next = e; 22 hiTail = e; 23} 24} while ((e = next)! = null); 25 // 확장 전후의 위치 변하지 않는 체인 26 if (loTail! = null) {


















27 loTail.next = null;
28 newTab [j] = loHead;
29}
30 // 확장 된 위치 + 원래 배열의 길이
31 if (hiTail! = null) { 32 hiTail.next = null; 33 newTab [j + oldCap] = hiHead; 34}



여기에 사진 설명 삽입

LinkedHashMap
은 HashMap에서 상속되며, 하단 계층은 추가적으로 데이터 순서를 유지하기 위해 이중 연결 목록을 유지합니다 .accessOrder를 설정하여 FIFO (삽입 순서) 또는 LRU (접근 순서) 캐싱을 수행 할 수 있습니다.

넣어 (K, V)

여기에 사진 설명 삽입

get (K)

accessOrder가 false이면 위치를 조정하지 않고 직접 요소를 반환합니다.

accessOrder가 true이면 가장 최근에 액세스 한 요소를 큐 끝에 배치해야합니다.

여기에 사진 설명 삽입

removeEldestEntry는 가장 오래된 요소를 제거합니다.

여기에 사진 설명 삽입

(끝)

추천

출처blog.csdn.net/qq_21383435/article/details/108511678