HashSet:底层是哈希表。通过元素的两个方法:HashCode 和equals完成的。如果哈希值相同就判断equals
,如果哈希值不同则不会调用equals。(保证唯一性)
对于判断元素是否存在,或者删除等操作,依赖的方法也是HashCode和equals方法。
TreeSet:底层是二叉树。
代码实例:
- import java.util.*;
- class HashSetTest
- {
- public static void sop(Object obj){
- System.out.println(obj);
- }
- public static void main(String[] args){
- HashSet hs = new HashSet();
- hs.add(new Person("a1",11));
- hs.add(new Person("a1",11));
- hs.add(new Person("a3",13));
- hs.add(new Person("a4",14));
- Iterator it = hs.iterator();
- while (it.hasNext())
- {
- Person p = (Person)it.next();
- sop(p.getName()+"****"+p.getAge());
- }
- }
- }//创建一个Person类
- class Person
- {
- private String name;
- private int age;
- Person(String name,int age){
- this.name = name;
- this.age= age;
- }
- public int hashCode(){//为了尽量保证哈希值唯一性,age乘以一个数。
- return name.hashCode()+age*37;
- }//复写equals方法
- public boolean equals(Object obj){
- if(!obj instanceof Person)
- return false;
- Person p = (Person)obj;
- System.out.println(this.name+"***equals***"+p.name);
- return this.name.equals(p.name)&&this.age==p.age;
- }
- public String getName(){
- return name;
- }
- public int getAge(){
- return age;
- }
- }
复制代码
下面介绍TreeSet:可以对set集合的元素进行排序(自然顺序ascii),
排序时,当主要条件相同时,一定要判断一下次要条件,底层是二叉树,
保证元素唯一的方法是compareTo和return 0。
代码演示:
- //演示存储学生对象,按照学生年龄进行排序。
- import java.util.*;
- class TreeSetTest
- {
- public static void main(String [] args){
- TreeSet ts = new TreeSet();
- ts.add(new Student("lisi01",11));
- ts.add(new Student("lisi02",12));
- ts.add(new Student("lisi03",13));
- ts.add(new Student("lisi04",14));
- ts.add(new Student("lisi05",15));
- Iterator it = ts.iterator();
- while(it.hasNext()){
- Student stu = (Student)it.next();
- System.out.println(stu.getName()+"**********"+stu.getAge());
- }
- }
- }
- class Student implements Comparable//该接口强制让学生类具有比较性
- {//不实现该接口就会抛出类型转换异常classCastException
- private String name;
- private int age;
- Student(){
- this.name = name;
- this.age = age;
- }
- //需要覆盖比较方法compareTo
- public int compareTo(Object obj){
- if(!(obj instanceof Student))
- throw new RuntimeException("不是学生类对象");
- Student s = (Student)obj;
- if(this.age>s.age)
- return 1;
- if(this.age==s.age)
- {//如果年龄相同,则比较名字
- return this.name.compareTo(s.name);
- }
- return -1;
- }
- public String getName(){
- return name;
- }
- public int getAge(){
- return age;
- }
- }
复制代码
|
|