您所在的位置:主页 > Java培训 >

Set接口实现类HashSet相关用法

时间:2014-04-09 10:00来源:未知 作者:疯狂java 点击:

        
  hashset类是set接口实现类之一,使用较为广泛,它不保存元素的加入顺序。hashset类根据元素的哈希码进行存放,所以取出时也可以根据哈希码快速找到。

  下面通过应用示例HashSetTest.java演示HashSet的相关用法。

  HashSetTest.java的代码清单如下所示。

  public class HashSetTest{

  public static void main HashSet();

  HashSet hs = new HashSet();

  hs.add("zxx");

  hs.add("zahx");

  hs.add("zyj");

  hs.add("zah");

  hs.add("zah");

  Iterator it =hs.iterator();

  while (it.hasNext())){

  System.out.printIn(it.next());

  }

  }

  }

  运行程序结果

  zah

  zyj

  zxx

  xmh

  zahx

  从结果可以看出,HashSet添加的顺序与迭代显示的结果顺序并不一致,这也验证了HashSet不保存元素加入顺序的特征。当然这个示例只是添加了String对象,所以略显简单。如果要添加一个自定义的对象,又该如何呢?

  创建名为Student的JavaBean文件。Student.java的代码清单如下所示。

  public class Student{

  private int age;

  private String name;

  Student(int num,String name){

  this.age=num;

  this.name=name;

  }

  public String toString(){

  return "age:"+"neme:"+name;

  }

  public int hashCode(){

  return age*name.hashCode();

  }

  public boolean equls(Object o){

  Student s=(Student) o;

  return age==s.age&&name.equals(s.name);

  }

  }

  因为Set集合中不能加入重复的元素,所以对于自定义类,需要提供判断怎么才算重复元素的方法。在本例中hashCode()和equals()方法即是用来判断Student对象是否为重复对象的标准方法。 equals()方法在前面的章节已经学习过,用来比较两个对象是否为相等的对象。在自己实现的equals方法中与相关的条件来进行比较。比如对于Student类,这里用年龄和姓名作为条件进行比较,年龄和姓名相同的对象就被示为相等的对象。在前面介绍Set接口是已经对hashCode()方法进行了简要介绍,为了加深印象,在此有必要在对hashCode()方法详细介绍一下。

  如果一个容器中有100个元素,再添加一个新元素时,是不是需要执行100次equals()方法。如果每增加一个元素就检查一次,那么当元素很多时,后添加到集合中的元素比较的次数就非常多了,这样显然会大大降低效率。于是,java采用了哈希表的原理。哈希算法也称为散列算法,是将数据依特定算法直接指定刀一个地址上。可以将hashCode()方法返回值看作是对象存储的物理地址的一个索引。添加新元素的时候,先通过索引查看这个位置是否存在元素,则在调用equals()方法与新元素进行比较,相同的话就不存了,不相同就散列其他的地址。这样就是实际调用equals()方法的次数大大降低了,提高了运算效率。java对于eqauls()方法和hashCode()方法的规定“如果两个对象相同,那么它们的hashCode值一定要相同”和“如果两个对象的hashCode值相同,它们并不一定相同”也就不难理解了。
 
        更多java咨询内容由广州java培训机构疯狂软件为你继续分享,敬请关注。