我是靠谱客的博主 激动雨,最近开发中收集的这篇文章主要介绍客户化排序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()方法来比较对象是否相同
 

最后

以上就是激动雨为你收集整理的客户化排序Set集合的全部内容,希望文章能够帮你解决客户化排序Set集合所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(44)

评论列表共有 0 条评论

立即
投稿
返回
顶部