A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

set

© 周一川 中级黑马   /  2013-4-9 17:18  /  1843 人查看  /  6 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

Set里的元素是不能重复的,那么用什么方法来区分重复与否呢? 是用==还是equals()? 它们有何区别?

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

6 个回复

倒序浏览
HashSet是这样实现的: 先去目标元素x的hashCode 根据散列函数(取余)找到索引index,然后再index这个索引的链表中一次查找,查找的方法是:首先比较hashCode值,若不相等,说明两个对象肯定不相同,若相同再用equals()比较,按照这样的方法,直到遍历完或者发现重复

评分

参与人数 1技术分 +1 收起 理由
陈丽莉 + 1

查看全部评分

回复 使用道具 举报
set里的元素是不能重复的,用iterator()方法来区分重复与否。equals 方法(是String类从它的超类Object中继承的)被用来检测两个对象是否相等,即两个对象的内容是否相等。==用于比较引用和比较基本数据类型时具有不同的功能:比较基本数据类型,如果两个值相同,则结果为true 而在比较引用时,如果引用指向内存中的同一对象,结果为true

评分

参与人数 1技术分 +1 收起 理由
冯海霞 + 1

查看全部评分

回复 使用道具 举报
hashset中的元素是不能相同的,一般需要重写set内部储存的对象的类中的hascode和equals方法
回复 使用道具 举报
HashSet集合中元素的是否相同,是通过判断元素的hashCode()方法和equals()方法,来区分的。因为,所存储元素的类型不同,所以,通常都会覆写hashCode()和equals()方法,如在存储自定义对象时,不仅要覆写hashCode(),也要覆写equals();方法。因为对象的equals()方法,比较的是对象在内存中的地址值,如果对象的hashCode值相同,地址不同,就会造成元素重覆,所以通过覆写equals()方法,使之比较的是对象的内容,就能解决些问题。

(ArrayLsit集合中元素是否相同,只通过equals()方法判断。)





import java.util.HashSet;
import java.util.Iterator;

public class HashSetDemo {
/**
  * @param args
  */
public static void main(String[] args) {
   HashSet hs=new HashSet();
   hs.add(new Person("LISI",22));
   hs.add(new Person("LISI",23));
   hs.add(new Person("LISI",24));
   hs.add(new Person("LISI",25));
   hs.add(new Person("LISI",25));
   
   
   Iterator it=hs.iterator();
   while(it.hasNext()){
    Person p=(Person)it.next();
    System.out.println(p.getName()+"--"+p.getAge());
   
   }
   
  }
}










class Person {
@Override
public boolean equals(Object obj) {//覆写Object 中的equals方法
  if (this==obj){
   return true;
  }
  if(!(obj instanceof Person)){
   return false;
  }
  System.out.println(this+".......equals........."+obj);
  Person p=(Person)obj;
  
  
  return this.name.equals(p.name)&&this.age==p.age;
}
@Override
public int hashCode() {//覆写hashCode方法,同时可以提高效率。(只要hashCode不同,就不需再调用equals方法。)
  System.out.println(this+"......hashCode()");
  return name.hashCode()+age*23;
}
private String name;
private int age;

public String getName() {
  return name;
}
public void setName(String name) {
  this.name = name;
}
public int getAge() {
  return age;
}
public void setAge(int age) {
  this.age = age;
}
public Person(String name, int age) {
  super();
  this.name = name;
  this.age = age;
}
public String toString(){
  return name+":"+age;
}





}
/*显示结果:
LISI:22......hashCode()
LISI:23......hashCode()
LISI:24......hashCode()
LISI:25......hashCode()
LISI:25......hashCode()//这里先调用覆写的hashCode()方法,比较。
LISI:25.......equals......LISI:25//当前对象调用覆写的equals()方法与前一个对象比较内容。
LISI--23
LISI--25
LISI--24
LISI--22
*/

回复 使用道具 举报
HashSet是如何保证元素的唯一性的呢?
          是通过元素的两个方法, hashCode和equals来完成。
          如果元素的HashCode值相同,才会继续判断equals是否为true。如果元素的HashCode值不同,不会调用equals。
所以要把对象存在Set集合中,一般要复写这两个方法
回复 使用道具 举报
Set是Collection容器的一个子接口,它不允许出现重复元素,当然也只允许有一个null对象。
e1.equals(e2) 的元素对 e1 和 e2 ”,由此可见回答使用equals()区分更合适。
==是用来判断两者是否是同一对象(同一事物),而equals是用来判断是否引用同一个对象。再看一下Set里面存的是
对象,还是对象的引用。根据java的存储机制可知,set里面存放的是对象的引用,所以当两个元素只要满足了equals()时就已经指向同一个对象,
也就出现了重复元素。所以应该用equals()来判断。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马