1.Set
特点
无序(存取不一致),没有索引,元素不可重复
没有特有的方法
2.HashSet
特点
由哈希表(实际上是一个HashMap实例)支持,它不保证Set的迭代的顺序,特别是它不保证该顺序恒久不变,此类允许使用null值。
存储自定义对象
需要重写hashCode()和equals()
先比较Hash值,然后在比较equals()方法。
Eclipse中shift+alt+s h可以自动生成hashCode()和equals()方法
@Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + age;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Person other = (Person) obj;
if (age != other.age)
return false;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
}
3.TreeSet类
特点
TreeSet用来对元素进行排序的,同样保证元素的唯一
底层使用二叉树实现的
保证元素唯一的方法
引用数据类型需要实现Conparable接口,并重写**compareTo()**方法。
排序方法
1.Comparable接口
源码:
public interface Comparable<T> {
public int compareTo(T t);
}
p.s:this表示的是新传入的值,形参表示的是比较的对象(也就是原本在集合中的元素)
当compareTo()方法返回0,不存入元素(表示元素存在),
返回正数,存在二叉树的右边(表示存入元素较大),
返回负数,存在二叉树的左边(表示存入元素较小)。
取出时按照先序遍历的顺序取出。
以Person类为例:
public int Comparable(Person p){ //以年龄为主要条件
int num = this.age - p.age;
return num == 0 ? this.name.compareTo(p.name) : num;
}
public int Comparable(Person p){ //以姓名为主要条件
int num = this.name.compareTo(p.name);
return num == 0 ? this.age-p.age : num;
}
public int Comparable(Person p){ //以姓名长度为主要条件
int length = this.name.length() - p.name.length();
int num = length == 0 ? this.name.compareTo(p.name) : length;
return num == 0 ? this.age - p.age : num;
}
2.比较器(Comparator)排序
步骤
- 创建一个比较的类并实现Comparator接口,重写compareTo()方法
- 在声明TreeSet对象时传入该方法的实例
代码
class CompareByLen() implements Comparator{
public int compare(String s1,String s2){ //以String为例
int num = s1.length.compareTo(s2.length);
return num==0?s1.compareTo(s2):num;
}
}
TreeSet<String> ts = new TreeSet<>(new CompareByLen());
}
s1表示的是新传入的值,s2表示的是比较的对象(也就是原本在集合中的元素)
总结
- Comparable和Comparator中优先Comparator(比较器)
- TreeSet的构造函数什么都不传,默认按照Comparable的顺序(没有就报ClassCastException类型转换异常)