概述
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集合所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复