集合分体系: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是比较器;我们若需要控制某个类的次序,可以建立一个“该类的比较器”来进行排序。
(作用在排序类上)