1. Set接口中存储数据的特点
存储无序的、不可重复的数据
1.2 Set中常用方法
即为ColLection中声明的15个抽象方法。没有新增的方法
1.3 开发中的使用频率及场景
较List、Map来说,Set使用的频率比较少
常用来过滤重复数据
2. Set实现类
- HashSet:主要实现类,底层使用的是HashMap,即使用数组+单向链表+红黑树结构进行存储。
-
- LinkedHashSet:是HashSet的子类,在现有的数组+单向链表+红黑树结构的基础上,又添加了一组双向链表,用于记录添加元素的先后顺序。即我们可以按照添加元素的顺序实现追历。便于频繁的查询操作。
- TreeSet:底层使用红黑树存储。可以按照添加的元素的指定的属性的大小顺序进行遍历。
3. Set中无序性、不可重复性的理解(以HashSet及其子类为例说明)
1. 无序性!= 随机性。
添加元素的顺序与遍历元素的顺序不一致,是不是就是无序性呢? No!
到底什么是无序性? 与添加的元素的位置有关,不像ArrayList一样是依次紧密排列的。
这里是根据添加的元素的哈希值,计算的其在数组中的存储位置。此位置不是依次排列的,表现为无序性。
2. 不可重复性,添加到Set中的元素是不能相同的。
比较的标准,需要判断hashCode()得到的哈希值以及equals()得到的boolean型的结果。
**哈希值相同且equals()返回true,则认为元素是相同的**
4. 添加到HashSet/LinkedHashSet中元素的要求
要求元素所在的类要重写两个方法:equals() 和 hashCode()同时,要求equals() 和 hashcode()要保持一致性!
package com.my.package01;
public class compare implements Comparable {
private String name;
private int age;
public compare() {
}
public compare(String name, int age) {
this.name = name;
this.age = age;
}
public void setName(String name) {
this.name = name;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public int getAge() {
return age;
}
@Override
public String toString() {
return "compare{" +
"name='" + name + ''' +
", age=" + age +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
compare compare = (compare) o;
if (age != compare.age) return false;
return name != null ? name.equals(compare.name) : compare.name == null;
}
@Override
public int hashCode() {
int result = name != null ? name.hashCode() : 0;
result = 31 * result + age;
return result;
}
}
package com.my.package01;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
public class compare_Test {
public static void main(String[] args) {
Set set = new HashSet();
compare c1 = new compare("tom",16);
compare c2 = new compare("James",18);
compare c3 = new compare("James",18);
compare c4 = new compare("jerry",19);
set.add(c1);
set.add(c2);
set.add(c3);
set.add(c4);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
}