java - 我的 stack 类中的 push() 会改变堆栈中的每个元素

标签 java arrays class methods stack

我制作了一个基于DataRecord的堆栈数组。 这两个类的编译都没有错误,但是当我将 push() 推送到堆栈时,它会改变 stackArray[] 的每个索引中的数据。

我找不到哪一行代码导致了这个问题。 请帮我找出原因,谢谢。

数据记录类:

public class DataRecord
{
    private String id;
    private String data;

    //default constructior
    public DataRecord( )
    {
        this.id = " ";
        this.data = " ";
    }

    //overloded constructor
    public DataRecord( String id, String data )
    {
        this.id = id;
        this.data = data;
    }

    //set method
    public void setIDandData( String id, String data )
    {
        this.id = id;
        this.data = data;
    }


    //get method
    public String getID()
    {
        return id;
    }
    public String getData()
    {
        return data;
    }

    //toString
    public String toString()
    {
        return "\n Your ID is : " + id +
                "\n Your DataRecord is : " + data + "\n";
    }
}//End of DataRecord

MyStack1 类:

class MyStack1
{
    private int maxSize;
    private DataRecord[] stackArray;
    private int top;
    private String tempString = "";

    public MyStack1(int sizeOfStack)
    {
        maxSize = sizeOfStack;
        stackArray = new DataRecord[maxSize];
        top = -1;
    }

    public void push( DataRecord userInput )
    {
        stackArray[++top] = userInput;
    }

    public DataRecord pop()
    {
        return stackArray[top--];
    }

    public String toString()
    {
        tempString = "";

        for(int i = 0; i <= top; i++)
        {
            tempString += i+1 + stackArray[i].toString();
        }
        return "\nThe max size of the stack is : " + maxSize +
                "\nThe top index of the stack is : " + top +
                "\nThe top element of the stack is : " + stackArray[top] +
                "\nThe list of element in the stack is : " +
                "\n" + tempString;
    }

    public static void main(String[] args)
    {
        MyStack1 stackArray = new MyStack1( 5 );

        DataRecord newData = new DataRecord(" Hello "," world! ");
        stackArray.push(newData);

        System.out.println("Results : " + stackArray.toString());

        newData.setIDandData("why","omg");
        stackArray.push( newData );

        System.out.println("Results : " + stackArray.toString());

        System.out.println("pop :"+stackArray.pop().toString());
        System.out.println("pop :"+stackArray.pop().toString());
    }
}

output looks like

当我编译并运行时,输出如上图所示。

最佳答案

DataRecord newData = new DataRecord(" Hello "," world! ");
stackArray.push(newData);

System.out.println("Results : " + stackArray.toString());

newData.setIDandData("why","omg");
stackArray.push( newData );

newData.setIDandData正在修改您已放入的对象。您必须显式创建一个新的DataRecord; Java 不会隐式复制对象。当您将 newData 压入堆栈时,它会压入对该对象的引用;在一处修改该对象仍然会修改您放入堆栈中的对象。

没有办法解决这个问题;这就是 Java 的工作原理。

关于java - 我的 stack 类中的 push() 会改变堆栈中的每个元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33044445/

相关文章:

c++ - 巨大的数组导致堆栈溢出

java - 可以在 For 循环中初始化 boolean 数组吗?

PHP OOP 类 vs 函数 vs 静态函数效率

c++ - 为什么我的函数不产生输出

java - 抽象类中的非抽象空方法是什么意思

java - 为什么实现 Serializable 的对象的序列化会抛出异常?

java - 我如何将参数添加到 Jersey 过滤器请求(ContainerRequestFilter)的请求

java - JSF2 和 PrettyFaces...如何获取原始 URL 或查询字符串?

java列表处理时间

ruby - 编写 Ruby 库 - 从模块外部隐藏方法