JavaRush /Java 博客 /Random-ZH /喝咖啡休息#132。我们来看看JDK中最新的垃圾收集器ZGC。Java中HashMap、LinkedHashMap...

喝咖啡休息#132。我们来看看JDK中最新的垃圾收集器ZGC。Java中HashMap、LinkedHashMap、TreeMap有什么区别

已在 Random-ZH 群组中发布

介绍 ZGC,JDK 最新的垃圾收集器

来源:Inside Java ZGC 或 Z Garbage Collector 是 JDK 中最现代的垃圾收集器。它最初作为实验性功能出现在 JDK 11 中。在 JEP 377 增强功能获得批准后,ZGC 成为 JDK 15 中的生产功能。在本文中,我们将探讨 ZGC 的目标和未来。 喝咖啡休息#132。 我们来看看JDK中最新的垃圾收集器ZGC。 Java中HashMap、LinkedHashMap、TreeMap有什么区别 - 1

中关村评论

ZGC 被设计为一个可扩展、低延迟的垃圾收集器。ZGC操作期间的最大停顿时间很少超过250微秒,是的,正是微秒,平均停顿时间为数十微秒。ZGC 具有高度可扩展性,最小堆大小范围为 8 MB 到 16 TB。需要注意的是,暂停时间不会随着堆大小的增加而增加。因此,即使堆大小达到几 TB,暂停时间仍将以微秒为单位。尽管ZGC提供了低延迟和高可扩展性,但它的代价是吞吐量比G1低约10%。确切的吞吐量降低取决于应用程序设计、系统架构和业务需求。

使用ZGC

由于 G1 是从 JDK 9 开始的默认垃圾收集器,因此您需要设置 VM 标志 -XX:+UseZGC 才能使用 ZGC。使用ZGC时,最重要的配置是设置最大堆大小,-Xmx。堆大小应该足够大以处理应用程序的实时设置。它还必须有额外的储备来执行垃圾收集。堆上的可用空间越多,垃圾回收的频率就越低。但请注意,这必须与内存使用相平衡。

中关村的进一步发展

自从作为 JDK 15 中的生产功能发布以来,ZGC 一直在持续积极开发。随着 JDK 16 的发布,它引入了线程堆栈并行处理(JEP 376),JDK 18 添加了行重复数据删除作为附加功能。未来,计划ZGC将成为多代,但实施这一改进的具体时间框架尚未确定。

有关 ZDC 的更多信息

Java中HashMap、LinkedHashMap、TreeMap有什么区别

来源:Rrtutors 如果您想在 Java 程序中存储键值对,那么 Java 集合可以根据您的需求提供许多选项。其中包括LinkedHashmapHashMapTreeMap。这三个类的主要区别在于它们的内部实现和某些情况下的具体应用。 喝咖啡休息#132。 我们来看看JDK中最新的垃圾收集器ZGC。 Java中HashMap、LinkedHashMap、TreeMap有什么区别 - 2

Java中HashMap、LinkedHashMap和TreeMap的区别

以下是上述三个类之间基于实现、排序、排序以及对空键和值的支持的主要区别。

执行

HashMapLinkedHashMap都实现了Map接口,而TreeMap实现了MapNavigableMap和 vSortedMap 接口。 LinkedHashMap实现为双链表桶,HashMap实现为哈希表,TreeMap实现为树。

排序和排序

  • HashMap不保证迭代的顺序。然而,当添加新元素时,它可能会完全改变。

  • LinkedHashMap将按照条目放入映射中的顺序进行迭代。

  • TreeMap根据键的compareTo()方法(或外部比较器)按照键的“自然顺序”进行迭代。它还实现了SortedMap接口,其中包含依赖于排序顺序的方法。

空键和值

HashMapLinkedHashMap支持 null 值以及键值,而TreeMap不支持 null 值,因为它们支持自然元素类型。作为一个直观的示例,让我们创建一个 HashMapLinkedHashMapTreeMap
import java.util.HashMap;

import java.util.LinkedHashMap;

import java.util.Map;

import java.util.TreeMap;

public class HashMap_LinkedHashMap_TreeMap {

            public static void main(String[] args) {

                  Map Treemapu = new TreeMap();

                  Treemapu.put("First", "Java");

                  Treemapu.put("Second", "Python");

                  System.out.println("TreeMap values are: \n" + Treemapu);

                  Map Hashimapu = new HashMap();

                  Hashimapu.put("First", "Java");

                  Hashimapu.put("Second", "Python");

                  System.out.println("HashMap Values are: \n" + Hashimapu);

                  Map LinkedHashiMapu = new LinkedHashMap();

                  LinkedHashiMapu.put("First", "Java");

                  LinkedHashiMapu.put("Second", "Python");

                  System.out.println("LinkedHashMap values are: \n" + LinkedHashiMapu);

            }

}
在输出中我们得到:
{First=Java, Second=Python} HashMap 值为:{Second=Python, First=Java} LinkedHashMap 值为:{First=Java, Second=Python}
因此,所有三个类都表示从唯一键到值的映射,因此实现了Map接口。
  • HashMap是基于键散列的映射。它支持 O(1) 获取/放置操作。键必须具有一致的hashCode()equals()实现。

  • LinkedHashMap与HashMap非常相似,但它具有添加(或访问)元素的顺序,因此迭代顺序与放置顺序(或访问顺序,取决于设计参数)相同。

  • TreeMap是基于树的映射。它的 put/get 操作需要 O(log n) 时间。这要求元素具有某种比较机制,无论是比较还是比较器。迭代的顺序由该机制决定。

评论
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION