Post

🦊 chap9. λ¦¬νŒ©ν„°λ§, ν…ŒμŠ€νŒ…, 디버깅

chap8. μ»¬λ ‰μ…˜ API κ°œμ„ 

8.1 μ»¬λ ‰μ…˜ νŒ©ν† λ¦¬

μžλ°” 9μ—μ„œλŠ” μž‘μ€ μ»¬λ ‰μ…˜ 객체λ₯Ό μ‰½κ²Œ λ§Œλ“€ 수 μžˆλŠ” λͺ‡ 가지 방법을 μ œκ³΅ν•œλ‹€.

1
2
3
4
List<String> friends = new ArrayList<>();
friends.add("Raphael");
friends.add("Olivia");
friends.add("Thibaut");

적은 μš”μ†Œλ₯Ό ν¬ν•¨ν•˜λŠ” 리슀트λ₯Ό νŒ©ν† λ¦¬ λ©”μ„œλ“œλ‘œ κ°„λ‹¨ν•˜κ²Œ 쀄일 수 μžˆλ‹€.

1
2
List<String> friends
		= Arrays.asList("Rapheal", "Olivia", "Thibaut");

μ΄λŠ” κ³ μ • 크기의 리슀트둜 μš”μ†Œλ₯Ό μΆ”κ°€ν•˜κ±°λ‚˜ μ‚­μ œν•  수 μ—†λ‹€.

μš”μ†Œμ˜ 갱신은 κ°€λŠ₯ν•˜λ‹€.

UnsupportedOperationException μ˜ˆμ™Έ λ°œμƒ

λ‚΄λΆ€μ μœΌλ‘œ κ³ μ •λœ 크기의 λ³€ν™˜ν•  수 μžˆλŠ” λ°°μ—΄λ‘œ κ΅¬ν˜„λ˜μ—ˆκΈ° λ•Œλ¬Έμ— μ˜ˆμ™Ή γ…λ°œμƒν•œλ‹€.

Arrays.asSet() μ΄λΌλŠ” νŒ©ν† λ¦¬ λ©”μ„œλ“œλŠ” μ—†μœΌλ―€λ‘œ λ‹€λ₯Έ 방법이 ν•„μš”ν•˜λ‹€.

1
2
3
4
5
6
Set<String> friends
			= new HashSet<>(Arrays.asList("Raphael", "Olivia", "Thibaut"));

Set<String> friends
			= Stream.of("Raphael", "Olivia", "Thibaut")
							.collect(Collectors.toSet());

ν•˜μ§€λ§Œ 두 방법 λͺ¨λ‘ λ§€λ„λŸ½μ§€ λͺ»ν•˜λ©° λ‚΄λΆ€μ μœΌλ‘œ λΆˆν•„μš”ν•œ 객체 할당이 ν•„μš”ν•˜λ‹€.

λ˜ν•œ κ²°κ³ΌλŠ” λ³€ν™˜ν•  수 μžˆλŠ” μ§‘ν•©μ΄λΌλŠ” 사싀에 μ£Όλͺ©ν•˜μž.

8.1.1 리슀트 νŒ©ν† λ¦¬

1
List<String> friends = List.of("Raphael", "Olivia", "Thibaut");

List.of νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μ—¬ κ°„λ‹¨ν•˜κ²Œ 리슀트λ₯Ό λ§Œλ“€ 수 μžˆλ‹€.

이 λ¦¬μŠ€νŠΈλŠ” λΆˆλ³€λ¦¬μŠ€νŠΈλ‘œ add λ˜λŠ” set λ©”μ„œλ“œλ‘œ 리슀트λ₯Ό λ°”κΎΈλ € ν•˜λ©΄ java.lang.UnsupportedOperationException 이 λ°œμƒν•œλ‹€.

λ˜ν•œ null μš”μ†Œλ₯Ό κΈˆμ§€ν•˜μ—¬ μ˜λ„μΉ˜ μ•Šμ€ 버그λ₯Ό λ°©μ§€ν•˜κ³  쑰금 더 κ°„κ²°ν•œ λ‚΄λΆ€ κ΅¬ν˜„μ„ λ‹¬μ„±ν–ˆλ‹€.

List μΈν„°νŽ˜μ΄μŠ€μ—λŠ” List.of 의 λ‹€μ–‘ν•œ μ˜€λ²„λ‘œλ“œ 버전이 μžˆλ‹€.

μ™œ κ°€λ³€ 인자둜 닀쀑 μš”μ†Œλ₯Ό 받을 수 μžˆλ„λ‘ ν•˜μ§€ μ•Šμ•˜μ„κΉŒ?

λ‚΄λΆ€μ μœΌλ‘œ κ°€λ³€ 인수 버전은 μΆ”κ°€ 배열을 ν• λ‹Ήν•΄μ„œ 리슀트둜 감싼닀.

즉 배열을 ν• λ‹Ήν•˜κ³  μ΄ˆκΈ°ν™”ν•˜λ©° λ‚˜μ€‘μ— GC에 λŒ€ν•œ λΉ„μš©μ„ μ§€λΆˆν•΄μ•Ό ν•œλ‹€.

κ³ μ •λœ 숫자의 μš”μ†Œλ₯Ό API둜 μ •μ˜ν•˜λ©΄ 이런 λΉ„μš©μ„ μ œκ±°ν•  수 μžˆλ‹€.

데이터 처리 ν˜•μ‹μ„ μ„€μ •ν•˜κ±°λ‚˜ 데이터λ₯Ό λ³€ν™˜ν•  ν•„μš”κ°€ μ—†λ‹€λ©΄ μ‚¬μš©ν•˜κΈ° κ°„νŽΈν•œ νŒ©ν† λ¦¬ λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μž!

8.1.2 집합 νŒ©ν† λ¦¬

1
Set<String> friends = Set.of("Raphael", "Olivia", "Thibaut");

μ€‘λ³΅λœ μš”μ†Œλ₯Ό μ œκ³΅ν•΄ 집합을 λ§Œλ“€λ €κ³  ν•˜λ©΄

예λ₯Ό λ“€μ–΄ Olivia λΌλŠ” μš”μ†Œκ°€ μ€‘λ³΅λ˜μ–΄ μžˆλ‹€λŠ” μ„€λͺ…κ³Ό ν•¨κ»˜ IllegalArgumentException 이 λ°œμƒν•œλ‹€.

8.1.3 맡 νŒ©ν† λ¦¬

1
2
Map<String, Integer> ageOfFriends
		= Map.of("Raphael", 30, "Olivia", 25, "Thibaut", 26);

Map.of νŒ©ν† λ¦¬ λ©”μ„œλ“œμ— 킀와 값을 λ²ˆκ°ˆμ•„ μ œκ³΅ν•˜λŠ” λ°©λ²•μœΌλ‘œ 맡을 λ§Œλ“€ 수 μžˆλ‹€.

μ—΄ 개 μ΄ν•˜μ˜ ν‚€ κ°’ μŒμ—μ„œλŠ” 이 λ©”μ†Œλ“œκ°€ μœ μš©ν•˜μ§€λ§Œ, κ·Έ μ΄μƒμ—μ„œλŠ” Map.Entry<K, V> 객체λ₯Ό 인수둜 λ°›μœΌλ©° κ°€λ³€ 인수둜 κ΅¬ν˜„λœ Map.ofEntries λ₯Ό μ΄μš©ν•˜μž.

1
2
3
4
Map<String, Integer> ageOfFriends =
		Map.ofEntries(entry("Raphael", 30),
									entry("Olivia", 25),
									entry("Thibaut", 26));

8.2 λ¦¬μŠ€νŠΈμ™€ 집합 처리

μžλ°” 8μ—μ„œλŠ” List, Set μΈν„°νŽ˜μ΄μŠ€μ— λ‹€μŒκ³Ό 같은 λ©”μ„œλ“œλ₯Ό μΆ”κ°€ν–ˆλ‹€.

  • removeIf : Predicate λ₯Ό λ§Œμ‘±ν•˜λŠ” μš”μ†Œλ₯Ό μ œκ±°ν•œλ‹€.
  • replaceAll : List μ—μ„œ UnaryOperation ν•¨μˆ˜λ₯Ό μ΄μš©ν•΄ μš”μ†Œλ₯Ό λ°”κΎΌλ‹€.
  • sort : List λ₯Ό μ •λ ¬ν•œλ‹€.

이듀은 μƒˆλ‘œμš΄ κ²°κ³Όλ₯Ό λ§Œλ“œλŠ” 것이 μ•„λ‹ˆλΌ ν˜ΈμΆœν•œ μ»¬λ ‰μ…˜ 자체λ₯Ό λ°”κΎΌλ‹€.

8.2.1 removeIf λ©”μ„œλ“œ

1
2
3
4
5
for (Transaction transaction : transactions) {
	if (Character.isDigit(transaction.getReferenceCode().charAt(0))) {
		transactions.remove(transaction);
	}
}

μ΄λŠ” 숫자둜 μ‹œμž‘λ˜λŠ” μ°Έμ‘° μ½”λ“œλ₯Ό 가진 νŠΈλžœμž­μ…˜μ„ μ‚­μ œν•˜λŠ” μ½”λ“œμ΄λ‹€.

λ‹ˆλŠ” ConcurrentModificationException 을 λ°œμƒμ‹œν‚¨λ‹€.

λ‚΄λΆ€μ μœΌλ‘œ for-each λ£¨ν”„λŠ” Iterator 객체λ₯Ό μ‚¬μš©ν•˜κΈ° λ•Œλ¬Έμ— λ‹€μŒκ³Ό 같이 ν•΄μ„λœλ‹€.

1
2
3
4
5
6
for (Iterator<Transaction> iterator = transactions.iterator(); iterator.hasNext(); ){
	Transaction transaction = iterator.next();
	if (Character.isDigit(transaction.getReferenceCode().charAt(0))) {
		transactions.remove(transaction);
	}
}

결과적으둜 반볡자의 μƒνƒœμ™€ μ»¬λ ‰μ…˜μ˜ μƒνƒœμ™€ μ„œλ‘œ λ™κΈ°ν™”λ˜μ§€ μ•ŠλŠ”λ‹€.

Iterator 객체λ₯Ό λͺ…μ‹œμ μœΌλ‘œ μ‚¬μš©ν•˜κ³  κ·Έ 객체의 remove() λ₯Ό ν˜ΈμΆœν•¨μœΌλ‘œ 이 문제λ₯Ό ν•΄κ²°ν•˜μž.

1
2
3
4
5
6
for (Iterator<Transaction> iterator = transactions.iterator(); iterator.hasNext(); ){
	Transaction transaction = iterator.next();
	if (Character.isDigit(transaction.getReferenceCode().charAt(0))) {
		iterator.remove();
	}
}

이 λ³΅μž‘ν•œ μ½”λ“œλŠ” μžλ°” 8의 removeIf λ©”μ„œλ“œλ‘œ λ°”κΏ€ 수 μžˆλ‹€.

μ½”λ“œκ°€ λ‹¨μˆœν•΄μ§ˆ 뿐 μ•„λ‹ˆλΌ 버그도 μ˜ˆλ°©ν•  수 μžˆλ‹€.

1
2
transactions.removeIf(transaction -> 
		Character.isDigit(transaction.getReferenceCode.charAt(0)));

8.2.2 replaceAll λ©”μ„œλ“œ

1
2
3
referenceCodes.stream()
			.map(code -> Character.toUpperCase(code.charAt(0)) + code.substring(1))
			.collect(Collectors.toList())

슀트림 API λ₯Ό μ΄μš©ν•΄ λ¦¬μ‹œνŠΈμ˜ 각 μš”μ†Œλ₯Ό μƒˆλ‘œμš΄ μš”μ†Œλ‘œ λ°”κΏ€ 수 μžˆλ‹€.

ν•˜μ§€λ§Œ 이 μ½”λ“œλŠ” μƒˆ λ¬Έμžμ—΄ μ»¬λ ‰μ…˜μ„ λ§Œλ“ λ‹€. κΈ°μ‘΄ μ»¬λ ‰μ…˜μ„ λ°”κΎΈλ €λ©΄ ListIterator 객체λ₯Ό μ΄μš©ν•œλ‹€.

1
2
3
4
for (ListIterator<String> iterator = referenceCodes.listIterator(); iterator.hasNext(); ){
	String code = iterator.next();
	iterator.set(Character.toUpperCase(code.charAt(0)) + code.substring(1));
}

μ½”λ“œκ°€ λ³΅μž‘ν•΄μ‘Œκ³  μ»¬λ ‰μ…˜ 객체와 Iterator 객체λ₯Ό ν˜Όμš©ν•˜λ©΄ 반볡과 λ™μ‹œμ— μ»¬λ ‰μ…˜ 변경이 이루어지며 μ‰½κ²Œ 문제λ₯Ό μΌμœΌν‚¨λ‹€.

1
refereceCodes.replaceAll(code -> Character.toUpperCase(code.charAt(0)) + code.substring(1));

8.3 맡 처리

8.3.1 forEach λ©”μ„œλ“œ

Map.Entry<K, V> 의 반볡자λ₯Ό μ΄μš©ν•΄ 맡의 ν•­λͺ© 집합을 λ°˜λ³΅ν•  수 μžˆλ‹€.

1
2
3
4
for(Map.Entry<String, Integer> entry: ageOfFriends.entrySet()) {
	String friend = entry.getKey();
	Integer age = entry.getValue();
}

μžλ°” 8μ—μ„œλΆ€ν„° Map μΈν„°νŽ˜μ΄μŠ€λŠ” BiConsumer λ₯Ό 인수둜 λ°›λŠ” forEach λ©”μ„œλ“œλ₯Ό μ§€μ›ν•œλ‹€.

1
ageOfFriends.forEach((friends, age) -> System.out.println(friend + age));

8.3.2 μ •λ ¬ λ©”μ„œλ“œ

λ‹€μŒ 두 개의 μƒˆλ‘œμš΄ μœ ν‹Έλ¦¬ν‹°λ₯Ό μ΄μš©ν•˜μ—¬ 맡의 ν•­λͺ©μ„ κ°’ λ˜λŠ” ν‚€λ₯Ό κΈ°μ€€μœΌλ‘œ μ •λ ¬ν•  수 μžˆλ‹€.

  • Entry.comparingByValue
  • Entry.comparingByKey
1
2
3
4
5
favouriteMovies
	.entrySet()
	.stream()
	.sorted(Entry.comparingByKey())
	.forEachOrdered(System.out::println);

μžλ°” 8μ—μ„œλŠ” HashMap 의 λ‚΄λΆ€ ꡬ쑰λ₯Ό λ°”κΏ” μ„±λŠ₯을 κ°œμ„ ν–ˆλ‹€.

κΈ°μ‘΄ 맡은 ν‚€λ‘œ μƒμ„±ν•œ ν•΄μ‹œμ½”λ“œλ‘œ μ ‘κ·Όν•  수 μžˆλŠ” 킷에 μ €μž₯ν–ˆλ‹€.

λ‹€λ§Œ λ§Žμ€ ν‚€κ°€ 같은 ν•΄μ‹œμ½”λ“œλ₯Ό λ°˜ν™˜ν•˜λ©΄ O(n) 의 μ‹œκ°„μ΄ κ±Έλ¦¬λŠ” LinkedList 둜 버킷을 λ°˜ν™˜ν•˜μ—¬ μ„±λŠ₯이 μ €ν•˜λœλ‹€.

μ΅œκ·Όμ—λŠ” 버킷이 λ„ˆλ¬΄ 컀질 경우 이λ₯Ό O(log n) 으둜 μ†Œμš”λ˜λŠ” μ •λ ¬λœ 트리λ₯Ό μ΄μš©ν•΄ λ™μ μœΌλ‘œ μΉ˜ν™˜ν•˜μ—¬ μ„±λŠ₯을 κ°œμ„ ν–ˆλ‹€.

λ‹€λ§Œ μ΄λŠ” key 값이 String ,Number 같은 Comparable ν˜•νƒœμ—¬μ•Όλ§Œ μ§€μ›λœλ‹€.

8.3.3 getOrDefault λ©”μ„œλ“œ

κΈ°μ‘΄μ—λŠ” ν‚€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ null μ΄λ―€λ‘œ NullPointerException 을 λ°©μ§€ν•˜λ €λ©΄ 널 체크가 ν•„μš”ν–ˆλ‹€.

기본값을 λ°˜ν™˜ν•˜λŠ” λ°©μ‹μœΌλ‘œ 이λ₯Ό ν•΄κ²°ν•  수 μžˆλ‹€.

1
2
3
4
Map<String, String> favouriteMovies =
			Map.ofEntries(entry("Raphael", "Star Wars"), entry("Olivia", "James Bond"));

favouriteMovies.getOrDefault("Olivia", "Matrix"));

첫 번째 인수인 ν‚€κ°€ μ‘΄μž¬ν•˜μ§€ μ•ŠμœΌλ©΄ 두 번째 인수인 기본값을 λ°˜ν™˜ν•œλ‹€.

8.3.4 계산 νŒ¨ν„΄

ν‚€λ₯Ό μ΄μš©ν•΄ κ°’λΉ„μ‹Ό λ™μž‘μ„ μ‹€ν–‰ν•΄μ„œ 얻은 κ²°κ³Όλ₯Ό μΊμ‹œν•˜λ € ν•œλ‹€.

  • computeIfAbsent : 제곡된 킀에 ν•΄λ‹Ήν•˜λŠ” 값이 μ—†μœΌλ©΄, ν‚€λ₯Ό μ΄μš©ν•΄ μƒˆ 값을 κ³„μ‚°ν•˜κ³  맡에 μΆ”κ°€
  • computeIfPresent : 제곡된 ν‚€κ°€ μ‘΄μž¬ν•˜λ©΄ μƒˆ 값을 κ³„μ‚°ν•˜κ³  맡에 μΆ”κ°€
  • compute : 제곡된 ν‚€λ‘œ μƒˆ 값을 κ³„μ‚°ν•˜κ³  맡에 μ €μž₯

μ—¬λŸ¬ 값을 μ €μž₯ν•˜λŠ” 맡을 μ²˜λ¦¬ν•  λ•Œλ„ 이 νŒ¨ν„΄μ„ ν™œμš©ν•  수 μžˆλ‹€.

1
2
3
4
5
6
7
String friend = "Raphael";
List<String> movies = friendsToMovies.get(friend);
if (movies == null) {
	movies = new ArrayList<>();
	friendsToMovies.put(friend, movies);
}
movies.add("Star Wars");

이λ₯Ό computeIfAbsent λ₯Ό ν™œμš©ν•˜λ©΄

1
2
friendsToMovie.computeIfAbsent("Raphael", name -> newArrayList<>())
							.add("Star Wars");

이 λ©”μ„œλ“œλŠ” ν˜„μž¬ ν‚€κ³Ό κ΄€λ ¨λœ 값이 맡에 μ‘΄μž¬ν•˜λ©° null 이 아닐 λ•Œλ§Œ μƒˆ 값을 κ³„μ‚°ν•œλ‹€.

8.3.5 μ‚­μ œ νŒ¨ν„΄

1
2
3
4
5
6
7
String key = "Raphael";
String value = "Jack Reacher 2";
if (favouriteMovies.containsKey(key) && Objects.equals(favouriteMovies.get(key), value)) {
	favouriteMovies.remove(key);
	return true;
}
return false;

이λ₯Ό λ‹€μŒμ²˜λŸΌ κ°„κ²°ν•˜κ²Œ κ΅¬ν˜„ν•  수 μžˆλ‹€.

1
favouriteMovies.remove(key, value);

8.3.6 ꡐ체 νŒ¨ν„΄

  • replaceAll : BiFunction 을 μ μš©ν•œ 결과둜 각 ν•­λͺ©μ˜ 값을 κ΅μ²΄ν•œλ‹€.
  • Replace : ν‚€κ°€ μ‘΄μž¬ν•˜λ©΄ 맡의 값을 λ°”κΎΌλ‹€.
1
2
Map<String, String> favouriteMovies = new HashMap<>();
favouriteMovies.replaceAll((friend, movie) -> movie.toUpperCase());

맡의 λͺ¨λ“  κ°’μ˜ ν˜•μ‹μ„ λ°”κΏ€ 수 μžˆλ‹€.

8.3.7 ν•©μΉ¨

두 개의 λ§΅μ—μ„œ 값을 ν•©μΉ˜κ±°λ‚˜ λ°”κΏ”μ•Ό ν•œλ‹€λ©΄ merge λ©”μ„œλ“œλ₯Ό μ΄μš©ν•  수 μžˆλ‹€.

두 그룹의 μ—°λ½μ²˜λ₯Ό ν¬ν•¨ν•˜λŠ” 두 맡을 ν•©μΉœλ‹€κ³  κ°€μ •ν•˜λ‹€.

1
2
3
4
5
6
7
8
Map<String, String> family = 
			Map.ofEntries(entry("Teo", "Star Wars"), entry("Cristina", "James Bond"));

Map<String, String> friends = 
			Map.ofEntries(entry("Raphael", "Star Wars"));

Map<String, String> everyone = new HashMap<>(family);
everyone.putAll(friends);

μ€‘λ³΅λœ ν‚€κ°€ μ—†λ‹€λ©΄ μœ„ μ½”λ“œλŠ” 잘 λ™μž‘ν•œλ‹€.

값을 더 μœ μ—°ν•˜κ²Œ 합쳐야 ν•œλ‹€λ©΄ merge λ©”μ„œλ“œλ₯Ό μ΄μš©ν•˜μž.

λ§Œμ•½ 두 맡 λͺ¨λ‘μ— Cristina κ°€ λ‹€λ₯Έ μ˜ν™” κ°’μœΌλ‘œ μ‘΄μž¬ν•œλ‹€κ³  κ°€μ •ν•˜μž.

1
2
3
4
5
Map<String, String> family = 
			Map.ofEntries(entry("Teo", "Star Wars"), entry("Cristina", "James Bond"));

Map<String, String> friends = 
			Map.ofEntries(entry("Raphael", "Star Wars"), entry("Cristina", "Matrix"));

forEach 와 merge λ₯Ό μ΄μš©ν•΄ μΆ©λŒμ„ ν•΄κ²°ν•  수 μžˆλ‹€..

1
2
3
Map<String, String> everyone = new HashMap<>(family);
friends.forEach((k, v) ->
		everyone.merge(k, v, (movie1, movie2) -> movie1 + " & " + movie2));

μ§€μ •λœ 킀와 μ—°κ΄€λœ 값이 μ—†κ±°λ‚˜ null 이면 null 이 μ•„λ‹Œ κ°’κ³Ό μ—°κ²°ν•œλ‹€.

그렇지 μ•ŠμœΌλ©΄ 맀핑 ν•¨μˆ˜μ˜ κ²°κ³Ό κ°’μœΌλ‘œ λŒ€μΉ˜ν•˜κ±°λ‚˜ ν•­λͺ©μ„ μ œκ±°ν•œλ‹€.

μ΄ˆκΈ°ν™” 검사λ₯Ό κ΅¬ν˜„ν•  μˆ˜λ„ μžˆλ‹€.

1
moviesToCount.merge(movieName, 1L, (key, count) -> count + 1L);

8.4 κ°œμ„ λœ ConcurrentHashMap

λ™μ‹œμ„± μΉœν™”μ μ΄λ©° μ΅œμ‹  κΈ°μˆ μ„ λ°˜μ˜ν•œ HashMap 버전이닀.

λ‚΄λΆ€ 자료ꡬ쑰의 νŠΉμ • λΆ€λΆ„λ§Œ 잠ꢈ λ™μ‹œ μΆ”κ°€, κ°±μ‹  μž‘μ—…μ„ ν—ˆμš©ν•œλ‹€.

λ”°λΌμ„œ λ™κΈ°ν™”λœ HashTable 버전에 λΉ„ν•΄ 읽기 μ“°κΈ° μ—°μ‚° μ„±λŠ₯이 μ›”λ“±ν•˜λ‹€.

8.4.1 λ¦¬λ“€μŠ€μ™€ 검색

슀트림과 λΉ„μŠ·ν•œ μ’…λ₯˜μ˜ μ„Έ 가지 μƒˆλ‘œμš΄ 연산을 μ§€μ›ν•œλ‹€.

  • forEach : 각 key, value μŒμ— 주어진 μ•‘μ…˜μ„ μ‹€ν–‰
  • reduce : λͺ¨λ“  key, value μŒμ„ ν•©μΉ¨
  • search : null 이 μ•„λ‹Œ 값을 λ°˜ν™˜ν•  λ•ŒκΉŒμ§€ key, value μŒμ— ν•¨μˆ˜λ₯Ό 적용

λ‹€μŒμ²˜λŸΌ 킀에 ν•¨μˆ˜ λ°›κΈ°, κ°’, Map.Entry, (key, value) 인수λ₯Ό μ΄μš©ν•œ λ„€ 가지 μ—°μ‚° ν˜•νƒœλ₯Ό μ§€μ›ν•œλ‹€.

  • (key, value)둜 μ—°μ‚° : forEach, reduce, search
  • key둜 μ—°μ‚° : forEachKey, reduceKeys, searchKeys
  • value 둜 μ—°μ‚° : forEachValue, reduceValue, searchValue
  • Map.Entry 객체둜 μ—°μ‚° : forEachEntry, reduceEntries, searchEntries

이듀 연산은 ConcurrentHashMap 의 μƒνƒœλ₯Ό μž κ·Έμ§€ μ•Šκ³  연산을 μˆ˜ν–‰ν•œλ‹€.

λ˜ν•œ 병렬성 기쀀값을 κΈ°μ •ν•΄μ•Ό ν•œλ‹€.

맡의 크기가 주어진 기쀀값보닀 μž‘μœΌλ©΄ 순차적으둜 연산을 μ‹€ν–‰ν•œλ‹€.

기쀀값을 1둜 μ§€μ •ν•˜λ©΄ 곡톡 μŠ€λ ˆλ“œ 풀을 μ΄μš©ν•΄ 병렬성을 κ·ΉλŒ€ν™”ν•œλ‹€.

Long.MAX_VALUE 둜 μ§€μ •ν•˜λ©΄ ν•œ 개의 μŠ€λ ˆλ“œλ§ŒμœΌλ‘œ 연산을 μ‹€ν–‰ν•œλ‹€.

8.4.2 κ³„μˆ˜

맡의 맀핑 개수λ₯Ό λ°˜ν™˜ν•˜λŠ” mappingCount λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

기쑴의 size λ©”μ„œλ“œ λŒ€μ‹  int λ₯Ό λ°˜ν™˜ν•˜λŠ” mappingCount λ©”μ„œλ“œλ₯Ό μ‚¬μš©ν•˜λŠ” 것이 μ’‹λ‹€.

8.4.3 집합뷰

μ§‘ν•©λ·°λ‘œ λ°˜ν™˜ν•˜λŠ” keySet μ΄λΌλŠ” λ©”μ„œλ“œλ₯Ό μ œκ³΅ν•œλ‹€.

맡을 λ°”κΎΈλ©΄ 집합도 λ°”λ€Œκ³ , 집합을 λ°”κΎΈλ©΄ 맡도 영ν–₯을 λ°›λŠ”λ‹€.

This post is licensed under CC BY 4.0 by the author.