2016-12-02 3 views
0

Java 6에서 HashMap 가져 오기 방법을 사용 중입니다. & Java 8에서 Java 8의 구현이 조금 복잡하지만 얻을 수 없습니다.Java 6 및 Java 8에서 HashMap 가져 오기 방법

Java 6에서입니다 : 여기에 자바 6

public V get(Object key) { 
    if (key == null) 
     return getForNullKey(); 
    int hash = hash(key.hashCode()); 
    for (Entry<K,V> e = table[indexFor(hash, table.length)]; 
     e != null; 
     e = e.next) { 
     Object k; 
     if (e.hash == hash && ((k = e.key) == key || key.equals(k))) 
      return e.value; 
    } 
    return null; 
} 

, 그것은 올바른 항목 요소를 받고 지정된 키에 따라 해당 값을 찾기 위해 노력하고있다.

Java 8에서 경우이 코드 :

public V get(Object key) { 
     Node<K,V> e; 
     return (e = getNode(hash(key), key)) == null ? null : e.value; 
    } 

final Node<K,V> getNode(int hash, Object key) { 

    Node<K,V>[] tab; Node<K,V> first, e; int n; K k; 

    if ((tab = table) != null && (n = tab.length) > 0 && 
      (first = tab[(n - 1) & hash]) != null) { 

      if (first.hash == hash && // always check first node 
       ((k = first.key) == key || (key != null && key.equals(k)))) { 
       return first; 
      } 

      if ((e = first.next) != null) { 

       if (first instanceof TreeNode) { 
        return ((TreeNode<K,V>)first).getTreeNode(hash, key); 
       } 

       do { 
        if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) { 
         return e; 
        } 
       } while ((e = e.next) != null); 
      } 
     } 
     return null; 
    } 

내가 자바의 논리를 이해 할 수없는 오전 8 그들은 첫 번째 요소 복용하는 방법

:

(first = tab[(n - 1) & hash]) != null) 

무엇을 이 여분의 논리는 다음과 같습니다.

 if (first.hash == hash && // always check first node 
      ((k = first.key) == key || (key != null && key.equals(k)))) 
      return first; 
     if ((e = first.next) != null) { 
      if (first instanceof TreeNode) 
       return ((TreeNode<K,V>)first).getTreeNode(hash, key); 
대해서는3210
+1

링크 된 소스 코드의 구현 노트를 읽었습니까? 그것은 그것이 무엇인지, 왜 그것이 무엇인지를 아주 분명하게 설명합니다. – biziclop

+0

@biziclop, 메소드를 가져 오는 것과 관련된 노트를 언급하고 있습니까? 이 변경 사항에 대해서는이 방법에 대한 설명이 없습니다. 너는 네가 말하는 것을 너에게 말해 줄 수 있니? – user3181365

+2

아니요, 클래스 상단에는 '구현 노트'라는 제목의 긴 주석이 있으며, 여기에 'TreeNode'비즈니스 전체가 설명되어 있습니다. – biziclop

답변

0

는 :

엔트리가 테이블에 추가되는 방법에서 유래
(first = tab[(n - 1) & hash]) != null) 

아래와 :

if ((p = tab[i = (n - 1) & hash]) == null) 
    tab[i] = newNode(hash, key, value, null); 

AND 한창 (N-1), 해시가 해시 코드 = 해시와 같이 허용 테이블의 n 엔트리에 퍼지게된다. (n-1)은 tab.length가 n이기 때문에 ArrayIndexOutOfBoundsException으로 이어질 수있는 탭 [n]에 삽입하려고 시도하는 가장자리 사건을 방지하기 위해 사용됩니다.

당신이 언급하고있는 "추가 논리"

if (first.hash == hash && // always check first node 
    ((k = first.key) == key || (key != null && key.equals(k)))) 
    return first; 

위의 반환뿐만 아니라 키의 해시 코드를 일치하는 테이블에서 첫 번째 노드가 검색뿐만 아니라 정확히 "동일"하고 그 열쇠.

if ((e = first.next) != null) { 
    if (first instanceof TreeNode) 
     return ((TreeNode<K,V>)first).getTreeNode(hash, key); 

위의 반환 노드 버킷은 "Treeified"된 경우 - 코멘트 중 하나로 지적이 클래스의 "구현의주의 사항"에 규정되어있는 대한 세부 사항.