2013-10-16 2 views
1

제네릭에 익숙하지 않고 제 질문에 대한 답변이 opinion based이거나 진짜 이유가 확실하지 않습니다. 다음 코드에서 객체에 대한 키의 대문자를 입력해야하는 이유는 무엇입니까?HashMap에서 getEntry에 대한 객체를 정의하는 이유

Object k; 
if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k)))) 
쉽게

if (e.hash == hash && (e.key == key || (key != null && key.equals(e.key)))) 

더 참조로 대체 될 것으로 보인다

: 당신은 k와 동일한 지 어떤지를 체크 곳 key의 마지막 부분을 놓친

final Entry<K,V> getEntry(Object key) { 
     int hash = (key == null) ? 0 : hash(key); 
     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 != null && key.equals(k)))) 
       return e; 
     } 
     return null; 
    } 

답변

3

이것은 일반 용도의 프로그래밍 연습에는 필요하지 않은 극단적 인 최적화 방법입니다. 귀하의 질문에 대답 할 수있는 discussion입니다. 아래 내용이 해당 게시물에서 복사됩니다.

Doug Lea가 인기있는 코딩 스타일입니다. 아마 필요하지 않은 극단적 인 최적화입니다. JIT가 동일한 최적화를 수행 할 것으로 기대할 수 있습니다. (당신은 직접 기계 코드를 검사 할 수 있습니다!) 그럼에도 불구하고, 로컬로 복사하는 것이 가장 작은 바이트 코드를 생성하고, 저수준 코드의 경우 기계에 조금 더 가까운 코드를 작성하는 것이 좋습니다.

0

, 그래서 제거 과제 (k = e.key)가 마지막 점검을 중단합니다 -

if (e.hash == hash && ((k = e.key) == key || (key != null && key.equals(k))))

+0

k에 대한 과제를 삭제하려고하지 않습니다. – JavaDeveloper

+0

나는 k를 전혀 사용하지 않기로했다. – JavaDeveloper

0

클래스로하고 싶은 일에 농구대를 뛰어 넘어야 할 필요가 있습니다. 제네릭을 사용하면서 나는 항상 그것을 이해하기가 어려워졌습니다. 때로는 생각했던 것보다 더 쉬워지고, 생각할 수있는 모든 것을 시도 할 때가 있습니다. 견디어 내다.

0

입력 코드를 보면 키는 "최종"입니다. 필자가 생각하기에이 코드는 최종 변수의 제약 조건이 후속 코드 실행을 방해하지 않도록 최종 변수에서 비 최종 변수를 만드는 것이다. 그것 이외에, 나는 또한 당신이 "if"조건이 동일해야한다고 말했던 것처럼 가정 할 것이다.

관련 문제