为什么HashSet.add(Object)不替换现有对象?

时间:2016-08-04 10:30:12

标签: java data-structures hashset

这更像是一个设计问题,我很好奇为什么HashSet不支持使用add添加类似操作。

如果我想将具有相同hashCode的对象更新为现有对象,我必须这样做:

END { print line }

我认为

hashSet.remove(o);
hasSet.add(o);

应该已经足够了,因为无论如何它都会使用HashMap。

3 个答案:

答案 0 :(得分:5)

没有必要用等于它的元素替换HashSet元素。在HashMap中,有一点可以替换现有密钥的条目,因为值可能不同。

  

我认为hashSet.add(o);应该已经足够了,因为它无论如何都会使用HashMap

其实没有。你是HashSetHashMap支持是正确的,其中Set的每个元素都是一个键,值是一个虚拟对象。但是,如果map.put(key,value)中的Map中存在相等的密钥(它只替换了值),则HashSet不会替换密钥,如果元素已存在,则Set无法替换该元素。 private void Generate_button1_Click(object sender, EventArgs e) if (comboBox1.SelectedIndex == 0) { comboBox2.Items.Clear(); from = int.Parse(textBox2.Text); to = int.Parse(textBox3.Text); result = to - from; for (int i = 0; i <= result; i++) { string item = Convert.ToString(from + i); // Given"A" to seperate from each other comboBox2.Items.Add(item); vals.Add(new KeyValuePair<int, string>(0, item)); // CatA has 0 key value } MessageBox.Show("Serial Book Generated Success", "Success"); } if (comboBox1.SelectedIndex == 1) { comboBox2.Items.Clear(); from = int.Parse(textBox2.Text); //50 to = int.Parse(textBox3.Text); // 60 result = to - from; // 10 for (int i = 0; i <= result; i++) { string item = Convert.ToString(from + i); // Given"A" to seperate from each other comboBox2.Items.Add(item); vals.Add(new KeyValuePair<int, string>(1, item)); // CatA has 0 key value } MessageBox.Show("Serial Book Generated Success", "Success"); } } 没有先删除它。

答案 1 :(得分:3)

Set的目的是跟踪添加到其中的唯一元素。但&#34;独特&#34;这意味着&#34;不等于你的.equals()方法所定义的集合中的任何其他内容。

如果你有一个案例,你需要添加两个相同的东西,它表明你根本不想要Set,或者你的.equals()方法不是&# 39;非常正确。 .equals()的要点是,如果你做对了,那么如果他们真的关心ab中的哪一个,他们就会非常关心。{1}}&#39}等于。

答案 2 :(得分:0)

Set Javadoc清楚地指明了这种行为。

  

如果指定的元素尚不存在(可选操作)(...)

,则将该元素添加到该集合中