Set集合
Set 接口的特点就是:
1, 不包含重复的元素;
2, 没有索引
3, 无序的集合(存储和取出是无序的)
它的下边有两个小弟:
Hashset 和treeset
哈希值:
说道哈希那就一定要从哈希值开始说起,这个底层是一个算法,他会给每个对象一个十进制的数.就像人的身份证号码一样.
1,hashset:
Set的子类HashSet的底层是hashmap
特点:底层是个哈希表结构,依靠对象的哈希值;
线程不安全,运行的速度快.
集合为了保证自己的唯一性,他依靠对象自己的哈希值和equals方法;要求存储到集合中的对象自己必须实现hashcode 和equals方法.
哈希表的具体的存储过程:
1,调用存储方法,hashcode 获得对象的哈希值(得到一个十进制的数字)
2,如果这个值没有出现过就把这个值放在十进制的下边,如果这个值出现过那么久吧后来出现的对象调用自己的equals方法把已经有的对象当做参数传递进来,做比较.
那么只有两种结果:equals返回的是true:获得对象的hashcode,判断是同一个对象那么久不存储了.
如果返回来的是个false,就让后来的这个对象记录前一个对象的地址,挂靠在前一个的后边.
Eg:一个person类重写hashcode:
//前提是必须有成员变量,name,age
Public int hashcode(){
return name,hashcode()+age;
}
Eg:重写equals方法:
Public double equals(Object obj){
//判断是否为空
If(p!=0);
Return false;
//判断
If(this==obj);
Return true;
//判断是否属于父类
If(obj instendsof Person){
//强转
Person p = (person)obj;
//本类中的对象和传递进来的对象相比较,并且判断年龄是否相等
Return( this.name).equal (p.name)&& this.age == p.age;
}
Return false;
}
treeSet:
特点:
1,底层是map
2,可以对线程进行排序
3,线程不安全,运行速度快
排序的方式有两种:
1,使用元素的自然顺序进行排序,comparable接口(java.ang包下边的)
2,可以使用比较器comprator(java.util包下的)
TreeSet的构造方法
TreeSet (compare<?>compare) 根据指定的构造器进行排序
他的底层是个红黑树(也称为二叉数组)
每个节点上都有两个元素
正数往右,负数往左 零不往里边存