java - 循环中的不可变对象(immutable对象)创建

标签 java garbage-collection immutability

根据我的理解,在循环内创建可变对象(如下面的方法)会创建一堆对象,垃圾收集将不得不处理每个新对象。

for (int i=0; i<1000000000; i++){
    Object obj = new Object();
}

与此方法相反,该方法重用相同的对象并且不需要垃圾回收。

Object obj;
for (int i=0; i<1000000000; i++){
    obj = new Object();
}

但是当使用实例化后无法更改的不可变对象(immutable对象)时该怎么办?无论如何,垃圾收集仍然必须在这些对象上运行,对吗?如果是这样,那么在这种情况下,这两种方法在垃圾收集和性能方面是否有任何区别?

假设该对象是 BigDecimal:

for (int i=0; i<1000000000; i++){
    BigDecimal number = new BigDecimal(someValue);
}

VS。

BigDecimal number;
for (int i=0; i<1000000000; i++){
    number = new BigDecimal(someValue);
}

现在我们正在处理不可变对象(immutable对象),这两者有什么区别吗?...除了范围之外,我知道这两个示例中范围的差异。谢谢!

最佳答案

As opposed to this method which reuses the same object and doesn’t require garbage collection.

不,您描述的每个场景都会创建需要垃圾收集的对象。

Is there any difference in these two now that we’re dealing with immutable objects?

没有。尽管某些不可变对象(immutable对象)(例如 StringInteger 类型)可能会被虚拟机缓存。

关于java - 循环中的不可变对象(immutable对象)创建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30019211/

相关文章:

java - Java String 类内部是如何工作的?

java - Android LambdaJ - 无法使用,每次调用都会出现异常

java - 如何以线程安全的方式实现AWS S3客户端?

java - 如何从整个内存中删除()和setUp()?

garbage-collection - 如何停止 OCaml 垃圾收集我的响应式(Reactive)事件处理程序?

java - 分析内存时使用哪个 GC?

multithreading - F# 同步访问列表

annotations - Flutter 不可变类?

java - 如何在运行时编译 Protocol Buffer 模式?

java - 了解 gradle 依赖关系