1.为什么需要集合?
在c语言学习中,当我们遇到大量相同类型数据时,我们会定义该类型数组来存数这些数据,在java中,我们在面向对象编程中常常需要定义很多相同属性和方法的对象,那么这些对象存储在哪里,怎么存储才能使用户访问这些对象更加的快捷方便?对比c语言中数组java中集合具有相同的功能,但是集合具有动态存储的特点,可以更加灵活的存储、访问、调用对象。
在面向对象编程中,当存储的对象个数不确定时,以及存储的对象是复杂对象,具有映射关系时,我们就需要用集合存储。集合可以理解存放一组相同属性和方法的对象的容器。
2.Set接口和List接口的比较
List:ArryList() LinkedList() Vector()
Set: HashSet() TreeSet()
List内存储的元素有序,可重复
Set内存储的元素无序,不可重复
3. HashSet和TreeSet的特点:
HashSet特点?
HashSet类是Set接口实现类之一,它不保存元素的加入顺序,HashSet()类根据元素的哈希码进行存放,所以取出时也可以根据哈希码快速查找
TreeSet特点?
TreeSet()类使用二叉树结构对加入元素进行排序存放,通过TreeSet构造方法来获取TreeSet对象。
注意:放入TreeSet类中的元素必须是可“排序的”。对加入的对象,若要实现comparaTo()方法必须实现implements Comparable接口
4.自定义比较器
实现implements Comparable接口定义排序有局限性,实现此接口只能按comparaTo()定义的这一种方法排序,如果同一对象有多种排序方式,应该定义不同的比较器,比如说学生对象可以按学号,分数,年龄等进行多种排序。
自定义比较器实质:让自己编写的类实现Comparator接口,重写Comparator中的比较方法compara(Object a,Objectb)
compara(Object a,Objectb)方法使用:
public int compare(Object a,Object b){
int i=b.对象属性- a.对象属性;
return i; //返回0,表示this==obj ;返回正数表示,this>obj; 返回负数,表示this<obj
}
5. HashSet和TreeSet的实际用法
5.1. HashSet用法
import java.util.Comparator;
public class Student {
//声明属性
private String name;
private int age;
//getter,setter方法
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
//构造方法
public Student(String name, int age) {
super();
this.name = name;
this.age = age;
}
@Override
public String toString() {
return name+age;
}
}
测试类 :
import java.util.HashSet;
import java.util.Iterator;
import List.Student;
public class HashSetText {
/**
* HashSet用法
*/
public static void main(String[] args) {
/*声明对象*/
Student zhangsan=new Student("张三",20);
Student lisi=new Student("李四",19);
Student liyun=new Student("李云",18);
HashSet<Student> hs=new HashSet<Student>();
hs.add(liyun);
hs.add(liyun);
hs.add(zhangsan);
hs.add(lisi);
hs.add(lisi);
Iterator it=hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
}
5.2 . TreeSet用法
让学生信息按照学生成绩排序输出
/**
*
*学术类
*
*/
public class Student {
/*声明属性和方法*/
private String name;
private Integer age;
private Integer score;
/*getter,setter方法*/
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
public Integer getScore() {
return score;
}
public void setScore(Integer score) {
this.score = score;
}
/*构造方法*/
public Student(String name, Integer age, Integer score) {
super();
this.name = name;
this.age = age;
this.score = score;
}
@Override //重写String,toString方法
public String toString() {
return "姓名:"+name+" 年龄:"+age+" 成绩:"+score;
}
@Override //重写hasCode()方法
public int hashCode() {
return age*name.hashCode();
}
@Override //重写equals方法
public boolean equals(Object o) {
Student s=(Student) o;
return age==s.age&& name.equals(s.name);
}
}
测试类:
import java.util.Comparator;
import java.util.Iterator;
import java.util.Set;
import java.util.TreeSet;
/**
* TreeSet测试类
*/
/*创建学生成绩比较器*/
class StudentScoreComparator implements Comparator<Student>{
@Override
public int compare(Student o1, Student o2) {
int i= (int)(o2.getScore()-o1.getScore());
return i;
}
}
public class TreeSetTest {
public static void main(String[] args) {
Set ts=new TreeSet(new StudentScoreComparator()); //创建TreeSet集合
Student stu1=new Student("张三",18,85);
Student stu2=new Student("李四",19,88);
Student stu3=new Student("李红",20,60);
Student stu4=new Student("张丽",18,90);
ts.add(stu1); //将对象放进TreeSet集合中
ts.add(stu2);
ts.add(stu3);
ts.add(stu4);
Iterator it=ts.iterator(); //声明迭代器
while(it.hasNext()){
System.out.println(it.next());
}
}
}