hashSet 彻底无序 , treeSet插入无序,大小有序, 但对于自定义的类要重写equals方法才行.
hashSet 插入时先比较hashCode看是否有hash冲突,之后用equals比较看是否已存在.
Set
元素唯一性原理:调用元素的hashCode方法得到哈希码值,如果元素的哈希码值不一样,直接添加该元素
如果哈希码值相同,继续调用元素的equals方法比较元素成员变量值
如果equals方法返回true,不添加
如果equals方法反悔哦false,添加。
所以,如果是要存自己写的类的话,要自己重写hashCode(),和equals()这两个函数。
方法:
add() addAll()
contains()
remove() removeAll()
HashSet
没什么特殊方法。
如果用来存自己写的类的话,要重写自己类的hashCode() ,改成不同内容返回不同hash值的,思路:先加一个每个类不同的底数和系数,系数*成员数值+底数 就行,成员数值计算如果是数值类型直接加,如果是别的类型调用hashCode()再相加。
set 里没有重复的值,存重复的值进去返回false而不会报错。
set 里的元素无序,即你最后插入的东西可能会在头哪里也可能会在中间也可能会在尾巴那里。
有 add remove contains 但是没有修改元素的方法。
没有自己新加方法,方法和collection的一样。
相同的元素哈希值一定一样。
哈希值一样的元素不一定相同。
可以比较元素不同,不能比较元素相同。
LinkHashSet
继承自HashSet,自己没有新加方法。
元素按插入排序的HashSet
TreeSet
有好多特有方法。
元素总是有序,不过存自定义类型要自己重写comparator() 函数,或者在构造函数里传比较器进行构造。
方法
descendingIterator() : 降序遍历器
subset() , headSet() , railSet()
first() last()
E lower(E) , E higher(E)
pollFirst() , pollLast(E) 取出并删除。
ceiling(E) , floor(E) 返回大于E的最小元素 , 返回小于E的最大元素。
重写compare方法有两种方式,一种是在自定义类里写,一种是下面这种在创建TreeSet的时候。
TreeSet<Person> set = new TreeSet<Person>( //Person是自己定义的一个类。
new Comparator<Person>() {
@Override
public int compare(Person o1, Person o2) { //参数按插入顺序传入,若返回值>0,就交换顺序。
int result = 0;
result = ((Person) o1).age - ((Person) o2).age;
if (result == 0) {
result = ((Person) o1).name.compareTo(((Person) o2).name);
}
return result;
}
}
);
评论区