java集合中hashSet与TreeSet学习总结

来源:互联网 发布:linux 查看java版本 编辑:程序博客网 时间:2024/05/22 02:30

集合hashSet与TreeSet(仅就成员元素为自定义类型)总结如下:

1、hashSet

为保证hashSet集合中的自定义成员元素的唯一性(或不可重复性),自定义成员元素所属的类一定要重写Object类中hashCode()方法及equals()方法。

为什么要这么作呢?

我们试想:怎么判断两个元素相等呢?答案是利用equals方法。可是,假如我们集合中的元素已经有1000个了,那么当地1001个元素加入集合中时,它就要与前面的1000个元素利用equals方法比较。这样显然不好,效率太低。

我们再想:为什么要重写hashCode方法呢? 哈希算法也称为散列算法,是将数据依特定算法直接指定到一个地址上。可以这样理解,hashCode方法实际上返回的就是对象存储的物理地址(实际可能并不是)。 这样一来,当集合要添加新的元素时,先调用这个元素的hashCode方法,就一下子能定位到它应该放置的物理位置上。 如果这个位置上没有元素,它就可以直接存储在这个位置上,不用再进行任何比较了;如果这个位置上已经有元素了, 就调用它的equals方法与新元素进行比较,相同的话就不存了,不相同就散列其它的地址。 所以这里存在一个冲突解决的问题。这样一来实际调用equals方法的次数就大大降低了。  

hashCode方法返回值如何定义?

一般来讲就是根据成员元素所属类的属性的hash值来确定。

2、TreeSet 

TreeSet类型的集合有两中排序的方法:一个是自然的排序方法,另一个是自定义的排序方法。

在使用自然排序方法时要注意,成员元素所属的类一定要实现java.lang.comparable接口,并覆盖compareTo方法。compareTo方法的返回值类型为int型。

import java.util.*;

class Person implements Comparable

{

private int age;

private String name;

public Person(String name,int age)

{

this.name = name;

this.age = age;

}

public String getName()

{

return name;

}


public int getAge()

{

return age;

}

//重写java.lang.comparable接口中compareTo方法

public int compareTo(Object obj)

{

if (!(obj instanceof Person))

{

throw new RuntimeException("对象加入错误!");

}

Person p = (Person)obj;

if(this.getAge()>p.getAge())

{

return 1;

}

else if (this.getAge()<p.getAge())

{

return -1;

}

else if (this.getAge()==p.getAge())//如果年龄相同则比较姓名。

{

return this.getName().compareTo(p.getName());

}

return -1;

}

//重写toString方法

public String toString()

{

return this.getName()+"---"+this.getAge();

}

}


class TreeSetDemo

{

public static void main(String[] args)

{

TreeSet ts = new TreeSet();//创建TreeSet类型集合ts

ts.add(.......);//添加元素

...................;//添加元素

....................;//添加元素

sop(ts);

}

public static void sop(Object obj)

{

System.out.println(obj);

}

}

在使用自定义排序方法时要注意,在创建TreeSet类型的集合时需指定其排序方法对象。(该对象属于一个实现了java.util.comparator接口的类,该类中有覆盖comparator接口中compare方法的方法)

//利用自定义方法排序

java.util.*;

class TreeSetDemo

{

public static void main(String[] args)

{

TreeSet   ts = new TreeSet(new MyComp());//指定排序方法对象。

//添加对象

ts.add(....);

................;

sop(ts);

}

public static void sop(Object obj)

{

System.out.println(obj);

}

}


class Person

{

private int age;

private String name;

public Person(String name,int age)

{

this.name = name;

this.age = age;

}

..............................

.....................................

................................

}

//MyComp 实现Comparator接口

class MyComp implements Comparator

{

//覆盖Comparator接口中compare方法

public int compare(Object obj1,Object obj2)

{

Person p1 = (Person)obj1;

Person p2 = (Person)obj2;

if (p1.getAge()-p2.getAge()=0)

{

return p1.getName().compareTo(p2.getName());

}

return -(p1.getAge()-p2.getAge());

}

}

0 0
原创粉丝点击