Set
Set:无序,不可以重复元素。
|--HashSet: 数据结构是哈希表。线程是非同步的。
保证元素唯一性的原理:判断元素的hashCode值是否相同。
如果相同,还会继续判断元素的equals方法,是否为true。
|--TreeSet: 可以对Set集合中的元素进行排序。
底层数据结构是二叉树。
保证元素唯一性的依据:
compareTo方法return 0.
HashSet
将对象经过哈希算法计算成该对象的哈希值,并把哈希值存放在哈希表中,其实哈希值就相当于数组中的角标。
Hahset集合数据是哈希表,所以存储元素的时候,使用的元素的hashcode方法来确定位置,如果位置相同,在通过元素的equals来确定是否相同。也就是通过对象的hashcode和equals方法来完成对象唯一性的,如果对象的hashcode值不同,那么不用判断equals方法,就直接存储到哈希表中,如果对象的hashcode值相同,那么要再次判断对象的equals 方法是否为true,如果为true,视为相同元素,不存,如果为false,那么视为不同元素,就进行存储。
注意:元素如果要存到HashSet中,必须复写hashcode方法和equals方法,这也是以后编程时需要养成的一个习惯,记住就OK。
HashSet练习:
需求:往HashSet中存放自定义元素
import java.util.HashSet;
import java.util.Iterator;
public class HashSetTest {
public static void main(String[] args) {
HashSet hs = new HashSet();
hs.add(new Student("lisi8",28));
hs.add(new Student("lisi2",22));
hs.add(new Student("lisi2",22));
hs.add(new Student("lisi3",23));
hs.add(new Student("lisi3",23));
hs.add(new Student("lisi4",24));
Iterator it = hs.iterator();
while(it.hasNext()){
System.out.println(it.next());
}
}
class Student implements Comparable<Student>{
private String name;
private int age;
public Student(String name, int age) {
this.name = name;
this.age = age;
}
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;
}
@Override
public int hashCode() {
return name.hashCode()+age*34;
}
@Override
public boolean equals(Object obj) {
if(!(obj instanceof Student))
throw new ClassCastException("lei xing bu pi pei");
Student s = (Student)obj;
return this.name.equals(s.name)&&this.age==s.age;
}
@Override
public String toString() {
return "Student [name=" + name + ", age=" + age ;
}
}
TreeSet
TreeSet:可以对集合中的元素进行排序,是不不同步的
判断元素唯一性的方式:即使根据比较方法的返回结果是否是0,是0,就是相同的元素,不存
Treeset对元素进行排序的方式一:
让元素自身具备比较功能,就需要实现comparable接口,覆盖comparaTo( )方法。如果不要按照对象中具备的自然顺序进行排序,如果对象中不具备自然顺序,怎么办?
那就使用treeset集合第二种排序方式二(自定义比较器):
让集合自身比较功能,定义一个类实现comparator接口,覆盖compare方法。将该类对象作为参数传递给treeset集合的构造函数。
//用TreeSet存储学生类,并将学生信息按照学生的年龄进行排序
package LianXi;
import java.util.*;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<Student> t = new TreeSet<Student>();
t.add(new Student("lisi1",12));
t.add(new Student("lisi2",10));
t.add(new Student("lisi3",11));
t.add(new Student("wangwu",11));
Iterator<Student> it = t.iterator();
while(it.hasNext()){
Student stu = it.next();
System.out.println(stu.getName()+"::"+stu.getAge());
}
}
}
class Student implements Comparable{
private String name;
private int age;
Student(String name,int age){
this.name=name;
this.age=age;
}
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 int compareTo(Object obj) {
if(!(obj instanceof Student))
throw new RuntimeException("不是学生类");
Student s = (Student)obj;
if(this.age>s.age)
return 1;
if(this.age==s.age){
return this.name.compareTo(s.name);
}
return -1;
}
}