相关疑难解决方法(0)

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

由于String在Java中(像其他语言一样)消耗大量内存,因为每个字符占用两个字节,Java 8引入了一个名为String Deduplication的新功能,它利用了char数组是字符串内部的最终事实,因此JVM可以搞砸他们.

到目前为止,我已经阅读了这个例子,但由于我不是一个专业的java编码器,我很难掌握这个概念.

这是它说的,

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

整个过程当然会带来一些开销,但是受到严格的限制.例如,如果找不到字符串有一段时间的重复项,则不再检查它.

我的第一个问题,

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

编辑:

上面的链接说,

一旦找到另一个具有相同哈希码的String,就会将它们与char进行比较

我的第二个问题,

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

java string java-8

62
推荐指数
3
解决办法
2万
查看次数

使用new运算符的String对象数

当我们使用new运算符创建一个String对象时,我读到创建了两个对象,一个Object是字符串常量池,第二个是堆内存.

我的问题是我们正在使用new运算符,因此只应在Heap中创建一个对象.为什么然后必须在String Constant池中创建另外一个对象.我知道只要我们不使用new运算符来创建String,Java就会存储String对象.例如:

String s = "abc" . 
Run Code Online (Sandbox Code Playgroud)

在这种情况下,它只会在String常量池中创建.

String s2 = new String("abc") 
Run Code Online (Sandbox Code Playgroud)

只有一个对象可以在堆中创建而不是在常量池中创建.

请解释我为什么错在这里.

java string object

4
推荐指数
1
解决办法
1万
查看次数

标签 统计

java ×2

string ×2

java-8 ×1

object ×1