由于String
在Java(与其他语言一样)中由于每个字符占用两个字节而占用大量内存,因此Java 8引入了一项名为 String
Deduplication
的新功能,该功能利用了char数组在字符串和final内部的事实,因此JVM会和他们混在一起。
到目前为止,我已经阅读了这个示例,但是由于我不是专业的Java程序员,因此我很难理解这个概念。
它是这样说的,
已经考虑了多种用于字符串复制的策略,但是现在实现的策略遵循以下方法:每当垃圾收集器访问String对象时,它都会记录char数组。它获取其哈希值,并将其与对数组的弱引用一起存储。一旦找到另一个具有相同哈希码的String,便将其逐字符进行比较。如果它们也匹配,则将修改一个String并指向第二个String的char数组。然后,第一个char数组不再被引用,可以被垃圾回收。
这整个过程当然会带来一些开销,但是受到严格的限制。例如,如果一段时间内未发现重复字符串,则将不再检查该字符串。
我的第一个问题
由于该主题是最近在Java 8 update
20中添加的,因此仍然缺少有关该主题的资源,在这里的任何人都可以分享一些有关如何帮助减少String
Java 消耗的内存的实际示例吗?
编辑:
上面的链接说,
一旦找到另一个具有相同哈希码的字符串,便将它们逐个字符地进行比较
我的第二个问题
如果两个哈希码String
相同,则Strings
已经是相同的,那么为什么对它们进行比较char
的char
,一旦发现,这两个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创建代码。