无序,不可重复
set接口中的方法和Collection一致
-----------------HashSet-------------
内部数据结构是哈希表,是不同步的
set集合只有遍历器这种取
哈希表确定元素是否相同
1.如果两个元素的哈希值相同,在判断两个对象内容是否相同。
2.判断哈希值相同,其 实判读的是hashCode的方法。判读内容相同,用的是equals方法。
有时候比如要默认姓名,年龄相同的两个元素为同一对象,这时就要重写hashCode方法和equal方法。
class Test
2 {
3 private int num;
4 private String data;
18 public int hashCode()
19 {
20 //重写equals,也必须重写hashCode。具体后面介绍。
}
6 public boolean equals(Object obj)
7 {
//看是不是同一个对象
8 if (this == obj)
9 return true;
10 //obj不能为空()
//看是否为同一类??????等同于
//if(!(obj instanceof Test))
// return false; // 但避免 这种写法,因为会破坏equals方法的公约
//自反性: x.equals(x) 一定是true
对null: x.equals(null) 一定是false
对称性: x.equals(y) 和 y.equals(x)结果一致
传递性: a 和 b equals , b 和 c equals,那么 a 和 c也一定equals
一致性: 在某个运行时期间,2个对象的状态的改变不 会 不影响equals的决策结
那么,在这个运行时期间,无论调用多少次 equals,都返回相同的结果
11 if ((obj == null) || (obj.getClass() != this.getClass()))
12 return false;
13
//能执行到这里,说明obj和this同类且非null
14 Test test = (Test) obj;
15 return num == test.num&& (data == test.data || (data != null && data.equals(test.data)));
16 }
26 }
Linkedhashset
取按照输入顺序输出
TreeSet
自定义输出顺序
首先实现(implements )Comparable接口
重写compareTo方法 Compbyname
在compareTo方法中定于输出顺序
public int compareTo(Object o){
person p=(person)o;
if(this.age>p.age)
return 1;
if(this.age<p.age)
return -1;
retrun o;
}