HashMap

 인자로,null값이 허용되는 key,value값을 <K,V>로 허용한다.

해쉬맵의 순서는 정해져있지 않으므로,정해진 순서대로 iterate을 하고 싶다면,LinkedHashMap을 사용할 것

여러 워커 쓰레드를 사용하는 경우, 자동으로 동기화 되지않으므로, synchronized을 해야할 필요가 있다.

Serialzable을 사용하므로, intent로 넘기기에도 유용하다.

1 Map<String, String> map = Maps.newHashMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // b, c, a, k 출력

내부 hash값에 따라서 키순서가 정해지므로 특정 규칙없이 출력됨.

TreeMap

 유저가 제공해주는 comparators 나 키의 natural order에 의해서 sort가된다.

내부 알고리즘서 RedBlack Tree를 사용

Map<String, String> map = Maps.newTreeMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // a, b, c, k 출력

키값이 알파벳 순서대로 정렬된다. 트리에 저장되므로 키값은 일정 기준으로 정렬된 상태로 출력

LinkedHashMap

doulbly-linked list 자료구조로 저장됨

linked-list이므로 넣은 순서대로 빠져나온다.

HashMap과 마찬가지로 다중쓰레드 사용시에 synchronized가 되지 않음.

linked-list와 같이 들어간 순서대로 iterate이 되서 출력이 된다.

1 Map<String, String> map = Maps.newLinkedHashMap();
2 map.put("c", "1");
3 map.put("a", "1");
4 map.put("b", "1");
5 map.put("k", "1");
6 for (String s : map.keySet()) {
7     System.out.println(s);
8 }
9 // c, a, b, k 출력

키값을 입력한 순서대로 출력이 되서 나온다.

 

결론

  • 특별한 이유가 없다면 검색 성능이 좋은(O(1)) HashMap 을 사용하자
  • 키값이 일정한 수준대로 iterate 하려고 한다면 TreeMap 을 사용하자. 하지만 랜덤 접근에 대해서는 O(logn) 성능을 지니므로 많은 데이터를 넣을경우 좋지 않은 성능이 나올수 있다.
  • 입력 순서가 의미있다면 LinkedHashMap 을 사용하자. 랜덤 접근에 대해 O(n) 성능을 지니므로 많은 데이터를 입력할 경우 사용하지 않는것이 좋겠다!

 

출처

 

Java Map - HashMap, TreeMap, LinkedHashMap 차이

Java Map 자바에는 여러 Map 이 있다. 생각없이 아무거나 쓰지말고 차이를 알아보자 HashMap 내부적으로 Entry [] Entry 의 array 로 되어 있다. 해당 array 에 index 는 내부 해쉬 함수를 통해 계산된다. String 은 sun.misc.Hashing.stringHash32 함수를 사용하고 일반 Object는 내부 hashcode 함수와 비트연산으로 계산되어진다. 1 Map map = Maps.newHashMap();

rangken.github.io

  

 

 

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

비공개저장용  (0) 2019.12.06
Set ->hashset, treeset, linkedhashset, sortedset  (0) 2019.11.13
List -> ArrayList,LinkedList,Vector  (0) 2019.11.13
JAVA 기본형과 참조형  (0) 2019.11.13
GIT 과 SVN의 차이 + Git의 Rebase와 Merge  (0) 2019.11.13

SET

 

순서에 상관없이, 어떤 데이터가 존재하는지를 확인하기 위한 용도로 많이 사용된다. 중복되는 것을 방지하고, 원하는 값이 포함 되어 있는지를 확인하는것이 주 용도이다.

  1. HashSet: 순서가 전혀 필요없는 데이터를 해시 테이블 hash table 에 저장한다. Set중에서 가장 성능이 좋다.
  2. TreeSet: 저장된 데이터의 값에 따라서 정렬되는 셋이다. red-black 이라는 트리 tree타입으로 값이 저장되며, HashSet보다 약간 성능이 느리다.
  3. LinkedHashSet:연결된 목록 타입으로 구현된 해시 테이블에 데이터를 저장한다. 저장된 순서에 따라서 값이 정렬된다. 대신 성능이 이 셋 중에서 가장 나쁘다.

 

HashSet

package com.example.test;

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

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		HashSet set = new HashSet();
		
		set.add("달걀");
		set.add("치즈");
		set.add("치킨");
		set.add("피자");
		set.add("치즈");
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		
	}

}

실행 결과 화면

결과 화면을 확인하면 중복되는 Value인 치즈 1개를 제외하고 나머지 4개가 출력된것을 확인 할 수 있다.

확인해보면 HashSet은 순서가 상관없는 데이터를 hash table에 중복된 값을 제외해서 저장하는걸 알 수 있었다.

List<String> list = new ArrayList<String>(set);
Collections.sort(list); 

Set을 정렬이가능하게 List로 변화시켜주고

Collections.sort()를 활용하면 정렬되지 않았던 hashSet도 정렬이 가능하다.

TreeSet

TreeSet은 이진검색트리(binary search tree)라는 자료구조의 형태로 데이터를 저장하는 컬렉션 클래스 이다. 이진 검색 트리는 정렬, 검색, 범위검색에 높은 성능을 보이는 구조로 TreeSet은 이진 검색트리의 성능을 향상 시킨 레드-블랙-트리로 구현되어있다. 

또한 위의  Set인터페이스로 구현했기 때문에 중복된 데이터의 저장을 허용하지 않으며, 저장 순서또한 유지 하지 않는다. 값의 순서에따라 정렬해준다

package com.example.test;

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

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		TreeSet set = new TreeSet();
		
		for(int i=15; i>0;i--) {
			set.add(i);
		}
		set.add(-3);
		set.add(-4);
		set.add(15);
		set.add(11);
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.println(it.next());
		}
		
		
	}

}

TreeSet 결과창

위의 사진을보면 -4~15까지 정렬되서 출력되는것을 확인 할 수있다.

여기서 위의 TreeSet을 HashSet으로 다시돌려보면 

HashSet결과창

음수를 구분하지 못한채로 정렬되어있는것을 확인 할 수있다.

 

또한 subSet을 통한 탐색도 가능하다

System.out.println(set.subSet(1,5));

통해서  1부터 5미만의 수를 출력하거나 String Value값을 통해 원하는 단어가 포함된 값도 탐색이 가능하다.

Compareble 인터페이스로 구현하여 정렬하는법

package com.example.test;

 class Student implements Comparable<Student> {
	private String name;
	private int point;

	public Student(String name, int point) {
	
		this.name = name;
		this.point = point;
	}

	public String getName() {
		return name;
	}

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

	public int getPoint() {
		return point;
	}

	public void setPoint(int point) {
		this.point = point;
	}
	
	@Override
	public int compareTo(Student student) {
	
		return this.point -student.point; //점수로 비교하기위함 오름차순 순 (내림차순은 반대)
	}

	@Override
	public String toString() {
		return " [name=" + name + ", point=" + point + "]";
	}

}

Student클래스를 만들어 Comparable을 구현받아준다. Stduent클래스는 TreeSet이 삽입될때 오버라이딩된 compareTo 메소드를 이용하여 정렬을 진행한다.

 

package com.example.test;

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

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		TreeSet<Student> set = new TreeSet<Student>();
		
		set.add(new Student("A",100));

		set.add(new Student("B",120));

		set.add(new Student("C",130));

		set.add(new Student("D",140));

		set.add(new Student("E",110));
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.print(it.next()+" ");
		}
		
	
		
	}

}

결과 화면

결과창을보면 point의 점수순으로 정렬된것을 확인 할 수있었다.

 

linkedhashset

linkedHashSet도 set인터페이스를 참조하므로 중복된 데이터를 저장할수없다. 또한 입력한 순서되로 저장이 되는 특징이있다.

package com.example.test;

import java.util.Iterator;
import java.util.LinkedHashSet;
import java.util.TreeSet;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SetTest {

	public static void main(String[] args) {
		SpringApplication.run(SetTest.class, args);
		
		LinkedHashSet<Student> set = new LinkedHashSet<Student>();
		
		set.add(new Student("A",100));
        
      	  set.add(new Student("C",130));

		set.add(new Student("B",120));

		set.add(new Student("D",140));

		set.add(new Student("E",110));
		
		Iterator it = set.iterator();
		
		while(it.hasNext()) {
			System.out.print(it.next()+" ");
		}
		
	
		
	}

}

LinkedHashSEt결과화면 

 위의 결과창을보면  A C B D E 가 순서대로 출력된것을 확인 할 수있었다.

sortedset

SortedSet은 컬렉션중 하나로 Collection이기도 하며 Set이기도 하다.

실제로 SortedSet은 Set을 상속한 인터페이스이다. 이 이유로 Set에서 할 수있는 모든 메소드 호출을 SortedSet에서도 사용이 가능하다.

또한 SortedSetd은 Set과 다른점이 있다면 Set은 객체의 순서를 상관하지 않고 객체의 중복여부에만 관심을 갖는데 반해 SortedSet은 객체의 중복여부뿐만 아니라 객체 끼리의 순서에도 관심을 갖고 있다.

물론 SortedSet에 있는 객체끼리의 순서가 있다고 해서 List처럼 지정한 위치에 객체를 넣을수 있는건 아니다. 객체의 순서에 관심이 있다는것은 iterator을 통해서 객체를 탐색할 때 적절한 순서에 따라 객체를 얻어내는 것이다.

 

 

  SortedSEt
Comparator comparator()

SortedSet Comparator를 구합니다.

SortedSet이 객체의 Natural Ordering을 이용해서 객체

순서를 정하고 있다면 null

그외 SortedSet Comparato

Object first() SortedSet의 첫번째 객체를 구합니다.
SortedSet     headSet(Object to)

SortedSet to 객체보다 작은 객체의 부분으로 구성한

SortedSet을 구합니다.

Object last() SortedSet의 마지막 객체를 구합니다.
SortedSet subSet(Object fromElement, Object toElement)

SortedSet toElement(포함)보다 크고,

fromElement(제외)보다 작은 객체로 구성한 SortedSet




SortedSet tailSet(Object fromElement)

SortedSet fromElement(포함)보다 큰 객체로

구성한 SortedSet

SortSet을 사용할때 유의할점!

  • SortedSet에 포함된 객체가 Comparable 인터페이스를 구현한 객체이거나
  • Comparator인터페이스를 구현한 객체여야 한다

 

 

[자바] SortedSet 사용법

SortedSet 사용법에 대해서 알아보록 하겠습니다. SortedSet은 원소들이 정렬되어 있는 Set입니다.따라서 SortedSet 하여금 객체 간 대소 비교가 가능한 상황을 만들어줘야 합니다.여기서 “객체 간 대소 비교가 가능한 상황”이란 다음 2가지로 생각해볼 수 있습니다. Comparable 인터페이스를 구현하고 있는 클래스의 객체를 원소로 사용

www.daleseo.com

SortedSet사용예제가 간단히 나와있는 사이트

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

비공개저장용  (0) 2019.12.06
Map- HashMap,TreeMap,LinkedHashMap 비교하기  (0) 2019.11.13
List -> ArrayList,LinkedList,Vector  (0) 2019.11.13
JAVA 기본형과 참조형  (0) 2019.11.13
GIT 과 SVN의 차이 + Git의 Rebase와 Merge  (0) 2019.11.13

 

List 컬렉션

  • List컬렉션은 인덱스 순서로 저장이 되며 중복된 데이터가 저장이 가능하다. 
  • 구조적으로 데이터를 일렬로 늘여놓는 구조를 가진다.
  • 객체를 저장하면 인덱스가 자동으로 부여되고 부여된 인덱스를 통해 데이터의 검색 및 삭제가 가능

List컬렉션을 구성하는 대표적인 클래스들은 ArrayList,Vector,LinkedList 가있다.

 

List서 사용하는 메소드

 

ArrayList

  • ArrayList는 List 인터페이스를 구현한 클래스이다.
  • 설정된 저장 용량보다 많은 데이터가 들어오면 자동으로 용량이 늘어난다.

List<E> 객체명 = new ArrayList<E>([초기 저장용량]);

 초기 저장용량을 생각하면 기본적으로 10의 저장용량을 가진다. E는 제네릭 타입을 의미하는데 생략하면 Object 타입이된다. Object는 모든 데이터 타입을 저장 가능하지만 데이터를 추가하거나 검색할 때 형 변환을 해야 한다. 

  • 자료구조에는 주로 동일한 데이터 타입을 저자앟기 때문에 제너릭타입을 지정하는 것이 좋다.
  • 기본적으로 데이터를 추가 하거나 삭제할 경우에는 인덱스가 한 칸씩 뒤로 밀리거나 당겨진다.

Vector

ArrayList와 동일한 구조를 갖는다. 차이점이라면 Vector는 자동 동기화를 보장하므로 멀티 스레드 환경에서 안정적으로 사용이 가능하다. 하지만 단일 스레드에서는 ArrayList가 성능이 더 좋다. Vector를 생성하는 방법은 다음과 같다.

List<E> list = new vector<e>([초기용량,</e> 증가용량]);

 초기 용량과 증가 용량을 생략하면 기본 값인 0으로 설정된다.

Vector와 ArrayList의 차이점이면 자동동기화를 보장한다는거지만 동기화의 처리가 필요할때는 Vector보다 Collection, synchronizedCollection, synchronizedList,Map을 이용하는게 성능적으로 더낫다.

 

LinkedList

 List의 구현 클래스이므로 ArrayList나 Vector와 사용 방법은 동일하다. 하지만 구조는 다르게 구성되어있다. 위의 컬렉션들은 인덱스로 데이터를 관리하지만 LinkedList는 인접한 곳을 링크하여 체인처럼 관리한다.  LinkedList는 중간의 데이터를 삭제할 때 인접한 곳의 링크만을 변경하면 되기 때문에 중간에 데이터를 추가/삭제하는 경우 처리 속도가 빠르다.

ArrayList와 LinkedList 비교

 

List<E> list = new LinkedList<E>();

상황에 따라 적절한 컬렉션을 사용하면 될거같다. 찾아보니 vector의경우 요즘 JAVA에서는 잘안쓰이는 추세라고한다...

 

+ Recent posts