[Java] HashMap을 쓸 것인가 Hashtable을 쓸 것인가??

No Comments

몇 년 동안 Java를 손에서 놓았고 C++을 하다 최근 다시 Java를 하려니 적응하기가 힘들다. Eclipse와 함께 너무나 편안하고 설계까지 깔끔하게 잘되었다고 생각이 들면서도 가끔 어떤 부분들은 (생각해보고 또 생각해보면 맞지만) 이해가 쉽지 않은 부분도 있다.

아무튼 std::map을 대처하기 위해 HashMap을 쓸 것인가? Hashtable을 쓸 것인가?

예전에 별생각도 안 하고 먼저 떠오르는 데로 쓴 것 같다.

결론부터 말하면 (예전에 그랬던 것처럼) 별생각 없이 쓴다면 HashMap을 쓰면 될 것이다.

그리고 HashMap과 Hashtable의 Java Doc을 보고 정리하면,

HashMap 기준에서 Hashtable과 비교하면

1. HashMap은 key와 value에 null을 허용하지만 Hashtable은 그렇지 않다.

2. HashMap은 thread safe하지 않고 (not synchronized) Hashtable은 그렇다 (synchronized). 진정한 Java인이라면 미래를 위해 Hashtable을 쓰는 게 맞을 것 같기도 하다.
HashMap 자체는 not synchronized하기 때문에 다음과 같이 Collection.synchronizedMap을 이용해서 synchronized하게 만들 수 있다.

Map m = Collections.synchronizedMap(new HashMap(...));

3. HashMap은 bucket에 element들을 흩어뿌리기 때문에 get/put과 같은 기본 동작들이 동일한 시간 (constant-time performance) 에 수행된다.

HashMap과 Hashtable에서 둘 다 고려할 사항은

1. capacity와 load factor

Capacity는 bucket의 수이고 load factor는 bucket의 element가 얼만큼 찼을 경우 rehash를 발생 시킬 것인지를 정하는 것이다. rehash의 경우는 bucket의 수가 두 배로 늘어나고 각 element에 대해서 hash가 다시 일어나는 것을 의미하기 때문에 이 것은 시간-공간의 trade-off가 있다.

Load factor는 0.75를 HashMap과 Hashtable에서 둘다 ideal number로 권장하고 default value이다.

Capacity는 HashMap은 default value가 16이고 Hashtable은 11이다.

생성할 때 아주 많은 (얼만큼인지는 제시하지 않고 있다) element가 삽입될 것이라면 capacity를 초기에 높게 잡는게 좋을 것 같다.

2. ConcurrentModificationException

Iterator를 얻은 후에 Iterator를 통하지 않고 외부에서 element가 삭제되거나 추가되면 ConcurrentModificationException이 발생한다 (fail-fast라고 한다. 문제가 생기면 바로 보고하는 것으로 fail-stop이라고 한다). 당연한 말이겠지만, fail-fast로 인한 exception handling을 통해 기능을 수행하는 코드를 작성하지 말고 말 그대로 bug를 찾기 위해 이를 이용해라고 한다.

아무튼 오래 만에 JavaDoc을 자세히 읽어 본거 같다. 프로그램에서 많은 것들이 중요할 것이고 그 중 자료 구조 (특히 자바와 같은 언어에서)도 많은 것을 고려해야 하기에 포스트를 지루하게 써보았다.

“별 생각 없이 쓴다” 라는 말 자체를 이미 거론해 버렸지만 그리고 그 목적으로 HashMap을 거론했지만, “별 생각 없이 쓴다” 라는 말 자체는 (그리고 그 “별 생각 없이 쓴 것”들이 많아 질 수록) 미래의 재앙을 키워가는 것이기 때문에 지양 해야 할 것이다.

[Ref]

HashMap Java Doc SE6: http://java.sun.com/javase/6/docs/api/java/util/HashMap.html

Hashtable Java Doc SE6: http://java.sun.com/javase/6/docs/api/java/util/Hashtable.html

Fail-fast (Fail-stop): http://en.wikipedia.org/wiki/Fail-fast

인도 친구들과 함께한 비오는 토요일

10 Comments

캐논 40D를 사고 처음으로 우리 부부 외에 다른 사람의 사진을 찍었다.

(렌즈는 와이프가 학창 시절 때 쓰던 28-105 -_-; )

작년 부터 같이 일해온 인도 친구 Lohith와 그의 친구 4명 (이름을 들었으나 역시 이름은 기괴하다)과 함께 서울을 이리 저리 돌아다니며 몇 장의 사진을 찍었다.

주말에 딱 맞춰 온 비 덕분에 거의 사진을 찍지 못했다. ㅜ.ㅜ.

이태원에 있는 챠크라에서의 Lohith 모습

이태원에 있는 인도 식당 (챠크라)에 갔었는데 몇 가지만 빼고는 정말 맛있었다. 특히 소고기!!!

청담동에 있는 챠크라 보다 괜찮고 수원에 있는 챠크라 보다는 1000배 괜찮았다.

왼쪽이 Vimal이고 가운데가 상태 않좋은 나, 오른쪽이 Vimal이다.

인당 14,000원이었는데 가이드 해줘서 고맙다고 그들이 십시일반 해서 사줬다.

-_-; 사실은 그들이 나보다 더 많은 장소를 이미 가봤다.

이태원에서 강남으로 가기 위해 지하철을 탔다. 지하철이 아주 편하고 잘 만들어져있다고 했다. 인도에도 뱅갈로 등 몇 몇 도시에 지하철이 있고 생기고 있으나 교통 지옥을 해소할 만큼은 안된다고 한다.

강남역에 있는 교보문고에 갔다가 목이 너무 말라 베스킨 라빈스에 갔다.

왼쪽부터 Vimal, Bala, Lohith, Servanan, Jenny.

교보 문고의 외국 책들 중 소설류가 평균 8~9달러 정도 했는데, 인도에서는 5~6달러에 살 수 있고 복사 본의 경우는 1달러 정도에 살 수 있다고 한다.

그래도 한 두 권씩 소설을 샀다.

-_-;; 한국어로 번역되었던 책들 중 재미있게 읽었던 것들이 몇 권 보여서 추천해줬다. 흐흐.

[OSGi] OSGi와 Equinox 관련 Reference

3 Comments

2003년부터 인연이 생겨 (꾸준히는 아니지만) OSGi를 경험하고 있다.

Home이나 Mobile, Automobile등을 위한 networking의 platform 뿐만 아니라 Application Framework (e.g. Eclipse)으로써도 훌륭하다.

참고 자료 몇 가지를 포스팅한다.

* Equinox Project Homepage
    http://www.eclipse.org/equinox/

* Equinox osgi download
    http://download.eclipse.org/eclipse/equinox/

* OSGi Home Page
    http://www.osgi.org/Main/HomePage

* Eclipse 사용자 공간으로 OSGi 관련 좋은 내용도 많다.
   http://www.eclipsezone.com

[eclipse] ClearCase plug-in

21 Comments

Eclipse의 ClearCase plug-in 중 아래 플러그인이 심플하고 괜찮은 것 같다.

Eclipse ClearCase Integration

물론, mylyn (trac), svn을 쓰고 있지만.. CC도 써야하는 상황이라…

[여행] 시아홀리데이로 싱가폴을 여행을 (무료 브로슈어와)

2 Comments

싱가폴 항공에서 제공하는 시아홀리데이 (에어텔)로 정말 괜찮은 가격으로 싱가폴을 여행할 수 있다고 한다.

여행을 많이 다녀본 회사 동료가 추천하는 싱가폴 그리고 시아홀리데이~
http://cafe.daum.net/tonysing/EUOq/818

그 중 city hall 근처에 있는 아래 세 호텔을 추천했다.

ALLSON
위치 좋음
시내(CityHall 근처)

CARLTON
위치가 좀더 좋음
시내(CityHall 근처)

PENNINSULA EXCELSIOR (볼드가 좋은 동)한국사람이 제일 많이 감

아래 사이트에서 브로슈어도 무료로 받아 볼 수 있다.
http://www.visitsingapore.or.kr/

Older Entries