1.接口Set< E >
a.元素无序
b.元素不重复,如果加入重复元素,add方法会返回false
c.可以直接输出set对象(多态),已经重写了toString()方法
d.set判断两个对象是否相等用equals方法
2.Hashset类
2.1 Hashset底层数据结构是哈希表
(1)JDK1.7中,哈希表:是一个元素为链表的数组,综合了数组和链表的优点
(2)JDK1.8中,哈希表:是一个元素为链表或者红黑树的数组
(3)当向HashSet集合中存入一个元素时,HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,然后根据hashCode值决定该对象早HashSet中存储的位置。
2.2HashSet集合判断两个元素是否相等
(1)先是通过hashCode()判断是否相等
(2)第一步成立的基础上再用equals方法判断两个对象的内容是否相等
2.3 Hashset类的特点
(1)元素无序且唯一
元素的唯一性要:
a.重写:HasCode()方法
目的:
i.为了确定元素在数组中的位置
ii.减少元素之间用而equals()方法比较确定链表上的位置的次数
如
public class student {
String name;
String age;
public student() {
}
public student(String name, String age) {
this.name = name;
this.age = age;
}
@Override
public int hashCode() {
return this.name.hashCode() * 19 + this.age.hashCode();
}
}
b.重写:equals()方法
步骤:
1.判断两个队象是否地址相同
2.判断两个对象类型是否一致
3.判断两个对象内容是否相同
如
@Override
public boolean equals(Object o) {
if (this == o)
return false;
if (!(o instanceof student))
return false;
student stu = (student) o;
if (!(stu.name.equals(stu.name) && stu.age.equals(stu.age)))
return false;
else
return true;
}
说明:只重写equals方法可能会遇到两个对象,一个对象那个的成员变量的值比另一个对象那个的成员变量的多,但相同的变量的值相同,这时equals方法无法判断出正确的结果,就需要HashCode方法来判断。
(2)HashSet不是线程安全的
(3)HashSet 迭代很可能支出较大,因为它所需迭代时间与其容量 成正比。
(4)集合元素可以是NUll,但是只能放入一个null值。
2.4HashSet集合的遍历
方法:用增强for循环来遍历
3.LinkedhashSet类
4.1底层数据结构:双重链接列表和哈希表
4.2特点:
a.与hashSet一样根据元素的hashCode值来决定元素的存储位置
c.有序链接列表定义了迭代顺序,即按照将元素插入到 set 中的顺序(插入顺序)进行迭代
d.可预知迭代顺序
e.允许null元素,只允许有一个null值。
f.迭代所需时间与 set 的大小 成正比,而与容量无关
public class ste_text {
public static void main(String[] args) {
Set set = new LinkedHashSet();
set.add("zhang");
set.add("zhg");
set.add("zhng");
set.add("zhng");
set.add("ng");
set.add("zg");
set.add("g");
set.add("z");
set.add(null);
set.add(null);
boolean b = set.add("zhang");
System.out.println(b);
System.out.println(set);
}
}
结果:[zhang, zhg, zhng, ng, zg, g, z, null]
4.TreeSet类
4.1特点
a.元素有序且唯一
b.通过equals方法返回blloean类型结果或者compareto方法返回0
来判断
4.2TreeSet类的排序
a.自然排序:
调用参数为Comparator对象的有参构造函数创建TreeSet对象,并重写compare方法。
TreeSet<student> set = new TreeSet<>(new Comparator<student>() {
@Override
public int compare(student o1, student o2) {
int num = o1.name.compareTo(o2.name);
int num1 = num == 0 ? o1.age.compareTo(o2.age) : num;
return num1;
}
});
b.使用比较器排序
public class student implements Comparable<student>{
@Override
public int compareTo(student o) {
int num = this.name.compareTo(o.name);
int num1 = num == 0 ? this.age.compareTo(o.age) : num;
return -num1;
}
5.案例
5.1编写案例,获取10个1~20随机数,不允许重复
思路:利用Set集合的唯一性
public class column {
public static void main(String[] args) {
HashSet<Integer> set = new HashSet<>();
Random a = new Random();
while (true) {
Integer b = a.nextInt(20) + 1;
set.add(b);
if (set.size() == 10)
break;
}
for (Integer num : set) {
System.out.print(num + " ");
}
}
}