java
이 자습서에서는 예제를 통해 Java ConcurrentHashMap 클래스와 해당 작업에 대해 알아봅니다.
ConcurrentHashMap
Java 컬렉션 프레임워크의 클래스는 스레드로부터 안전한 맵을 제공합니다. 즉, 여러 스레드가 지도 항목의 일관성에 영향을 주지 않고 한 번에 지도에 액세스할 수 있습니다.
ConcurrentMap 인터페이스를 구현합니다.
<시간>
동시 해시맵을 생성하려면 java.util.concurrent.ConcurrentHashMap
을 가져와야 합니다. 먼저 패키지. 패키지를 가져온 후 Java에서 동시 해시맵을 만드는 방법은 다음과 같습니다.
// ConcurrentHashMap with capacity 8 and load factor 0.6
ConcurrentHashMap<Key, Value> numbers = new ConcurrentHashMap<>(8, 0.6f);
위의 코드에서 numbers라는 동시 해시맵을 만들었습니다. .
여기,
new ConcurrentHashMap<>(8, 0.6)
부분을 확인하세요. . 여기서 첫 번째 매개변수는 용량입니다. 두 번째 매개변수는 loadFactor입니다. .
기본 용량 및 부하율
용량과 부하율을 정의하지 않고 동시 해시맵을 생성하는 것이 가능합니다. 예를 들어,
// ConcurrentHashMap with default capacity and load factor
ConcurrentHashMap<Key, Value> numbers1 = new ConcurrentHashMap<>();
기본적으로
다음은 다른 맵의 모든 요소를 포함하는 동시 해시맵을 만드는 방법입니다.
import java.util.concurrent.ConcurrentHashMap;
import java.util.HashMap;
class Main {
public static void main(String[] args) {
// Creating a hashmap of even numbers
HashMap<String, Integer> evenNumbers = new HashMap<>();
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
System.out.println("HashMap: " + evenNumbers);
// Creating a concurrent hashmap from other map
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>(evenNumbers);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap: " + numbers);
}
}
출력
HashMap: {Four=4, Two=2} ConcurrentHashMap: {Four=4, Two=2, Three=3}<시간>
ConcurrentHashMap
클래스는 지도에서 다양한 작업을 수행할 수 있는 메서드를 제공합니다.
put()
- 맵에 지정된 키/값 매핑을 삽입합니다.putAll()
- 지정된 지도의 모든 항목을 이 지도에 삽입합니다.putIfAbsent()
- 지정된 키가 맵에 없으면 지정된 키/값 매핑을 맵에 삽입합니다.예를 들어,
import java.util.concurrent.ConcurrentHashMap;
class Main {
public static void main(String[] args) {
// Creating ConcurrentHashMap of even numbers
ConcurrentHashMap<String, Integer> evenNumbers = new ConcurrentHashMap<>();
// Using put()
evenNumbers.put("Two", 2);
evenNumbers.put("Four", 4);
// Using putIfAbsent()
evenNumbers.putIfAbsent("Six", 6);
System.out.println("ConcurrentHashMap of even numbers: " + evenNumbers);
//Creating ConcurrentHashMap of numbers
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
// Using putAll()
numbers.putAll(evenNumbers);
System.out.println("ConcurrentHashMap of numbers: " + numbers);
}
}
출력
ConcurrentHashMap of even numbers: {Six=6, Four=4, Two=2} ConcurrentHashMap of numbers: {Six=6, One=1, Four=-4, Two=2}<시간>
1. entrySet(), keySet() 및 values() 사용
entrySet()
- 맵의 모든 키/값 매핑 세트를 반환합니다.keySet()
- 지도의 모든 키 세트를 반환합니다.values()
- 지도의 모든 값 집합을 반환합니다.예를 들어,
import java.util.concurrent.ConcurrentHashMap;
class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap: " + numbers);
// Using entrySet()
System.out.println("Key/Value mappings: " + numbers.entrySet());
// Using keySet()
System.out.println("Keys: " + numbers.keySet());
// Using values()
System.out.println("Values: " + numbers.values());
}
}
출력
ConcurrentHashMap: {One=1, Two=2, Three=3} Key/Value mappings: [One=1, Two=2, Three=3] Keys: [One, Two, Three] Values: [1, 2, 3]
2. get() 및 getOrDefault() 사용
get()
- 지정된 키와 관련된 값을 반환합니다. null
반환 키를 찾을 수 없는 경우.getOrDefault()
- 지정된 키와 관련된 값을 반환합니다. 키를 찾을 수 없는 경우 지정된 기본값을 반환합니다.예를 들어,
import java.util.concurrent.ConcurrentHashMap;
class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap: " + numbers);
// Using get()
int value1 = numbers.get("Three");
System.out.println("Using get(): " + value1);
// Using getOrDefault()
int value2 = numbers.getOrDefault("Five", 5);
System.out.println("Using getOrDefault(): " + value2);
}
}
출력
ConcurrentHashMap: {One=1, Two=2, Three=3} Using get(): 3 Using getOrDefault(): 5<시간>
remove(key)
- 지도에서 지정된 키와 관련된 항목을 반환하고 제거합니다.remove(key, value)
- 지정된 키가 지정된 값에 매핑되고 부울 값을 반환하는 경우에만 맵에서 항목을 제거합니다.예를 들어,
import java.util.concurrent.ConcurrentHashMap;
class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap: " + numbers);
// remove method with single parameter
int value = numbers.remove("Two");
System.out.println("Removed value: " + value);
// remove method with two parameters
boolean result = numbers.remove("Three", 3);
System.out.println("Is the entry {Three=3} removed? " + result);
System.out.println("Updated ConcurrentHashMap: " + numbers);
}
}
출력
ConcurrentHashMap: {One=1, Two=2, Three=3} Removed value: 2 Is the entry {Three=3} removed? True Updated ConcurrentHashMap: {One=1}<시간>
ConcurrentHashMap
클래스는 동시 맵에 안전하게 적용할 수 있는 다양한 일괄 작업을 제공합니다.
forEach()
메소드는 항목을 반복하고 지정된 기능을 실행합니다.
여기에는 두 개의 매개변수가 포함됩니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap;
class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap: " + numbers);
// forEach() without transformer function
numbers.forEach(4, (k, v) -> System.out.println("key: " + k + " value: " + v));
// forEach() with transformer function
System.out.print("Values are ");
numbers.forEach(4, (k, v) -> v, (v) -> System.out.print(v + ", "));
}
}
출력
ConcurrentHashMap: {One = 1, Two = 2, Three = 3} key: One value: 1 key: Two value: 2 key: Three value: 3 Values are 1, 2, 3,
위 프로그램에서는 병렬 임계값 4를 사용했습니다. . 즉, 맵에 4개의 항목이 포함된 경우 작업이 병렬로 실행됩니다.
forEach() 메소드의 변형
forEachEntry()
- 각 항목에 대해 지정된 기능을 실행합니다.forEachKey()
- 각 키에 대해 지정된 기능을 실행합니다.forEachValue()
- 각 값에 대해 지정된 기능을 실행합니다.
search()
메소드는 지정된 기능을 기반으로 지도를 검색하고 일치하는 항목을 반환합니다.
여기에서 지정된 함수는 검색할 항목을 결정합니다.
여기에는 선택적 매개변수 parallelThreshold도 포함됩니다. . 병렬 임계값은 맵의 요소 수 이후에 작업이 병렬로 실행되도록 지정합니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap;
class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap: " + numbers);
// Using search()
String key = numbers.search(4, (k, v) -> {return v == 3 ? k: null;});
System.out.println("Searched value: " + key);
}
}
출력
ConcurrentHashMap: {One=1, Two=2, Three=3} Searched value: Three
search() 메서드의 변형
searchEntries()
- 키/값 매핑에 검색 기능 적용searchKeys()
- 검색 기능은 키에만 적용됩니다.searchValues()
- 검색 기능은 값에만 적용됩니다.
reduce()
메소드는 맵의 각 항목을 누적(함께 수집)합니다. 지도의 모든 값을 추가하는 것과 같은 일반적인 작업을 수행하기 위해 모든 항목이 필요할 때 사용할 수 있습니다.
여기에는 두 개의 매개변수가 포함됩니다.
예를 들어,
import java.util.concurrent.ConcurrentHashMap;
class Main {
public static void main(String[] args) {
ConcurrentHashMap<String, Integer> numbers = new ConcurrentHashMap<>();
numbers.put("One", 1);
numbers.put("Two", 2);
numbers.put("Three", 3);
System.out.println("ConcurrentHashMap: " + numbers);
// Using search()
int sum = numbers.reduce(4, (k, v) -> v, (v1, v2) -> v1 + v2);
System.out.println("Sum of all values: " + sum);
}
}
출력
ConcurrentHashMap: {One=1, Two=2, Three=3} Sum of all values: 6
위의 프로그램에서 다음 문장을 주목하십시오.
numbers.reduce(4, (k, v) -> v, (v1, v2) -> v1+v2);
여기,
reduce() 메소드의 변형
reduceEntries()
- 지정된 감속기 함수를 사용하여 모든 항목을 수집한 결과를 반환합니다.reduceKeys()
- 지정된 감속기 기능을 사용하여 모든 키를 수집한 결과를 반환합니다.reduceValues()
- 지정된 감속기 함수를 사용하여 모든 값을 수집한 결과를 반환합니다.
다음은 ConcurrentHashMap
의 몇 가지 차이점입니다. 및 HashMap,
ConcurrentHashMap
스레드로부터 안전한 수집. 즉, 여러 스레드가 동시에 액세스하고 수정할 수 있습니다.ConcurrentHashMap
forEach()
과 같은 대량 작업을 위한 메서드를 제공합니다. , search()
및 reduce()
.ConcurrentHashMap
클래스를 사용하면 여러 스레드가 항목에 동시에 액세스할 수 있습니다.putIfAbsent()
지정된 키가 이미 있는 경우 이 메서드는 지도의 항목을 재정의하지 않습니다.java
자바 트리셋 이 자습서에서는 예제를 통해 Java TreeSet 클래스와 다양한 작업 및 메서드에 대해 알아봅니다. TreeSet Java 컬렉션 프레임워크의 클래스는 트리 데이터 구조의 기능을 제공합니다. NavigableSet 인터페이스를 확장합니다. TreeSet 만들기 트리 세트를 생성하려면 java.util.TreeSet를 가져와야 합니다. 먼저 포장하십시오. 패키지를 가져오면 다음은 TreeSet을 만드는 방법입니다. 자바로. TreeSet<Integer> numbers = new TreeSe
일반적으로 Numbers로 작업할 때 byte, int, long, double 등과 같은 기본 데이터 유형을 사용합니다. 예시 int i = 5000; float gpa = 13.65f; double mask = 125; 그러나 개발 과정에서 기본 데이터 유형 대신 객체를 사용해야 하는 상황을 접하게 됩니다. 이를 달성하기 위해 Java는 래퍼 클래스를 제공합니다. . 모든 래퍼 클래스(Integer, Long, Byte, Double, Float, Short)는 추상 클래스 Number의 하위 클래스입니다. 래퍼 클래