일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- AWS
- 웹소켓
- 도커
- Servlet
- EC2
- docker
- jQuery
- 비트코인
- Cookie
- websocket
- 알고리즘
- RDS
- 블록체인
- express
- HTML
- SQL
- 웹게임
- 암호화
- Ajax
- model1
- JSP
- autowired
- node.js
- CSS
- Spring
- phaser
- tiles.xml
- JavaScript
- PL/SQL
- 배포
- Today
- Total
記錄
JAVA) HashMap에서의 순서 본문
왜 키 값의 변경으로 인해 출력 순서가 바뀌는 것인가? 원래 HashMap자체가 순서를 보장하지 않는다지만 그렇다고 키 값의 변경에 따라 출력이 바뀌는 것도 이상해서 okky에 질문을 했고 좋은 답변들을 얻어서 정리를 한다.
먼저 이유에 대한 탐구를 차치하고 순서를 보장하는 방법은 LinkedHashMap을 활용하는 것이다. (앞서 포스팅에 내용이 포함되어 있다) LinkedHashMap에 element 들을 put 하면 넣으면서 계속 node들이 연결되므로 꺼낼때도 넣은 순서대로 pop되게 된다.
그렇다면 이제 HashMap의 출력 순서가 키 값에 따라 왜 바뀌는지에 대해 알아보겠다
이를 알기 위해서는 먼저 해시코드, 해시함수에 대해서 알아야한다.
해시 함수
[hash function, -函數]
하나의 문자열을 보다 빨리 찾을 수 있도록 주소에 직접 접근할 수 있는 짧은 길이의 값이나 키로 변환하는 알고리듬을 수식으로 표현한 것. 즉, 해싱 함수(hashing function) h(k)는 어떤 키 k에 대한 테이블 주소(table address)를 계산하기 위한 방법으로 주어진 키 값으로부터 레코드가 저장되어 있는 주소를 산출해 낼 수 있는 수식을 말한다. 문자열을 찾을 때 문자를 하나하나 비교하며 찾는 것보다는 문자열에서 해시 키를 계산하고 그 키에 해당하는 장소에 문자열을 저장해 둔다면, 찾을 때는 한 번의 해시 키 계산만으로도 쉽게 찾을 수 있게 된다.
[네이버 지식백과] 해시 함수 [hash function, -函數] (IT용어사전, 한국정보통신기술협회)
해시 코드
[hash code]
해시 함수의 출력 비트 문자열.
[네이버 지식백과] 해시 코드 [hash code] (IT용어사전, 한국정보통신기술협회)
HashMap의 API를 보면 put을 할 때에 hash값을 이용해서 저장한다는 것을 알 수 있다. 따라서 해시코드가 어떤 값을 리턴할 지 모르기 때문에 HashMap은 순서를 보장해주지 못하는 것이다.
그렇다면 맨 위 예시 코드에서 순서를 보장받은 코드는 어떻게 보장 받은 것인가? 이유를 추측하자면 키 값이 너무 너무 단순하기 때문에 해시코드 값도 이에 영향을 받아 결국 출력도 그렇게 이뤄진 것이 아닌가 생각된다.(okky의 도움을 받음)
'Computer language > JAVA' 카테고리의 다른 글
JAVA) JDBC (0) | 2018.03.06 |
---|---|
JAVA) 네트워크(채팅 예제 구현) (0) | 2018.02.21 |
JAVA) HashMap의 value들을 ArrayList에 넣기 (0) | 2018.02.21 |
JAVA) Thread (0) | 2018.02.20 |
JAVA) 직렬화 (0) | 2018.02.20 |