본문 바로가기
Tech/Java

Java collection - Set

by Augustine™ 2018. 5. 9.
반응형

Java Collection은 객체 그룹을 나타내며, 저장 및 검색 방법에 따라 Set, Map, List 로 나뉘어진다.

간단히 요약하면 Set에는 중복 값을 허용하지 않으며, 

Map은 키와 값 유형의 데이터 형태로 제공된다.

그리고, List는 인덱스 위치에 값을 순차적으로 저장하는데 사용된다.


그림으로 인터페이스와 구현 클래스 관계를 정리하자면 아래와 같다.

먼저 Set 부터 알아보자.

 HashSet은 빠른 접근 속도를 가지는 반면에 중복 저장이 허용되지 않는다. 또한, 객체(데이터)를 인덱스로 관리하지 않기 때문에, 저장 순서를 보장하지 않는다.

HashSet은 객체를 저장하기 전, hashCode() 를 호출하여 이미 저장되어 있는 객체들의 해시코드와 비교한다.

만약 동일한 해시코드가 있다면 equals() 을 호출해서 두 객체를 비교해 참이면 동일한 객체로 저장하기 때문에 중복 저장을 허용하지 않는다.

아래는 그 예시.

package com.autugtine;

import java.util.HashSet;
import java.util.Set;

public class CollectionTest {

	public static void main(String args[]){
		Set setA = new HashSet();
		
		setA.add(new Person("Mike", 20));
		setA.add(new Person("Mike", 20));
		setA.add(new Person("Mike", 10));
		
		System.out.println("setA count is "+setA.size());
	}
	
}

class Person {
	private String name;
	private int age;
	
	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result + age;
		result = prime * result + ((name == null) ? 0 : name.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
		} else if (!name.equals(other.name))
			return false;
		return true;
	}
	
	
}



 LinkedHashSet 은 Set의 Interface를 구현한 클래스로서, 중복된 데이터를 저장할 수 없다. 

단, 입력된 순서대로, 데이터 관리가 가능하다.

아래는 예시.

package com.autugtine;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.Set;

public class LinkedHashSetTest {
	public static void main(String args[]){
		Set setA = new LinkedHashSet();
		
		setA.add("Java");
		setA.add("Python");
		setA.add("PHP");
		
		Iterator it = setA.iterator();
		while(it.hasNext()){
			System.out.println(it.next());
		}

	}

}


 TreeSet도 중복된 데이터를 저장할 수 없고, 입력한 순서대로 값을 저장 순서를 보장하지 않는다.

다만, TreeSet은 기본적으로 오름차순으로 데이터를 정렬한다.

아래는 예시.

package com.autugtine;

import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;

public class TreeSetTest {
	
	public static void main(String args[]){
		
		Set setA = new TreeSet();
		setA.add("James1");
		setA.add("Dornald");
		setA.add("Augustine");
		
		Iterator it = setA.iterator();
		while (it.hasNext()) {
			System.out.println(it.next());
		}
		
		Set setB = new TreeSet();
		setB.add(3);
		setB.add(1);
		setB.add(2);
		
		Iterator it2 = setB.iterator();
		while (it2.hasNext()) {
			System.out.println(it2.next());
		}
	}
}



 


반응형

'Tech > Java' 카테고리의 다른 글

Observer Design Pattern  (0) 2019.03.14
Selenium WebDriver  (0) 2019.03.07
JVM의 메모리 구조  (0) 2018.05.04
Java Synchronized을 이용한 트랜잭션 예제  (0) 2018.04.26
Thread 예제  (0) 2018.04.25

댓글