Java数据结构——Set

来源:互联网 发布:淘宝大促活动 编辑:程序博客网 时间:2024/06/05 20:33

Java数据结果——Set

集合Set

  • Java中使用Set接口描述一个集合(集合不允许有“重复值:注意重复的概念”),集合Set是Collection的子接口,Set不允许其数据元素重复出现,也就是说在Set中每一个数据元素都是唯一的。Set接口定义的常用方法如下:
序号 方法 描述 1 size() 获取Set尺寸(即Set包含数据元素的总数) 2 add(Object obj) 向Set中添加数据元素obj 3 remove(Object obj) 从Set中移除数据元素obj 4 contains(Object obj) 判断当前Set中是否包含数据元素obj,如果包含返回true,否则返回false 5 iterator() 将Set装入迭代器

Set接口的交集、并集、差集运算

序号 方法 描述 1 addAll(Collection c) 向Set中添加c包含的全部数据元素(并集) 2 removeAll(Collection c) 从Set中移除c包含的全部数据元素(差集) 3 retainAll(Collection c) 求Set和c的交集 4 containsAll(Collection c) 判断Set是否包含c中的全部数据元素,如果全部包含返回true,否则返回false

HashSet(散列集)

  • HashSet通过Hash算法排布集合内的元素,所谓的Hash算法就是把任意长度的输入(又叫做预映射),通过散列算法,变换成固定长度的输出,该输出就是散列值。这种转换是一种压缩映射。对于不同类型的信息,其散列值公式亦不完全相同。
  • 当我们使用HashSet存储自定义类时,需要在自定义类中重写equals和hashCode方法,主要原因是集合内不允许有重复的数据元素,在集合校验元素的有效性时(数据元素不可重复),需要调用equals和hashCode验证。
  • HashSet在判断数据元素是否重复时:
      1. 检查hashCode值是否与集合中已有相同。
      1. 如果hashCode相同再调用equals方法进一步检查。(equals返回真表示重复)

TreeSet(树集)

  • TreeSet是一个有序集合,其元素按照升序排列,默认是按照自然顺序排列,也就是说TreeSet中的对象元素需要实现Comparable接口。TreeSet类中跟HashSet类一样也没有get()方法来获取指定位置的元素,所以也只能通过迭代器方法来获取。
  • TreeSet虽然是有序的,但是并没有具体的索引,当插入一个新的数据元素的时候,TreeSet中原有的数据元素可能需要重新排序,所以TreeSet插入和删除数据元素的效率较低。
  • 当我们使用TreeSet存储自定义类时,需要在自定义类中重写compareTo方法,以提供比对形式,否在TreeSet不能对用户自定义的类型进行正确的树状排序。

Eg

HashSet存储自定义类(这里假设为学生类)

  • 重写hashCode()方法:
    返回需要比较属性的hashCode()方法值,如果需要根据学生学号来区分对象,则
@Override     public int hashCode() {        return stuNo.hashCode();     }
  • 重写equals方法:去重条件为学号相同
public boolean equals(Object o){        if(o == null){            return false;        }else{            if(this == o){              //引用相同则必定相同                return true;            }else{                //                if(o instanceof Student){ //类型检测                    Student stu = (Student) o;  //需要强制转换                    if(stu.getStuNo().equals(getStuNo())){                        return true;                    }                }                return false;            }        }    }

TreeSet存储自定义类

  • 需要在自定义类中重写compareTo()方法,以提供比对形式,否在TreeSet不能对用户自定义的类型进行正确的树状排序
  • 重写compareTo()方法以此实现Compareble接口,在下面的比较方法中,先比较学生的成绩,如果成绩相同,再比较学生学号
public class Student extends PStu implements Comparable<Student>{    //采用泛型    private String stuNo;    private String stuName;    private int score;    @Override    public int compareTo(Student stu) {        if(stu != null){            if(score == stu.score){    //比较成绩                return stuNo.compareTo(stu.getStuNo());  //比较学号,调用原方法            }            return score - stu.score;        }        return 0;    }}
原创粉丝点击