Java 设置BuffereImage的单个像素将在另一个BuffereImage中设置相同的像素。为什么?

Java 设置BuffereImage的单个像素将在另一个BuffereImage中设置相同的像素。为什么?,java,memory,bufferedimage,behavior,Java,Memory,Bufferedimage,Behavior,我在编写另一个项目时遇到了这个问题,但我已经将代码简化为直接受到上述问题影响的代码 EntryPoint.java package replaced.with.real.package.in.code.at.compile.time; import java.awt.image.BufferedImage; import java.util.Random; public class EntryPoint { public static void main(String[] args

我在编写另一个项目时遇到了这个问题,但我已经将代码简化为直接受到上述问题影响的代码

EntryPoint.java

package replaced.with.real.package.in.code.at.compile.time;

import java.awt.image.BufferedImage;
import java.util.Random;

public class EntryPoint {

    public static void main(String[] args) {
        BufferedImage a = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
        BufferedImage b = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);

        a = Util.genOriginBlue();
        b = Util.genOriginBlue();
        a.setRGB(new Random(0L).nextInt(500), new Random(1L).nextInt(500), 0xffffff);
        System.out.println(a == b);
    }

}
Util.java

package replaced.with.real.package.in.code.at.compile.time;

import java.awt.image.BufferedImage;


public class Util
{
    static BufferedImage oB;

    public static BufferedImage genOriginBlue()
    {
        if(oB == null)
        {
            oB = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
            oB.setRGB(0, 0, 1, 1, new int[] {255}, 0, 1);
        }
        return oB;
    }
}
这将打印“true”,表示BuffereImage a和BuffereImage b相同。正如我以相同的方式生成它们,直到使BuffereImage不同的行开始“a.setRG(..”,我不会期望输出。如果我开始这样循环代码,情况会变得更糟,但尤其是每次生成输出BuffereImage的代码都不同,这正是我在上述项目中所做的

提前感谢您提供的任何帮助

另外,这是我在这里发布的第二个问题,如果我做得不对,请说出来

干杯

    BufferedImage a = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
    BufferedImage b = new BufferedImage(1024, 768, BufferedImage.TYPE_INT_RGB);
上面的代码行没有任何作用,因为在下面的两行代码中,您将“a”和“b”变量的值重置为Util.GenOriginBlue()方法返回的值

然后在Util类中使用:

static BufferedImage oB;
这意味着您将只拥有BuffereImage的一个实例。因此,代码中的if语句将只执行一次,然后在第二次调用该方法时,您只返回对BuffereImage的相同引用


您需要在Util.genOriginBlue()方法中创建BuffereImage的新实例。因此,请去掉静态“ob”变量并去掉if语句。这样,创建BuffereImage时,您的BuffereImage将是相同的,但您可以单独更改像素。

尝试
.equals()
在第一个选项中。@BitNinja测试后,它会产生相同的输出。也就是说,如果您引用的是“System.out.println(a==b)”,并建议它应该是“System.out.println(a.equals(b))'。我很感谢您的帮助,这解决了部分问题。第二部分仍然存在:在我的更大的项目中,使用类似的代码段,我做了比设置单个像素更高级的事情。例如,绘制一些高级2D几何体。我以同样的方式,每秒50次。所有这些几何体项目都需要一段时间来渲染t-so-beefy computer,我真的只想在程序执行过程中执行一次这样的任务,而不是频繁地执行。在后一种情况下,我最终会重复执行同样的、资源密集型的任务。提前感谢所有寻求提示的人。
static BufferedImage oB;