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基础之——HashSet中是如何判断元素是否重复的

原文:http://blog.csdn.net/ning109314/article/details/17354839 HashSet不能添加重复的元素,当调用add(Object)方法时候...
  • xuxiaoxie
  • xuxiaoxie
  • 2016年05月09日 19:46
  • 3524

HashSet中是如何判断元素是否重复的

HashSet不能添加重复的元素,当调用add(Object)方法时候, 首先会调用Object的hashCode方法判hashCode是否已经存在,如不存在则直接插入元素; 如果已存在则调用Ob...
  • ning109314
  • ning109314
  • 2013年12月16日 16:13
  • 15802

C++之STL中set的用法总结

set概述和vector、list不同,set、map都是关联式容器。set内部是基于红黑树实现的。插入和删除操作效率较高,因为只需要修改相关指针而不用进行数据的移动。 在进行数据删除操作后,迭代器...
  • u010902721
  • u010902721
  • 2015年05月16日 21:39
  • 14055

Java类集框架——Set接口和子接口SortedSet以及SortedSet接口的子类TreeSet之间的联系和使用、排序设置重复元素的说明

学习目标: 掌握Set接口与Collection接口的关系。 掌握Set接口的常用子类:TreeSet、HashSet。 掌握TreeSet的排序原理。 掌握Set接口中重复元素的定义。 掌...
  • u013087513
  • u013087513
  • 2016年08月16日 16:30
  • 1046

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

import java.util.Set; import java.util.TreeSet; public class Person{ private String name; private...
  • Joywy
  • Joywy
  • 2012年07月27日 10:16
  • 6405

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

set集合是可以重复的元素集合; 用set集合添加一个学生对象元素时:import java.util.ArrayList; import java.util.HashSet; import jav...
  • qq_38274324
  • qq_38274324
  • 2017年07月25日 19:12
  • 331

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

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

Set集合重复元素的判断

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

Set和数学中的集合是同一个概念,就是没有重复元素的集合。

Set和数学中的集合是同一个概念,就是没有重复元素的集合。 这篇文章主要论述了Set是如何实现"没有重复元素"(no duplicate elements)的,以及阐述了什么是“重复”(duplic...
  • luyuncsd123
  • luyuncsd123
  • 2012年12月27日 18:20
  • 2103

有重复元素的排列问题

  • 2016年04月05日 11:59
  • 858B
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java中Set包含重复元素的问题
举报原因:
原因补充:

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