해시맵의 코드를 보면 특이한 부분을 볼 수 있습니다.
if ((tab = table) == null || (n = tab.length) == 0)
tab = table을 이용해 해시맵 내부 테이블 변수에 값을 할당하는 것을 볼 수 있습니다.

왜 굳이 인스턴스 변수 table을 사용하지 않고 tab이라는 변수에 담아준걸까요?
이는 지역변수(tab)는 스택에, 인스턴스 변수(table)는 Heap에 저장하기 때문입니다.
설명하기 전에 먼저 표현을 정정해야 합니다.
우리가 흔히 "스택이 힙보다 빠르다"고 하는 건, 사실 스택 할당된 변수에 접근하는 것이 힙 할당 변수에 접근하는 것보다 빠르다는 것입니다.
스택 메모리 영역이 힙 메모리 영역보다 그 자체로 빠르다는 것은 아닙니다. 스택이나 힙이나 가상메모리 영역에 불과하고, 하드웨어로 내려가면 똑같이 RAM의 어딘가에 저장된 페이지에 불과하니까 둘의 속도가 다를 이유는 없습니다.
그런데 접근하는 속도는 왜 차이가 날까요?
힙의 변수들은 OS가 임의로 할당하기 때문에 메모리상 흩어져 있을 가능성이 높음
같은 페이지나 캐시 라인에 있을 확률이 낮아 캐시 미스가 더 자주 발생
이는 물리적 접근 속도 저하로 이어짐
쉽게 말해 스택 변수가 힙 변수보다 접근이 빠른 이유는 스택은 컴파일 시점에 참조에 필요한 값을 가지고 있어 주소 계산이 단순하고(포인터 역참조 없음) 메모리 지역성이 좋아 캐시 효율성이 높기 때문입니다.
그래서 해시맵에서 인스턴스 변수에 참조하기보단, 지역변수를 선언해 일종의 캐싱을 해두어 tab 변수를 사용하게 됩니다 :)