예제 코드를 보면 첫째 줄에서 hashMap변수를 선언 및 초기화할 때, key와 value의 타입을 지정해주었다. HashMap다음 꺽새('<', '>')안에 첫번째로 오는 것이 key가 될 값의 타입을 지정해 준 것이며, 두번째로 오는 것이 value의 타입을 지정해 준것이다.
따라서 세번째 줄을 분석하자면, hashMap에 "str0"문자열을 저장하면서 그 값의 '키'값으로 숫자 0을 할당시키고 있다.
해당 "str0"문자열을 hashMap변수로부터 가져오려면 아래와 같이 키값을 이용해 가져오면된다. hashMap.get(0); // * 여기서 0은 배열이나 list계열 컬렉션에서 쓰이는 인덱스(index)가 아니다.
HashMap에서 기본적으로 사용되는 메소드들은 다음과 같다. hashMap.put(key, value); hashMap.get(key); hashMap.remove(key); hashMap.clear();
HashSet<String> hashSet = new HashSet<String>();
hashSet.add("str0");
hashSet.add("str1");
hashSet.add("str2");
hashSet.add("str3");
hashSet.add("str2");
System.out.println(hashSet.toString());
hashSet.remove("str0");
System.out.println(hashSet.toString());
int i = hashSet.size();
System.out.println("사이즈 : "+ i);
결과는 아래와 같다. {str3, str1, str2, str0} {str3, str1, str2} 사이즈 : 3
순서가 없으므로 add() 메소드를 이용해 데이터를 넣는 것과 상관없이, 데이터가 뒤죽박죽 들어간다.
위의 예제에서는 HashSet이 기초자료형인 String타입으로 만들어져 똑같은 문자열"str2"을 두번 add할 때, 자동으로 걸려졌으나 객체자료형으로 HashSet을 사용할 때는 주의가 필요하다.
이미지를 보면, 이름이 이순신이고 학년이 6인 학생(객체자료형)을 HashSet에서 remove메소드를 이용하려 제거 하려고 하였으나 지워지지 않은 것을 확인할 수 있다.
이는 처음에 hashSet변수에 add메소드를 이용하여 만들어진 "이순신"학생과 remove하기 위해 새로 new 생성자를 이용하여 만들어진 "이순신"학생은 서로 다른 주소값을 가지고 있기 때문이다.
때문에 다음과 같은 방법을 이용한다.
우측의 빨간 네모상자 안과 같이 equals와 hashCode를 내가 만든 객체에 오버라이드 해준다. 그러고 나면 remove메소드 호출 시 정상적으로 제거되는 것을 확인할 수 있다.
equals에서는 새로 들어온 object의 toString값과 현재 가지고 있는 객체의 toString값을 비교하여 return하고, hashCode는 해당 객체의 hashCode를 정수형으로 뽑아주는 역할을 한다. hashCode와 equals를 재정의 해줌으로써 두 객체가 같다고 보도록 만든것이다.