当前位置: 首页 > 面试题库 >

Java 8的字符串重复数据删除功能

唐焕
2023-03-14
问题内容

由于String在Java(与其他语言一样)中由于每个字符占用两个字节而占用大量内存,因此Java 8引入了一项名为 String
Deduplication
的新功能,该功能利用了char数组在字符串和final内部的事实,因此JVM会和他们混在一起。

到目前为止,我已经阅读了这个示例,但是由于我不是专业的Java程序员,因此我很难理解这个概念。

它是这样说的,

已经考虑了多种用于字符串复制的策略,但是现在实现的策略遵循以下方法:每当垃圾收集器访问String对象时,它都会记录char数组。它获取其哈希值,并将其与对数组的弱引用一起存储。一旦找到另一个具有相同哈希码的String,便将其逐字符进行比较。如果它们也匹配,则将修改一个String并指向第二个String的char数组。然后,第一个char数组不再被引用,可以被垃圾回收

这整个过程当然会带来一些开销,但是受到严格的限制。例如,如果一段时间内未发现重复字符串,则将不再检查该字符串。

我的第一个问题

由于该主题是最近在Java 8 update
20中添加的,因此仍然缺少有关该主题的资源,在这里的任何人都可以分享一些有关如何帮助减少StringJava 消耗的内存的实际示例吗?

编辑:

上面的链接说,

一旦找到另一个具有相同哈希码的字符串,便将它们逐个字符地进行比较

我的第二个问题

如果两个哈希码String相同,则Strings已经是相同的,那么为什么对它们进行比较charchar,一旦发现,这两个String具有相同的散列码?


问题答案:

假设您有一本电话簿,其中包含人,其中有一个String firstName和一个String lastName。碰巧在您的电话簿中,有100,000个人拥有相同的知识firstName = "John"

由于您是从数据库或文件中获取数据的,因此这些字符串不会被中断,因此您的JVM内存包含char数组{'J', 'o', 'h', 'n'}10万次,每个John字符串一次。每个阵列占用20个字节的内存,因此,这些100k Johns占用2 MB的内存。

通过重复数据删除,JVM将认识到“ John”已被重复多次,并使所有这些John字符串指向同一基础char数组,从而将内存使用量从2MB减少到20个字节。

您可以在JEP中找到更详细的说明。特别是:

当前,许多大型Java应用程序已成为内存瓶颈。测量表明,在这些类型的应用程序中,大约25%的Java堆活动数据集被String对象占用。此外,这些String对象中大约有一半是重复项,其中重复项表示string1.equals(string2)为true。从本质上讲,在堆上具有重复的String对象只是浪费内存。

[…]

实际的预期收益最终将减少约10%的堆。请注意,此数字是根据广泛应用计算得出的平均值。特定应用程序的堆减少量可能上下波动很大。



 类似资料:
  • 问题内容: 下面的代码试图删除字符串中所有重复的字符。我不确定代码是否正确。有人可以帮助我处理代码吗(即,字符匹配时实际发生了什么)? 问题答案: 该功能对我来说很好。我已经写了内联评论。希望能帮助到你:

  • 问题内容: 我正在制作一个基于Java中字符串处理的程序,其中需要从字符串数组中删除重复的字符串。在此程序中,所有字符串的大小均相同。 “数组”是一个字符串数组,其中包含许多字符串,其中两个字符串彼此相似。因此,使用下面的代码,必须删除重复的字符串,但是不能删除。 如何删除重复的字符串? 我正在使用以下代码。 问题答案: 这会工作 或者只使用a 而不是数组。

  • 我正在用Java制作一个基于字符串处理的程序,在这个程序中,我需要从字符串数组中删除重复的字符串。在这个程序中,所有字符串的大小都是相同的。 “数组”是一个字符串数组,包含许多字符串,其中两个字符串彼此相似。因此,使用下面的代码必须删除重复的字符串,但不会删除。 如何删除重复字符串? 我正在使用以下代码。

  • 问题内容: 我有像这样的字符串“ aaaabbbccccaaddddcfggghhhh”,我想删除重复的字符,得到像这样的字符串“ abcadcfgh”。 一个简单的实现是: 使用正则表达式是否可能有更好的实现? 问题答案: 你可以这样做: 正则表达式使用反向引用和捕获组。 正常的正则表达式是,但是您必须在Java中使用另一个反斜杠来使反斜杠转义。 如果您想要重复的字符数: 演示版

  • 我需要编写一个静态方法,该方法将作为参数,并返回一个新的。例如,如果我将“Maaaakkee”作为输入,它将返回“make”。我已经尝试了下面的代码,但它似乎没有显示最后一个字符。下面是我的代码:

  • 如果输入“abcde”和输入“abc”=“de” 我想知道如何使用jQuery创建代码。