HashSet:
示例代码:
public class AboutHashSet {
public static void main(String[] args) {
HashSet<Integer> hs = new HashSet<Integer>();
hs.add(12);
hs.add(4);
hs.add(35);
hs.add(12);
hs.add(27);
hs.add(9);
System.out.println(hs); //无序、唯一
System.out.println(hs.size());
}
}
运行结果:
[35, 4, 9, 27, 12]
5
数据存储过程:
放入集合的数据 (以Integer为例) | 12 | 4 | 35 | 12 | 27 | 9 |
调用hasCode()方法, 返回哈希码 | 12 | 4 | 35 | 12 | 27 | 9 |
根据函数计算存储位置 (以y=x%6为例) | 0 | 4 | 5 | 0 | 3 | 3 |
调用hashCode()方法主要为了判断存入的位置。
特点:无序、不重复(如果存入的数据类型重写了hashCode()和equals()方法)
优点:增删查快
TreeSet:
实例代码:
public class AboutTreeSet {
public static void main(String[] args) {
TreeSet<Integer> ts = new TreeSet<Integer>();
ts.add(12);
ts.add(6);
ts.add(15);
ts.add(3);
ts.add(12);
ts.add(1);
System.out.println(ts);
System.out.println(ts.size());
}
}
运行结果:
[1, 3, 6, 12, 15]
5
特点:无序(没有按输入顺序输出),有序(按照从小到大顺序输出),唯一
底层原理:二叉树,中序遍历
TreeSet如果存储的数据类型为自定义类型,则该类必须实现内部比较器(Comparable)并且重写compareTo方法
例如,按该类中Name属性排序则该方法重写如下
public int compareTo(Object= o){
return this.getName().compareTo(o.getName));
}
HashSet和TreeSet的区别:
1、TreeSet 是二叉树实现的,TreeSet中的数据是自动排好序的,不允许放入null值。
2、HashSet 是哈希表实现的,HashSet中的数据是无序的,可以放入null,但只能放入一个null,两者中的值都不能重复,就如数据库中唯一约束。
3、HashSet要求放入的对象必须实现HashCode()方法,放入的对象,是以hashcode码作为标识的,而具有相同内容的 String对象, hashcode是一样,所以放入的内容不能重复。但是同一个类的对象可以放入不同的实例 。