English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
在本教程中,我们将借助示例学习Java WeakHashMap及其操作。我们还将了解WeakHashMap和HashMap之间的区别
Java集合框架的WeakHashMap类提供了哈希表数据结构的功能。
它实现了Map接口。
注意:弱键hashmap属于WeakReference类型。
弱引用类型的对象可以在Java中被垃圾收集,如果该引用不再在程序中使用。
首先让我们学习创建一个弱哈希映射。然后,我们将了解它与hashmap的区别。
为了创建一个弱哈希表,我们必须首先导入该java.util.WeakHashMap包。导入程序包后,可以使用以下方法在Java中创建弱哈希表。
//创建WeakHashMap,容量为8,负载因子为0.6 WeakHashMap<Key, Value> numbers = new WeakHashMap<>(8, 0.6);
在上面的代码中,我们创建了一个名为numbers的WeakHashMap。
这里,
Key - 用于关联映射中每个元素(值)的唯一标识符
Value - 映射中与键关联的元素
注意new WeakHashMap<>(8,0.6)这一部分。这里,第一个参数是capacity,第二个参数是loadFactor。
capacity - 该映射的容量为8。意味着,它可以存储8个条目。
loadFactor- 此映射的负载因子为0.6。这意味着只要我们的哈希表填充了60%,条目就会被移到新哈希表中,该哈希表的大小是原始哈希表的两倍。
默认容量和负载系数
可以在不定义其容量和负载因子的情况下创建WeakHashMap。例如,
//具有默认容量和负载因子的WeakHashMap WeakHashMap<Key, Value> numbers1 = new WeakHashMap<>();
默认,
map的容量将为 16
负载因子将为0.75
让我们看看Java中弱哈希表的实现。
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建名称为numbers的WeakHashMap WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; //插入元素 numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("WeakHashMap: ") + numbers); //null引用 two = null; //执行垃圾回收 System.gc(); System.out.println("Weak垃圾回收后的HashMap : " + "" + numbers); } }
출력 결과
WeakHashMap: {Four=4, Two=2} Weak垃圾回收后的HashMap : {Four}
如我们所见,当two弱哈希图的键设置为null并执行垃圾回收时,该键将被删除。
这是因为与散列表不同,弱散列表的键属于弱引用类型。这意味着如果不再使用映射条目,则垃圾收集器将删除该条目。这对于节省资源很有用。
现在让我们在哈希图中查看相同的实现。
import java.util.HashMap; class Main { public static void main(String[] args) { //创建偶数HashMap HashMap<String, Integer> numbers = new HashMap<>(); String two = new String("Two"); Integer twoValue = 2; String four = new String("Four"); Integer fourValue = 4; //插入元素 numbers.put(two, twoValue); numbers.put(four, fourValue); System.out.println("HashMap: " + "" + numbers); //使引用为空 two = null; //执行垃圾回收 System.gc(); System.out.println("垃圾回收后的HashMap : " + "" + numbers); } }
출력 결과
HashMap: {Four=4, Two=2} 垃圾回收后的HashMap : {Four=4, Two=2}
在此,将哈希表的键two设置为null并执行垃圾回收时,不会删除该键。
这是因为与弱hashmap不同,hashmap的键具有强引用类型。这意味着即使映射条目的键不再被使用,该条目也不会被垃圾回收器删除。
注意:hashmap和弱hashmap的所有功能都是相似的,除了弱hashmap的键是弱引用,而hashmap的键是强引用。
这是我们可以从其他map创建弱哈希表的方法。
import java.util.HashMap; import java.util.WeakHashMap; class Main { public static void main(String[] args) { // 创建偶数的hashmap HashMap<String, Integer> evenNumbers = new HashMap<>(); String two = new String("Two"); Integer twoValue = 2; evenNumbers.put(two, twoValue); System.out.println("HashMap: " + "" + evenNumbers); // 기타 해시 매핑에서 약한 해시 매핑을 생성 WeakHashMap<String, Integer> numbers = new WeakHashMap<>(evenNumbers); System.out.println("WeakHashMap: ") + numbers); } }
출력 결과
HashMap: {Two=2} WeakHashMap: {Two=2}
WeakHashMap 클래스는 맵에 다양한 작업을 수행할 수 있는 메서드를 제공합니다。
put() - 지정된 키를/값 매핑이 매핑에 삽입됨
putAll() - 지정된 매핑의 모든 항목을 이 매핑에 삽입
putIfAbsent() - map에 지정된 키가 없으면, 지정된 키를/값 매핑이 map에 삽입됨
예를 들어,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Even number WeakHashMap 생성 WeakHashMap<String, Integer> evenNumbers = new WeakHashMap<>(); String two = new String("Two"); Integer twoValue = 2; // 사용자 put() evenNumbers.put(two, twoValue); String four = new String("Four"); Integer fourValue = 4; // 사용자 putIfAbsent() evenNumbers.putIfAbsent(four, fourValue); System.out.println("짝수의 WeakHashMap: " + evenNumbers); //numbers라는 이름의 WeakHashMap을 생성 WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); // 사용자 putAll() numbers.putAll(evenNumbers); System.out.println("WeakHashMap의 숫자: " + numbers); } }
출력 결과
짝수의 WeakHashMap: {Four=4, Two=2} WeakHashMap의 숫자: {Two=2, Four=4, One=1}
1.사용자 entrySet(), keySet() 및 values()
entrySet() - 모든 키의 집합을 반환/값 매핑의 집합
keySet() - map의 모든 키의 집합을 반환
values() - map의 모든 값의 집합을 반환
예를 들어,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Even number WeakHashMap 생성 WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: ") + numbers); // 사용자 entrySet() System.out.println("Key/Value 映射: " + numbers.entrySet()); // 사용자 keySet() System.out.println("Keys: " + numbers.keySet()); // values() 사용 System.out.println("Values: ") + numbers.values()); } }
출력 결과
WeakHashMap: {Two=2, One=1} Key/Value 매핑: [Two=2, One=1] Keys: [Two, One] Values: [1, 2]
2.get()와 getOrDefault() 사용
get()- 지정된 키와 관련된 값을 반환합니다. 키를 찾지 못하면 null을 반환합니다.
getOrDefault() - 지정된 키와 관련된 값을 반환합니다. 키를 찾지 못하면 지정된 기본 값을 반환합니다.
예를 들어,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Even number WeakHashMap 생성 WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: ") + numbers); // get() 사용 int value1 = numbers.get("Two"); System.out.println("get() 메서드 사용: ") + value1); // getOrDefault() 사용 int value2 = numbers.getOrDefault("Four", 4); System.out.println("getOrDefault() 메서드 사용: ") + value2); } }
출력 결과
WeakHashMap: {Two=2, One=1} get() 메서드 사용: 2 getOrDefault() 메서드 사용: 4
remove(key) - 지정된 키와 관련된 항목을 반환하고 맵에서 제거합니다.
remove(key, value) - 지정된 키가 지정된 값에 매핑되고 부울 값을 반환할 때만 맵에서 항목을 제거합니다
예를 들어,
import java.util.WeakHashMap; class Main { public static void main(String[] args) { // Even number WeakHashMap 생성 WeakHashMap<String, Integer> numbers = new WeakHashMap<>(); String one = new String("One"); Integer oneValue = 1; numbers.put(one, oneValue); String two = new String("Two"); Integer twoValue = 2; numbers.put(two, twoValue); System.out.println("WeakHashMap: ") + numbers); // remove()를 사용하여 매개변수를 포함하고1개의 매개변수 int value = numbers.remove("Two"); System.out.println("삭제된 값: ") + value); // remove()를 사용하여 매개변수를 포함하고2개의 매개변수 boolean result = numbers.remove("One", 3); System.out.println("항목 {One=",3} 이제 제거되었습니까? " + result); System.out.println("업데이트된 WeakHashMap: ", + numbers); } }
출력 결과
WeakHashMap: {Two=2, One=1} 제거된 값: 2 항목 {One=3} 이제 제거되었습니까? False 업데이트된 WeakHashMap: {One=1}
메서드 | 설명 |
---|---|
clear() | map에서 모든 항목을 제거 |
containsKey() | map이 지정된 키를 포함하고 있는지 확인하고 부울 값을 반환 |
containsValue() | map이 지정된 값을 포함하고 있는지 확인하고 부울 값을 반환 |
size() | map의 크기를 반환 |
isEmpty() | map이 비어 있는지 확인하고 부울 값을 반환 |