Java中Set包含重复元素的问题

原创 2007年09月22日 17:18:00
 

HTML Tags and JavaScript tutorial



Java中Set包含重复元素的问题





在JDK的API文档中,Set接口的第一段的内容是:A collection that contains no duplicate
elements. More formally, sets contain no pair of elements e1 and e2 such that e1.equals
(e2), and at most one null element.也就是说Set是一个不包含重复元素的 collection。更正式地
说,set 不包含满足 e1.equals(e2) 的元素对 e1 和 e2,并且最多包含一个 null 元素。正如其名
称所暗示的,此接口模仿了数学上的 set 抽象。
今天我们要说的是这个重复元素的一个微妙情况,如果我们一开始加入的是各部相同的元素,但是加
入之后我们改变其中的某个元素的值,使得它与另一个元素相同,这样之后会发生什么事情呢?
我们来看一段代码:
package com.fun;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class SetTest
{
 public static void main(String[] args)
 {
  Set<Element> set = new HashSet<Element>();
  Element i1 = new Element(1);
  Element i2 = new Element(2);
  Element i3 = new Element(3);
  set.add(i1);
  set.add(i2);
  set.add(i3);
  System.out.println("Before changed:");
  printSet(set);
  i1.setValue(2);
  System.out.println(i1.equals(i2));
  System.out.println("After changed:");
  printSet(set);
 }
 public static void printSet(Set set)
 {
  Iterator it = set.iterator();
  while (it.hasNext())
  {
   System.out.println(it.next());
  }
 }
}
class Element
{
 private int value;
 public Element(int value)
 {
  this.value = value;
 }
 public void setValue(int value)
 {
  this.value = value;
 }
 public int getValue()
 {
  return this.value;
 }
 @Override
 public String toString()
 {
  return "" + this.value;
 }
 @Override
 public boolean equals(Object obj)
 {
  if(this ==(Element)obj)
   return true;
  if (!(obj instanceof Element))
  {
   return false;
  }
  if (((Element) obj).getValue() == this.getValue())
  {
   return true;
  }
  return false;
 }
 @Override
 public int hashCode()
 {
  return 37 + this.value;
 }
}
  代码的逻辑很容易明白,我们先加入到Set里面的是不同的元素,加入后,我们修改其中某个元素的
值,从而使得其与Set中的另外一个元素的值相等,equals比较的时候得到的是true,对此有何解释呢

  在Java中,这种现象应该属于一种未定义的行为,所以我们最好的方法就是使用不可变类
(immutable),或者避免修改数据(不过好像不修改数据在一般情况下是不可能的)。幸而Java类库中
的绝大多数作为数据载体的类,例如String和所有原始类型数据的封装对象Integer、Double、Float
等均为不可变类,所有使用这些类的时候没什么问题。但是如果使用用户自定义的数据类型,那么尽
量实现其为不可变的类,如果实现比较困难的话,那么就只有尽量避免修改集合元素的值。
在《高质量Java程序设计》中还提出了Map也有此情况出现,大家可以试一下。
 参考-高质量Java程序设计[专著] / 顾晓刚等编著. - 北京: 电子工业出版社, 2003.1 


版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

java中set集合如何去除重复元素

set集合是可以重复的元素集合; 用set集合添加一个学生对象元素时:import java.util.ArrayList; import java.util.HashSet; import jav...

JAVA类集----Set接口排序及重复元素说明

import java.util.Set; import java.util.TreeSet; public class Person{ private String name; private...
  • Joywy
  • Joywy
  • 2012-07-27 10:16
  • 6068

在Java中利用set特性删除重复的数组元素

Set(): 存入Set的每个元素必须是唯一的,因为Set不保存重复元素。加入Set的Object必须定义equals()方法以确保对象的唯一性。Set与Collection有完 全一样的接口。Se...

有重复元素的排列问题

  • 2011-12-21 21:19
  • 385KB
  • 下载

Set集合重复元素的判断

Set集合比较特殊,他的方法基本上和Collection接口的方法一致,并且他没有根据索引得到对应值的get(int index)方法. 更重要的是Set集合不能放置重复的元素.她是怎么判断的呢?那么...
  • ic_tv
  • ic_tv
  • 2015-04-03 19:08
  • 465

有重复元素的排列问题

Java学习疑点(6)--Set集合添加元素时底层如何实现无重复元素?

最近在学习Collection时发现Set集合的一个显著特点: 不包含重复元素. 经过测试之后发现Set集合在向其添加元素时add()和addAll()方法就对元素进行了"审查", 对比查看是否为尚未...
  • kmter
  • kmter
  • 2013-08-24 21:18
  • 8164

有重复元素的排列问题

  • 2016-04-05 11:59
  • 858B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)