양봉수 블로그
  • Introduction
  • Cookie SameSite
  • Connection Reset
  • 자주쓰는 쉘스크립트 모음
  • Tshark
  • 네트워크프로그래밍
  • [Spring 개발 이슈모음]
    • issue1 ~ issue21
    • issue22 ~
  • [Java8 in Action]
    • Part1 기초
    • Part2-1 함수형 데이터 처리
    • Part2-2 함수형 데이터 처리
    • Part3-1 효과적인 자바8 프로그래밍
  • [Effective Java]
    • 객체의 생성과 삭제
    • 모든 객체의 공통 메서드
    • 클래스와 인터페이스
    • 제네릭
    • 열거형(enum)과 어노테이션
    • 람다와 스트림
    • 메서드
    • 일반적인 프로그래밍 원칙들
    • 예외
    • 병행성
    • 직렬화
  • 토비의 스프링3.1
    • 정의, IoC DI개념, Bean 라이프사이클
    • 오브젝트와 의존관계
    • 테스트
    • 템플릿
    • 예외
    • 서비스 추상화
    • AOP
    • 스프링 핵심 기술의 응용
    • 스프링 프로젝트 시작하기
    • IoC 컨테이너와 DI
  • [자바 성능 튜닝 이야기]
    • 내가 만든 프로그램의 속도를 알고 싶다
    • 왜 자꾸 String을 쓰지 말라는거야?
    • 어디에 담아야 하는지
    • 지금까지 사용하던 for 루프를 더 빠르게 할 수 있다고?
    • static 제대로 한번 써 보자
    • 클래스 정보 어떻게 알아낼 수 있나
    • 로그는 반드시 필요한 내용만 찍자
  • [대용량 아키텍처와 성능 튜닝]
    • 레퍼런스 아키텍처
    • 마이크로 서비스 아키텍처
    • REST의 이해와 설계
  • 켄트백 구현패턴
  • 클린코드
  • 클린코더스 강의 정리
  • 클린아키텍처
  • 네이버를 만든 기술, 자바편
  • 객체지향의 사실과 오해
  • 객체지향과 디자인패턴
  • 소프트웨어 품질관리(NHN은 이렇게한다)
  • 웹프로그래머를 위한 서블릿 컨테이너의 이해
  • 웹을 지탱하는 기술
  • 마이바티스를 사용한 자바 퍼시스턴스 개발
  • HashMap 효율적으로 사용하기
  • 자바의 정석
  • 슈퍼타입토큰(Super Type Token)
  • Singleton
  • Identity
  • Finalizer attack
  • Git Flow
  • nginx gzip 옵션
  • JUnit+Mockito vs Groovy+Spock
  • Apache and Tomcat
  • Understanding The Tomcat Classpath
  • 실용주의프로그래머 익스트림프로그래밍
  • 애자일적용후기
  • Living Documentation
  • specification by example
  • 확률과 통계
  • Multivariate Distributions
  • 가설검정
  • 단순회귀분석
Powered by GitBook
On this page
  • HashMap의 Key, Value 출력
  • 모든 Key값 출력
  • 모든 Value값 출력
  • Key, Value 함께 출력
  • Key 중복 확인
  • computeIfAbsent() VS puIfAbsent()
  • computeIfPresent() VS compute()
  • getOrDefault()

Was this helpful?

HashMap 효율적으로 사용하기

HashMap의 Key, Value 출력

//create a map in java 11
var productPrice = new HashMap<String, Double>();
//or in java 8
Map<String, Double> productPrice = new HashMap<>();
// add value
productPrice.put("Rice", 6.9);
productPrice.put("Flour", 3.9);
productPrice.put("Sugar", 4.9);
productPrice.put("Milk", 3.9);
productPrice.put("Egg", 1.9);

//get value
Double egg = productPrice.get("Egg");

모든 Key값 출력

Set<String> keys = productPrice.keySet();
//print all the keys
for (String key : keys) {
    System.out.println(key);
}
Set<String> keys = productPrice.keySet();
keys.forEach(key -> System.out.println(key));
Set set = productPrice.keySet();
Iterator iterator = set.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

모든 Value값 출력

Collection<Double> values = productPrice.values();
for (Double value : values) {
    System.out.println(value);
}
Collection<Double> values = productPrice.values();
values.forEach(value -> System.out.println(value));
Collection values = productPrice.values();
Iterator iterator = values.iterator();
while (iterator.hasNext()) {
    System.out.println(iterator.next());
}

Key, Value 함께 출력

Set<Map.Entry<String, Double>> entries = productPrice.entrySet();
for (Map.Entry<String, Double> entry : entries) {
    System.out.print("key: "+ entry.getKey());
    System.out.println(", Value: "+ entry.getValue());
}
productPrice.forEach((key, value) -> {
    System.out.print("key: "+ key);
    System.out.println(", Value: "+ value);
});
Set set = productPrice.entrySet();
Iterator it = set.iterator();

while (it.hasNext()) {
    Map.Entry e = (Map.Entry)it.next();
    System.out.println(e.getKey() + e.getValue());
}

Map은 Iterator가 없기 때문에 entrySet() 메서드를 통해 Set에 key와 value 결합한 형태로 저장시킨다. 그리고 Map 내부 인터페이스인 Map.Entry를 통해 key와 value를 얻어온다. entrySet()을 이용해서 key와 value를 함께 읽어 올수도 있고 keySet()이나 values()를 이용해서 키와 값을 따로 읽어 올 수 있다. key는 중복을 허용하지 않으니까 Set타입으로 반환하고 value는 중복을 허용하니까 Collection 타입으로 반환한다.

Key 중복 확인

if (productPrice.containsKey("Rice") ) {
    ...
} else {
    ...
}

cf) Map에서 키가 중복되면 기존의 값을 덮어쓴다.

computeIfAbsent() VS puIfAbsent()

var theKey = "Fish";
// key값이 이미 존재하면 callExpensiveMethodToFindValue 메서드는 호출되지 않는다.
productPriceMap.computeIfAbsent(theKey, key -> callExpensiveMethodToFindValue(key));

// key값이 이미 존재해도 callExpensiveMethodToFindValue 메서드는 호출된다.
productPriceMap.putIfAbsent(theKey, callExpensiveMethodToFindValue(theKey));

computeIfPresent() VS compute()

오라클이 Java EE를 Eclipse Foundation에 기부 한 사실은 모두 알고 있으며, 결과적으로 Jakarta EE로 이름이 바뀌었다. 이 주제에 관한 기사를 제공하는 프로그램을 작성하고 단어 선택 빈도를 계산하여 사람들이이 단어를 얼마나 자주 언급하고 있는지 알아보자.

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

public class WordFrequencyFinder {
    private Map<String, Integer> map = new HashMap<>();

    {
        map.put("Java", 0);
        map.put("Jakarta", 0);
        map.put("Eclipse", 0);
    }

    public void read(String text) {
        for (String word : text.split(" ")) {
            if (map.containsKey(word)) {
                Integer value = map.get(word);
                map.put(word, ++value);
            }
        }
    }
}

text 문자열을 쪼개서 map에 key값으로 있는 단어들이 있으면 value를 증가시키는 간단한 코드다. 자바8에서는 computeIfPresent 메서드를 통해 더 간단하게 표현할 수 있다.

public void read(String text) {
  for (String word : text.split(" ")) {
    map.computeIfPresent(word, (String key, Integer value) -> ++value);
  }
}

computeIfPresent 메서드는 key와 remapping function 두개의 인자를 갖는다. 그래서 key가 있을 때만 value를 compute한다. Map에는 compute 메서드도 존재하는데 key값이 있든 없든간에 무조건 remapping function을 compute한다.

getOrDefault()

key값이 없을 때도 value를 얻길 원할 때 사용된다.

productPriceMap.getOrDefault("Fish", 29.4);
Previous마이바티스를 사용한 자바 퍼시스턴스 개발Next자바의 정석

Last updated 5 years ago

Was this helpful?

원문 : 참고 : 자바의 정석

https://dzone.com/articles/how-to-use-java-hashmap-effectively?fbclid=IwAR1ZMb6aImx-7Ry-GD6S-YfxdDkrRvlSo-SlSVL08gRDxWP_zilcVnuXXtM