Java - Hash

CYSSSSSSSSS·2024년 4월 29일
0

자바

목록 보기
25/26

Java

Hash

HashTable

  • 키(Key)와 데이터(value)를 매핑할 수 있는 데이터 구조
  • 해쉬 함수를 통해 키에 대한 데이터를 저장할 수 있는 구조
  • ex) 이름(key)에 맞는 전화번호(value)
  • key에 맞는 주소를 리턴해주는 구조이다.
  • 배열과는 다르게 Key로 값을 찾기 때문에 데이터를 조회하는데 탐색 속도가 빠르다.
  • 각각의 데이터가 저장되는 공간을 slot이라고 한다.

HashTable 구현

  • Slot에 키는 문자열로 입력 받은 데이터의 맨 앞글자를 HashTable의 길이로 나누어진 값을 HashFunction 값으로 잡는다.
package hash;

public class MyHash {
    public Slot[] hashTable;    // 해쉬 테이블을 담는 공간

    public MyHash(Integer size){    // 해쉬 테이블의 크기를 정하는 함수
        this.hashTable = new Slot[size];
    }

    public class Slot{
        String value;
        Slot(String value){     // 생성자
            this.value = value;
        }
    }

    public Integer hashFunction(String key){
        return (int)(key.charAt(0) % this.hashTable.length); //  해시 테이블의 길이의 맞는 key 값을 반환
    }

    public boolean saveData(String key , String value){
        Integer address = this.hashFunction(key);   // 위에 선언한 해시 function을 통해 key를 가져오고
        if (this.hashTable[address] != null){       // key에 해당하는 value가 존재하지 않은 경우
            this.hashTable[address].value = value;  // 기존의 값을 변경
        }else{                                      // key에 해당하는 value가 존재하는 경우
            this.hashTable[address] = new Slot(value);  // 새로운 값을 추가
        }
        return true;
    }

    public String getData(String key){
        Integer address = this.hashFunction(key);
        if(this.hashTable[address]!= null){
            return this.hashTable[address].value;   // 현재 존재하는 해쉬 테이블의 값을 리턴
        }else{
            return null;
        }
    }

}

HashTable 장단점

장점

  • 데이터 저장/읽기 속도가 빠르다.
  • 해쉬는 키에 대한 데이터가 있는지 (중복) 확인이 쉽다.
    단점
  • 저장공간이 많이 필요하다.
  • 여러 키에 해당하는 주소가 동일할 경우 충돌 방지를 위한 자료구조가 필요하다.

HashMap

  • 데이터를 저장할때 Key와 Value가 짝을 이루어 저장하는 Map을 말한다.
  • HashMap은 키값을 통해서만 검색이 가능하고 HashMap의 키는 중복될수 없고 Value는 Key가 다르다면 중복이 가능하다.

HashMap 생성

package hash;

import java.util.HashMap;

public class HashMap1 {
    public static void main(String[] args) {
        HashMap<String , Integer> hashMap = new HashMap<>();    // HashMap<Key,Value>으로 선언하고 Key와 Value의 타입을 지정해 줘야 한다.
    }
}
  • HashMap에는 capacity라는 데이터 저장 크기를 지정하는 변수가 있는데 값을 지정 안해주면 16입니다.
  • load factor는 저장공간이 일정 %이상 채우면 추가로 저장공간을 확보하는 변수 입니다.
  • 만약 크기를 지정하지 않으면 16의 크기를 유지하고 더 많이 받고 싶으면 크기를 지정해 줘야 합니다.

HashMap insert

HashMap.put(K key , V value)

  • key와 value를 저장하다.

void putAll(Map <?extends K , ?extends V>m

  • Map m의 데이터를 전부 저장합니다.

V putIfAbsent

  • 기존 데이터에 key가 없으면 key와 value를 저장한다.
package hash;

import java.util.HashMap;
import java.util.Map;

public class HashMap1 {
    public static void main(String[] args) {
        HashMap<String , Integer> hashMap = new HashMap<>();    // HashMap<Key,Value>으로 선언하고 Key와 Value의 타입을 지정해 줘야 한다.
        Map<String,Integer> map = new HashMap<>();
        // add
        hashMap.put("user1" , 111);
        hashMap.put("user2" , 112);
        hashMap.put("user3" , 113);

        map.put("user4",114);
        map.put("user5",115);
        map.put("user6",116);

        hashMap.putAll(map);

        hashMap.putIfAbsent("user7",117);   // 해당 key가 없는 경우에 추가      
    }
}

HashMap Delete

clear

  • 모든 데이터를 삭제한다.
    remove(Object key)
  • key에 해당하는 데이터를 삭제합니다.
    remove(Object key , Object value)
  • key와 value가 둘다 일치하는 데이터를 삭제합니다.
package hash;

import java.util.HashMap;
import java.util.Map;

public class HashMap1 {
    public static void main(String[] args) {
        HashMap<String , Integer> hashMap = new HashMap<>();    // HashMap<Key,Value>으로 선언하고 Key와 Value의 타입을 지정해 줘야 한다.
        Map<String,Integer> map = new HashMap<>();
        // insert
        hashMap.put("user1" , 111);
        hashMap.put("user2" , 112);
        hashMap.put("user3" , 113);

        map.put("user4",114);
        map.put("user5",115);
        map.put("user6",116);

        hashMap.putAll(map);

        hashMap.putIfAbsent("user7",117);   // 해당 key가 없는 경우에 추가

        // delete
        hashMap.remove("user1"); // key에 해당하는 값을 삭제
        System.out.println(hashMap.remove("user2" , 112));  // key랑 value가 둘다 일치하는 값 삭제후 성공하면 true 리턴
        System.out.println(hashMap.remove("user8" , 112));  // false 리턴 
		hashmap.clear(); //  map에 존재하는 모든 값 삭제 

    }
}

HashMap update

replace(K key , V value)

  • key와 일치하는 기존 데이터의 value를 변경합니다.
    replace(K key , V oldvalue , V newValue)
  • key와 oldvalue가 동시에 일치하는 데이터의 value를 newvalue로 변경한다.
        // update
        hashMap.replace("user3" , 119);
        hashMap.replace("user4" , 114 , 120);

HashMap contains

boolean containsKey(Object key)

  • key에 일치하는 데이터가 있으면 true / 없으면 false
    boolean containsValue(Object value)
  • value가 일치하는 데이터가 있는지 여부 있으면 true / 없으면 false
    boolean isEmpty()
  • 데이터가 빈 상태인지의 여부를 판별
    int size()
  • Key-Value의 개수를 반환하는 함수
        hashMap.put("user1" , 111);
        hashMap.put("user2" , 112);
        hashMap.put("user3" , 113);

        hashMap.put("user4" , 114);
        hashMap.put("user5" , 115);
        hashMap.put("user6" , 116);

        System.out.println(hashMap.containsKey("user1"));
        System.out.println(hashMap.containsKey("user0"));
        System.out.println(hashMap.containsValue(111));
        System.out.println(hashMap.containsValue(110));

        System.out.println(hashMap.isEmpty());
        System.out.println(hashMap.size());

HashMap get

V get(Object key)

  • key와 맵핑되는 value값을 반환한다.

V getOrDefault(Object key , V defaultValue)

  • key에 해당하는 value값을 반환하고 없다면 defaultValue를 리턴한다.

Set<Map.Entry<K,V>> entrySet()

  • 모든 key-value 맵핑 데이터를 가진 set 데이터를 반환한다.

Set keySet()

  • 모든 Key값을 가진 Set 데이터를 반환한다.

Collection values

  • 모든 value값을 가진 Collection 데이터를 반환한다.
        // get
        System.out.println(hashMap.get("user1"));
        System.out.println(hashMap.getOrDefault("user10",999));
        Set<Map.Entry<String, Integer>> data = hashMap.entrySet();
        System.out.println(data);   // key-value를 set으로 리턴
        System.out.println(hashMap.keySet());   // 키만 리턴
        System.out.println(hashMap.values());   // 값만 리턴
profile
개발자 되고 싶어요

0개의 댓글

관련 채용 정보