客户化排序Set集合

HashSet类、LinkedHashSet类、TreeSet类均实现了Set接口,现分别对这三种Set类做详细介绍及优劣分析,如下
由HashSet类实现的Set集合的优点是能够快速定位集合中的元素,由HashSet类实现的Set集合中的对象必须是唯一的,所以需要添加到由HashSet类实现的Set集合中的对象,需要重新实现equals()方法,从而保证插入集合中对象的标识的唯一性。由HasnSet类实现的Set集合的排序方式为按照哈希码排序,根据对象的哈希码确定对象的存储位置,所以需要添加到由HashSet类实现的Set集合中的对象,还需要重新实现hashCode()方法,从而保证插入集合中的对象能够合理地分布在集合中,以便于快速定位集合的对象。此外还需注意,重写了equasl()方法,hashCode()方法,最好也重写toString()方法,这三种方法三位一体,下面以具体例子对上文做具体讲解:
先看main函数

public static void main(String...strings)
 {
  HashSet<Cat>  a1 = new HashSet<Cat>();
  a1.add(new Cat(1));
  a1.add(new Cat(2));
  a1.add(new Cat(3));
  a1.add(new Cat(4));
  a1.add(new Cat(5));
  a1.add(new Cat(1));
  System.out.println(a1.size());
  //我们希望预期结果为5,但实则是6
  
  HashSet<Dog> a2 = new HashSet<Dog>();
  a2.add(new Dog(1));
  a2.add(new Dog(2));
  a2.add(new Dog(3));
  a2.add(new Dog(4));
  a2.add(new Dog(5));
  a2.add(new Dog(1));
  System.out.println(a2.size());
  
  //因为在Dog类中重写了equals()方法 和 hashCode()方法,所有得到了期望值5
  //从上述例子还可以得出,当两个HashSet集合中的对象作比较时,首先
  // 比较的是hashCode()方法,当通过hashCode()比较的相同时,再比较equals()方法
 
  HashSet<Tiger> a3 = new HashSet<Tiger>();
  a3.add(new Tiger(1));
  a3.add(new Tiger(2));
  a3.add(new Tiger(3));
  a3.add(new Tiger(4));
  a3.add(new Tiger(5));
  a3.add(new Tiger(1));
  System.out.println(a3.size());
  //从上诉例子可以看出,即使Tiger实现了Comparable接口,实现了compareTo()方法
  //但仍没有达到预想的结果,所以HashCode类并不通过实现Comparable接口中compareTo()方法来判断集合中元素的唯一性
 }

下面,看Cat类,Dog类,Tiger类

//新建一个猫类,只有属性size
public class Cat {
 int size;
 public Cat(int size)
 {
  this.size = size;
 }
}
public class Dog {
 int size;
 public Dog(int size)
 {
  this.size = size;
 }
 
 public boolean equals(Object obj)
 {
  System.out.println("Dog equals~");
  if(this.size - ((Dog)obj).size == 0)
   return true;
  else
   return false;
 }
 
 public int hashCode()
 {
  System.out.println("Dog hashCode~");
  return this.size;
 }
 
 public String toString()
 {
  return "I am "+this.size+"Dog";
 }
}
public class Tiger implements Comparable<Tiger> {
 int size;
 public Tiger(int size)
 {
  this.size = size;
 }
 
 public int compareTo(Tiger o) 
 {
  System.out.println("Tiger compareTo ~");
  return this.size-o.size;
 }
}

上面实例已经将HashSet介绍完毕,对于LinkedHashSet,如果既想保留HashSet类快速定位集合中对象的优点,又想让集合中的对象按插入的顺序保存,可以使用LinkedHahsSet实现Set集合。
TreeSet类不仅实现了Set接口,还实现了java.util.SortedSet接口,从而保证在遍历集合时按照递增的顺序获得对象。遍历对象时可能是按照自然顺序递增排序,所以存入用TreeSet类实现的Set集合的对象必须实现Comoarable接口,也可以按照指定的比较器递增排列,即可以通过比较器对TreeSet类实现Set集合中对象的排序。

 public static void main(String[] args) {
  TreeSet<Tiger> a4 = new TreeSet<Tiger>();
  a4.add(new Tiger(1));
  a4.add(new Tiger(2));
  a4.add(new Tiger(3));
  a4.add(new Tiger(4));
  a4.add(new Tiger(5));
  a4.add(new Tiger(1));
  Iterator it = a4.iterator();
  while(it.hasNext())
   System.out.println(it.next());
  System.out.println(a4.size());
 }
 //该例子可以看出,对于TreeSet类,每次通过compareTo()方法来比较对象是否相同
 
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一只学弱狗!

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值