Java 如何仅使用一个实例化对象来存储多个值?

Java 如何仅使用一个实例化对象来存储多个值?,java,Java,我刚刚接触了JAVA中的队列,但我不知道如何使用对象。下面是一段代码,我试图找出如何仅使用一个实例化对象而不是多个对象来存储多个数据 public class value { private int A; public int getA() { return A; } public void setA(int a) { this.A = a; } public String toString() {

我刚刚接触了JAVA中的队列,但我不知道如何使用对象。下面是一段代码,我试图找出如何仅使用一个实例化对象而不是多个对象来存储多个数据

public class value {

    private int A;

    public int getA() {
        return A;
    }

    public void setA(int a) {
        this.A = a;
    }

    public String toString()
    {
        return Integer.toString(A);
    }
}
__

Queue q=new PriorityQueue();
值v1=新值();
值v2=新值();
值v3=新值();
值v4=新值();
值v5=新值();
v1.刚毛(1);
v2.刚毛(7);
v3.刚毛(5);
v4.刚毛(6);
v5.setA(2);
q、 添加(v1);
q、 添加(v2);
q、 添加(v3);
q、 添加(v4);
q、 添加(v5);
而(!q.isEmpty())
{
System.out.println(q.poll());
}
上述申报表: 1 2 5 6 7

__

然后我尝试了第二段代码

    Queue<value> q=new PriorityQueue<value>(a);

    value v1 = new value();
    v1.setA(0);
    q.add(v1);
    v1.setA(3);
    q.add(v1);
    v1.setA(5);
    q.add(v1);

    while(!q.isEmpty())
    {
        System.out.println(q.poll().getA());
    }
Queue q=new PriorityQueue(a);
值v1=新值();
1.setA(0);
q、 添加(v1);
v1.刚毛(3);
q、 添加(v1);
v1.刚毛(5);
q、 添加(v1);
而(!q.isEmpty())
{
System.out.println(q.poll().getA());
}
第二个返回我:5,5,5

我是否需要为添加的每个新数据实例化该类?如果我这样做的话,似乎很足智多谋。添加(v1)不会创建副本并将副本存储在队列中,而是将对
v1
的引用添加到队列中。因为我们添加到队列中的是引用,所以队列中的所有元素(例如第2个)都是相同的。由于引用指向同一个对象,实际上只有一个对象。在这里,对象的最终状态的值为5。因此,输出为5

如果需要存储单独的值,则需要创建新对象。与原语相比,可能会有一些开销,但面向对象语言就是这样工作的。为了使用集合,您需要任何方式的对象。。在这种情况下,
类相当于一个
整数

我是否需要为添加的每个新数据实例化该类

基本上,是的

在第二个示例中,将一个对象添加到队列中三次,并在两次添加之间对其进行更改。没有复制,因此队列中的同一对象会出现三次

除了不做你期望的事情之外,这实际上是一个非常糟糕的主意。当在队列中修改对象时,如果修改的方式改变了队列的优先级顺序,则可能会破坏数据结构,导致元素以意外的顺序添加和删除


(有趣的是,javadoc没有明确提到这一点。但是,很明显,阅读源代码时会出现这种情况。)

首先,您必须知道以下问题的答案:

  • 什么是物体
  • 队列中添加了什么
因此,以下是第一个问题的答案: 你的类是一个模具,你的对象是一个由模具制成的碗

下面是对第二个问题的回答: 队列仅存储对对象的引用


您将对同一个碗(对象)的引用存储三次,当您“在碗中看到汤”(轮询您的队列)时,您将看到相同的汤(值)。这汤(价值)将与你上次倒在碗里的汤一样。所以,你必须制作不同的碗(物品)来储存不同的汤(价值)。

谢谢!但另一方面,如果我不是硬编码并使用扫描器输入数据,我不知道需要实例化多少数据,那么我将如何处理这个问题?我是否应该使用唯一的数据成员并将其设置在队列中,其余的数据将其放置在ArrayList中,以便我可以使用优先级队列了解顺序,并使用ArrayList调用其余的信息?我不明白你在问什么。请清楚地解释这个新的例子,最好是在一个新问题中。是的,我在尝试另一个关于优先级队列的问题,所以我只发送了部分问题,从而缩短了问题。根据您的回答,我理解我需要为每个对象进行不同的实例化,否则每次都会添加相同的对象。我又玩了一会儿,找到了解决问题的办法。感谢您的回答和关注:))
    Queue<value> q=new PriorityQueue<value>(a);

    value v1 = new value();
    v1.setA(0);
    q.add(v1);
    v1.setA(3);
    q.add(v1);
    v1.setA(5);
    q.add(v1);

    while(!q.isEmpty())
    {
        System.out.println(q.poll().getA());
    }