集合框架
Collection
|--List集合,元素是有序的(存入和取出的顺序),且可以有重复元素,因为该集合体系有索引。
|--ArrayList集合,底层数据是数组结构,特点:查询快,增删慢。线程是不同步。
|--LinkedList集合,底层数据是链表结构,特点:增删快,查询慢。线程不同步
|--Vector集合,底层数据是数组结构。线程是同步的。已被ArrayList集合替代。
|--Set集合,元素是无序的(存入和取出的顺序),不可以有重复元素。
|--HashSet集合,底层数据是hash表结构。
HashSet集合元素的唯一性通过hashCode()和equals()方法决定,如果元素的hash值
不同,则判断equals是否为true。
|--TreeSet集合,底层数据是二叉树表结构,可以对Set集合中的元素按照一定的顺序排序。
保证元素的唯一性通过,compareTo()方法return 0。
TreeSet排序第一种方式:
让TreeSet集合里的对象具备比较性,自定义对象需要实现comparable接口,覆盖
compareTo()方法。排序时,当主要条件相同时,一定要判断次要条件。
TreeSet排序第二种方式:
当元素不具备比较性时,则需要TreeSet集合具备比较性。在集合初始化时,就有了比较方
式。定义一个类实现comparator接口,覆盖compare()方法,以return 0来保证是否相同。
当两种排序都存在时,以第2种为主。
import java.util.*;
class TreeSetDemo2{
public static void main(String[]args){
TreeSet ts = new TreeSet(new MyCompare());
//因为add方法为集合框架特有,为容器增加元素,元素就是new出的对象
//所以要add三个元素,就要new三次,应该如下写
ts.add(new Student("李四1",21));
ts.add(new Student("李四4",26));
ts.add(new Student("李四2",22));
ts.add(new Student("李四4",25));
ts.add(new Student("李四3",23));
Iterator it = ts.iterator();
while(it.hasNext()){
Student su = (Student)it.next();
System.out.println(su.getName()+","+su.getAge());
}
}
}
class Student implements Comparable//该接口强制让实现的子类局部比较性
{
private int age;
private String name;
Student(String name,int age){
this.name = name ;
this.age = age;
}
//复写Comarapble接口中的compareTo()方法
public int compareTo(Object obj){
//判断类是不是学生类,如果不是抛出异常。
//return 1;
if(!(obj instanceof Student))
throw new RuntimeException("不是学生对象!");
Student su = (Student)obj;
//按照年龄排序
if(this.age - su.age>0)
return 1;
else if(this.age - su.age
return -1;
else {
//System.out.println("asd:"+this.name.compareTo(su.name));
return this.name.compareTo(su.name);
}
}
public String getName(){
return name;
}
public int getAge(){
return age;
}
}
//自定义一个比较器
class MyCompare implements Comparator{
public int compare(Object o1,Object o2){
//对对象判断
if(!(o1 instanceof Student && o2 instanceof Student))
throw new RuntimeException("比较的不是学生对象!");
Student s1 = (Student)o1;
Student s2 = (Student)o2;
int num = s1.getName().compareTo(s2.getName());
//当姓名相等的时候,判断年龄
if(num==0){
return s1.getAge() - s2.getAge();
}else
return num;
}
}