Collection

 

集合分体系:List和Set

子类对象的后缀名是所属体系,前缀名是数据结构名称。

List:   新出的子类都是以List结尾的,通常都是非同步的。

        ArrayList:看到array,就知道数组,查询速度快。

        LinkedList:看到link,就知道链表,增删速度快。

Set:     新出的子类都是以List结尾的,通常都是去重的。

        HashSet:看到hash,就知道哈希表,查询速度更快,并想到元素唯一,通过hashCode(),equals方法保证唯一性。

        TreeSet:看到tree,就知道二叉树,可以排序,排序想到Comparable-compareTo Comparator--compare方法。

List:

List 集合的特点是元素有序、可重复,它包含了 ArrayList、Vendor 和 LinkedList 这三个实现类。

当list集合中储存对象时,我们需要在对象的实体类中重写equals()方法和hashCode()方法

 public int hashCode () {
        int prime = 31;
        int result = 1;//定义两个常量
        result = prime * result + age;//得出一个值
        result = prime * result + ((name == null) ? 0 : name.hashCode());//在加上名字的哈希函数值
        return result;
    }//返回这个结果


    public boolean equals ( Object o ) {
        if (this == o)
            return true;//判断地址
        if (!(o instanceof Student)) {
            return false;//判断类型
        }
        Student s = (Student) o;//创建 一个学生如果年龄相等去比较他们的名字
        boolean falg = age == s.age;
        falg = !falg ? falg : name.equals(s.name);
        return falg;
 }

Set:

Set 集合最大的特点是不允许重复元素,它有 HashSet、TreeSet

Set集合是可以给对象进行排序的。当存放进去的对象,会根据对象的自身的特点进行自然顺序的排序。因此这里需要注意的当我们给TreeSet集合中存放自定义对象时,一定要保证对象自身具备比较功能只需要这个对象实现Comparable接口,并实现其中的compareTo方法即可。

public class Teacher implements Comparable

@Override
public int compareTo(Object o) {
    if (!(o instanceof Teacher)){
        throw  new ClassCastException("o is not a teacher");//判断类型,类型不对异常
    }
    Teacher T=(Teacher) o;
    int res=age- T.age;//按年龄排序
    res=res!=0?res:sex- T.sex;//再按性别
    res=res!=0?res:name.compareTo(T.name);//用compare比较名字
    return res;
}

有一个叫做Comparator的接口,并且TreeSet集合的接口允许我们给其传递这样一个接口的子类对象。其实就是在创建TreeSet集合时,在构造函数中指定具体的比较方式。需要定义一个类实现Comparator接口,重写compare方法。

public class ComparatorByName extends Object implements Comparator

@Override
    public int compare(Object o1, Object o2) {
        //1,因为要比较的是学生对象的姓名。所以向下转型成Student对象。
        Student s1 = (Student)o1;
        Student s2 = (Student)o2;
        //先比较姓名。
        int temp = s1.getName().compareTo(s2.getName());
        //如果姓名相同,再比较年龄。
        return temp==0? s1.getAge()-s2.getAge():temp;
    }

比较

1.Comparable是排序接口;若一个类实现了Comparable接口,就意味着“该类支持排序”。
(作用在实体类上)
2.而Comparator是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
(作用在排序类上)

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值