Java : 集合(3)——Set 用法详解

一、基本概念

1、Collection中的子类,Set中的元素是没有顺序的(存入取出顺序不一致),不可以重复。

2、Set集合的功能和Collection的功能是一致的。

3、Set方法取出元素只有一种方式:迭代器。

二、HashSet

1、底层的数据结构是哈希表。线程非同步。

2、哈希表按照哈希值来存储,存储顺序不一定与添加顺序一致。哈希值如果相同,则比较是否是同一对象。

3、add()方法返回的是布尔型,因为必须保证元素的唯一性,只有是true的时候才能添加。

boolean

如果此 set 中尚未包含指定元素,则添加指定元素。

4、Hashset如何保证元素的唯一性呢?

是通过元素的两个方法:hashCode()和equals来完成。如果元素的Hashcode值一致的,才会判断equals是否为true,如果不同不需要判断。

5、一般需要复写HashSet中的两个方法:

public int hashCode() 返回此 set 的哈希码值。
public boolean equals(Object o)  比较指定对象与此 set 的相等性。
[code lang=”Java”]
// 复写hashCode方法 给定相同的hashCode
public int hashCode() {
return 60;
}
// 复写equals方法 相同元素返回false
public boolean equals(Object obj) {
if (!(obj instanceof Person)) {
return false;
}
// 强制类型转换
Person p = (Person) obj;
return this.name.equals(p.name) && this.age == p.age;
}
[/code]

三、TreeSet

1、可以对Set中的元素进行排序。底层数据结构是二叉树。

2、排序的第一种方式:TreeSet中的对象必须具有比较性:

public interface Comparable :此接口强行对实现它的每个类的对象进行整体排序。这种排序被称为类的自然排序,类的 compareTo 方法被称为它的自然比较方法。

int

比较此对象与指定对象的顺序。

返回: 负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。

注意:String类已经具备了比较性,实现了接口。

[code lang=”Java”]
class People implements Comparable {
...
// 实现接口中的方法
public int compareTo(Object obj) {
if (!(obj instanceof People)) {
throw new RuntimeException("学生对象有错");
}
People p = (People) obj;
if (this.age > p.age) {
return 1;
}
if (this.age == p.age) {
return this.name.compareTo(p.name);
}
return -1;
}
}
[/code]

3、保证元素的唯一性的依据是:compareTo方法中的return 0;

4、排序第二种方式:让集合自身具备比较性,在初始化集合时,就有了比较方式。当两种方式同时存在时,以比较器为主。

TreeSet(Comparator super E> comparator)
构造一个新的空 TreeSet,它根据指定比较器进行排序。
[code lang=”Java”]
// 实现比较器
class xrCompare implements Comparator {
public int compare(Object o1, Object o2) {
People p1 = (People) o1;
People p2 = (People) o2;
int num = p1.getName().compareTo(p2.getName());
//判断次要顺序 很重要 !
if (num == 0) {
if (p1.getAge() > p2.getAge()) {
return 1;
}
if (p1.getAge() == p2.getAge()) {
return 0;
}
return -1;
}
return num;
}
[/code]