HashSet详解:不能重复(对象的哈希代码一样),无序
程序员文章站
2022-06-09 15:56:36
...
HashSet中不允许有重复的元素。例如: Set hashSet = new HashSet(); hashSet.add(new String("aaa")); hashSet.add(new String("bbb")); hashSet.add(new String("ccc")); hashSet.add(new String("aaa")); hashSet.add(new String("aaa")); 通过hashSet.size()获取它含有元素的个数,上面去掉重复的元素后,hashSet.size()=3。也就是说,在向HashSet中添加(add())元素的时候,对于重复的元素,只在HashSet中保留一个副本。 另外,HashSet中元素的顺序是随机的,包括添加(add())和输出都是无序的。 对HashSet集合的一些常用操作: add(Object) :添加元素(Object); addAll(Collection) :向HashSet中添加一个集合(Collection); remove(Object) :删除一个指定的元素(Object); removeAll(Collection) :删除一个指定的集合(Collection); size() :HashSet的容量,即HashSet内元素的个数; isEmpty() : 判断HashSet是否为空,即[]或size()=0,返回true或false; contains(Object) :判断某个元素(Object)是否在HashSet中,返回true或false; containsAll(Collection):判断HashSet是否包含某个集合(Collection); clear() :清空HashSet,使得size()=0; toArray() :将HashSet转换成一个Object[]; iterator() :构造一个HashSet迭代器,用于输出HashSet中的元素 使用迭代器输出HashSet中的元素,例如: Iterator it = hashSet.iterator(); while(it.hasNext()){ System.out.println((String)it.next()); } 假设有一个Person类: class Person{ private String name; private Integer age; public Integer getAge() { return age; } public void setAge(Integer age) { this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } } 构造两个Person的实例: Person p1 = new Person(); p1.setName("shirdrn"); p1.setAge(new Integer(26)); Person p2 = new Person(); p2.setName("shirdrn"); p2.setAge(new Integer(26)); 加入到HashSet中: Set hashSet = new HashSet(); hashSet.add(p1); hashSet.add(p2); 按理说,加入的这两个Person实例是相同的,HashSet应该只选择一个添加到集合里面。其实不然,此时的hashSet.size()=2。 这主要是由于Object拥有hashCode()和equals()两个方法,它认为具有相同的hashcode的对象才是同一个对象,即对同一个对象的引用。 所以必须在对应的实体类中重写hashCode()和equals()两个方法。在Person类中重写hashCode()和equals()两个方法,如下所示: public boolean equals(Object o){ if(this == o){ return true; } if(! (o instanceof Person)){ return false; } final Person other = (Person)o; if(this.name.equals(other.getName()) && this.age.equals(other.getAge())){ return true; } else{ return false; } } public int hashCode(){ int result; result = (name == null?0:name.hashCode()); result = 37*result + (age == null?0:age.hashCode()); return result; } 这时,再进行上面的测试,发现hashSet.size()=1。此时,对象p1和p2具有相同的hashcode,HashSet认为添加的两个Person实例是同一个对象,只把一个添加到集合里面。
下一篇: WPF数据绑定 1