禁用java链表中自动更改的对象值

时间:2016-04-12 03:33:21

标签: java linked-list

我今天只是注意到奇怪的行为,即使我已经用Java写了2年。 这里看看我的代码,

    public static void main() {
    Lorem lo = new Lorem("abc", 2);        
    LinkedList<Lorem> lim = new LinkedList<>();        
    lim.add(lo);
    LinkedList<Lorem> lid = new LinkedList<>();        
    lo.tf++;        
    lid.add(lo);

    System.out.println("in list lim: " + lim.get(0).term + " " + lim.get(0).tf);        
    System.out.println("in list lid: " + lid.get(0).term + " " + lid.get(0).tf);
    }

    class Lorem {
    public String term;
    public int tf;

    public Lorem(String term, int tf) {
        this.term = term;
        this.tf = tf;
    }
    }

结果是这样的:

in list lim: abc 3
in list lid: abc 3

是的,那是相同的对象,添加到不同的列表中。一个列表保存对象,当它的状态是term =&#34; abc&#34;,tf = 2.另一个保存对象当term =&#34; abc&#34;并且tf = 3.最后,您可以看到每个列表的打印值。 令人惊讶的是,lim中的物体lo与盖子中的lo具有完全相同的值。即使我没有同步它们。 我的问题是:为什么Java会自动更新(同步)这样的其他列表?如何禁用该行为?

1 个答案:

答案 0 :(得分:1)

这并不奇怪,我想知道你是如何在2年的编程中发现的。

Java通过引用工作。所以你在列表中存储的不是一个对象,而是一个指向堆中某处的实际分配对象的引用,就好像你的LinkedList只包含一个Lorem的内存地址。

由于您要向两个列表添加相同的引用,因此两个引用都将指向相同的Lorem实例(在技术上不包含在两个LinkedList中的任何一个中,因为它们只包含对Private Sub txtmRate_TextChanged(sender As Object, e As EventArgs) Handles txtmRate.TextChanged txtmRate.Text = Format(CDbl(txtmRate.Text), "#,##0.00") End Sub 'For Textbox Change Private Sub cmdSave_Click(sender As Object, e As EventArgs) Handles cmdSave.Click If txtPos.Text = "" Or txtDept.Text = "" Or txtmRate.Text = "" Then MessageBox.Show("Please fill up all the details!", "Error!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk) Else If MessageBox.Show("Do you really want to add this new data?", "Save!", MessageBoxButtons.YesNo, MessageBoxIcon.Asterisk) = vbYes Then sqlqry = "INSERT INTO tblPosition(WorkPosition,Department,MonthlyRate) VALUES (@wPos,@Dept,@mRate)" Try ConnDB() cmd = New OleDbCommand(sqlqry, cnn) cmd = cnn.CreateCommand With cmd .Connection = cnn .CommandText = sqlqry .CommandType = CommandType.Text .Parameters.AddWithValue("@wPos", OleDbType.VarWChar = 50).Value = txtPos.Text .Parameters.AddWithValue("@Dept", OleDbType.VarWChar = 50).Value = txtDept.Text .Parameters.AddWithValue("@mRate", OleDbType.Currency = 10).Value = txtmRate.Text .ExecuteNonQuery() End With MessageBox.Show("New Data successfully added!", "Save!", MessageBoxButtons.OK, MessageBoxIcon.Asterisk) RefreshData() cmd.Dispose() ctrl_clear() Catch ex As Exception MsgBox(ex.Message) Finally If cnn.State = ConnectionState.Open Then cnn.Close() End If End Try End If End If End Sub 'For Saving Record 的引用它)。

如果要存储两个不同的元素,则需要分配一个新对象(并可能复制/传输状态)。