- HashSet

Set은 집합이다. → 집합의 특징을 가지고 있음을 의미한다.

저장된 값들은 인덱스가 없기 때문에 순서가 고정되어 있지 않다. 

값의 유무 검사 (포함여부) 목적이 있다.

 

집합은 중복되는 원소를 포함할 수 없다.

 

Set은 검색의 목적이 있기 때문에 순서 정보를 관리할 필요가 없다.

따라서 데이터의 크기에 상관없이 검색에 걸리는 시간이 매우 짧다.

반면 ArratList는 인덱스를 관리해야 하기 때문에 상대적으로 시간이 오래 걸린다.

따라서 기능적으로 HashSet과 ArrayList로 구현하는 것에 차이가 없다면 HashSet을 사용하는 것이 좋다.

 

 

.iterator() 

순서가 없던 요소들을 줄을 세우게 한다. (순서를 부여한다.) index는 아님

순서가 부여되면 요소들을 .next()를 통해 하나 씩 가져 올 수 있다.

리턴타입은 Iterator<> 이다.

 

 


HashSet 사용해보기!

 

package hash;

import java.util.HashSet;

public class HashSetTest {
	public static void main(String[] args) {
		// hashSet 선언하기
		HashSet<String> set = new HashSet<String>();
		
		// HashSet에 요소 추가하기
		set.add("Hello");
		set.add("Java");
		set.add("Easy");
		set.add("So");
		set.add("So");
		
		// HashSet 구조 확인
		System.out.println("set 구조  : " + set);
		
		// HashSet 요소 갯수확인하기
		System.out.println("set 갯수 확인  : " + set.size());
		
		//HashSet 요소 포함여부 확인하기
		System.out.println("set 요소 포함 여부 : " + set.contains("Easy"));
		
		// 요소 삭제하기
		set.remove("Hello");
		System.out.println("set 요소 삭제 확인 : " +set);
	}
}

위 코드의 결과

So를 두 번 add 했으나, 하나의 원소만 존재하는 것을 확인 할 수 있다.

그리고 추가한 순서대로 정렬되어 있지 않고 집합의 성질 처럼 아무렇게나 정렬되어 있는 것도 확인 할 수 있다.

 

 

 


iterator 사용해 보기!

 

package hash;

import java.util.HashSet;
import java.util.Iterator;

public class HashSetTest {
	public static void main(String[] args) {
		// hashSet 선언하기
		HashSet<String> set = new HashSet<String>();
		
		// HashSet에 요소 추가하기
		set.add("Hello");
		set.add("Java");
		set.add("Easy");
		set.add("So");
		set.add("So");
		
		// HashSet 구조 확인
		System.out.println("set 구조  : " + set);
		
		// HashSet 요소 갯수확인하기
		System.out.println("set 갯수 확인  : " + set.size());
		
		//HashSet 요소 포함여부 확인하기
		System.out.println("set 요소 포함 여부 : " + set.contains("Easy"));
		
		// 요소 삭제하기
		set.remove("Hello");
		System.out.println("set 요소 삭제 확인 : " +set);
		
		// iterator 선언
		Iterator<String> iter = set.iterator();
		
		while(iter.hasNext()) {
			System.out.println(iter.next());
		}
	}
}

 

위의 HashSet코드에서 마지막에 iterator을 추가하였다.

위 코드의 결과

추가한 순서와 관계없이 출력되는 것을 알 수 있다.

 


- HashMap

Map 구조 : Key(키)와 Value(값)의 한 쌍으로 저장되는 형태를 가지고 있다.

 

검색에 용이하다.

Key는 중복이 불가능하며, Value는 가능하다.

Key는 Set 타입이고, Value는 Collection 타입이다.

 

Map 자료구조는 순서를 따지지 않기 때문에 Set으로 묶은 후 Iterator를 통해서 순서를 부여받은 후 사용한다.

 

 

- HashMap 에서 사용하는 메소드

.keySet() Key들만 모여있는 Set을 리턴한다.
.values() Value들만 모여있는 Collection을 리턴한다.
.entrySet() Key, Value가 있는 Entry들이 모여있는 Set을 리턴한다. 

 

 


HashMap 사용해보기!

 

package hash;

import java.util.HashMap;

public class HashMapTest {
	public static void main(String[] args) {
	 // HashMap 선언
		HashMap<String, String> dict = new HashMap<String, String>();
		
		// HashMap에 요소 추가
		dict.put("duck", "오리");
		dict.put("fly", "날다");
		dict.put("run", "뛰다");
		
		// 구조 확인 하기
		System.out.println("HashMap 확인  : " +dict);
		
		// 요소 수정하기
		dict.put("run", "달리다");
		
		// 요소 삭제하기
		System.out.println("요소 삭제 : " + dict.remove("fly"));
		dict.remove("run", "뛰다");
		// 올바른 쌍을 넘기면 삭제를 하지만, 아니면 삭제되지 않음.
		System.out.println(dict);
		
		// 요소 가져오기
		System.out.println("run : " +dict.get("run"));
		
		// 쌍개수 확인하기
		System.out.println("쌍 개수 확인하기  :  " +  dict.size());
		
		
		
	}
}

위 코드의 결과

요소삭제로 "날다"가 삭제된 것을 확인 할 수 있고,  "달리다"는 올바른 쌍을 넘기지 않았기 때문에 삭제되지 않음을 볼 수 있다.

 

 

 


HashMap 에서 iterator 사용하기!

 

package hash;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Set;

public class HashMapTest2 {
	public static void main(String[] args) {
		// HashMap 선언
		HashMap<String, Integer> map = new HashMap<String, Integer>();
		
		map.put("하나", 1);
		map.put("둘", 2);
		map.put("셋", 3);
		map.put("넷", 4);
		map.put("다섯", 5);
		
		// map에 추가되어 있는 Key값들이 모여있는 Set
		Set<String> keyset = map.keySet();
		
		// 위의 keyset은 set타입임으로 순서가 없어서 iterator로 줄세우기
		Iterator<String> keyiter = keyset.iterator();
		while (keyiter.hasNext()) {
			// 다음값이 있으면 출력
			System.out.println(keyiter.next());
		}
		
		
	}
}

위 코드의 결과

 


 

- 컬렉션 사용 시 주의할 점

컬렉션에서는 요소들을 비교할 때 그 요소 타입의 equals()로 비교하기 때문에 우리가 만든 클래스에 equals()를 재정의하지 않는다면 Object 클래스에 있는 주소값 비교를 하게 되고 같은 요소를 찾아 올 수 없게 된다.

따라서 비교하고자 하는 요소를 올바르게 비교하도록 equals()를 꼭 재정의해서 사용해야 한다.

 

 


- 빠른 for문 (향상된 for문 foreach문)

	for(자료형 변수명 : 컬렉션) {
		변수가 컬렉션 안에있는 요소들을 전부 가져오면서 반복
	}

단순하게 전체 순회를 할 때 아주 간편하게 사용할 수 있다.

순서가 중요한 경우에는 (몇번째에 어떤 값이 있는 알 필요가 있는 경우) 기존의 for문을 사용한다.

 

 


빠른 for문 사용해보기!

package forrr;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map.Entry;
import java.util.Set;

public class ForTest {
	public static void main(String[] args) {
		int [] arData = {10, 20, 30, 40, 50};
		
		// 원래의 for문
		for (int i = 0; i < arData.length; i++) {
			System.out.println("배열 일반 for문 : " + arData[i]);
		}
		System.out.println("-------------------------------");
		
		// 빠른 for문
		for (int data : arData) {
			System.out.println("배열 빠른 for문  : " + data);
		}
		System.out.println("-------------------------------");
		
		// ArarryList 
		ArrayList<String> arMsg = new ArrayList<String>();
		arMsg.add("Hello");
		arMsg.add("Java");
		arMsg.add("Collection");
		arMsg.add("easy");
		
		for (String msg : arMsg) {
			System.out.println("ArraryList 빠른 for문 : " + msg);
		}
		System.out.println("-------------------------------");
		
		// HashSet
		HashSet<Integer> set = new HashSet<Integer>();
		
		set.add(10);
		set.add(20);
		set.add(30);
		set.add(40);
		set.add(50);
		
		for (int number : set) {
			System.out.println("HashSet 빠른 for문 : " + number);
		}
		System.out.println("-------------------------------");
		
		
		// HashMap 
		HashMap<String,Double> map = new HashMap<String, Double>();
		map.put("일", 1.0);
		map.put("이쩜이", 2.2);
		map.put("이쩜일사",2.14);
		
		Set<Entry<String, Double>> entry = map.entrySet();
		
		for (Entry<String, Double> entryset : entry) {
			System.out.println("키 : " + entryset.getKey());
			System.out.println("값 : " + entryset.getValue());
		}
		System.out.println("-------------------------------");
		
		
	}
}

위 코드의 결과

일반 for문 과 동일한 결과를 확인할 수 있다.

복사했습니다!