上一篇我们讲解了Collection接口的 子接口List 及其实现类(ArrayList 、LinkedList 迭代器) ,今天我们一起看看Collection的另一个子接口 Set
Set
- Set 的实现类 基本都是使用了 对应的Map实现类 实现的。比如 HashSet 是基于 HashMap实现的,TreeSet是基于TreeMap实现的。
- 具体如何实现?
- Map存储的是键值对<key,value>,并且key不能重复 (value可以重复);Set 只使用了Map的Key位置存储数据,value的内容由java自动存放统一内容
HashSet
- HashSet:使用哈希表的存储方式,HashMap实现;散列存放,无法保证原来的存储顺序
public static void main(String[] args) {
HashSet<String> set = new HashSet<>();
boolean flag1 = set.add("锄禾日当午");
set.add("汗滴禾下土");
set.add("谁知盘中餐");
set.add("粒粒皆辛苦");
boolean flag2 = set.add("锄禾日当午"); // 添加失败
System.out.println(flag1);
System.out.println(flag2);
for(String s:set){
System.out.println(s);
}
System.out.println("____________________");
/*迭代器遍历set*/
Iterator<String> iterator = set.iterator();
while(iterator.hasNext()){
System.out.println(iterator.next());
}
}
TreeSet
- TreeSet:使用二叉树的存储方式,由treeMap实现;有序(自然顺序、操作系统默认的顺序)
TreeSet<String> data = new TreeSet<>();
//系统提供的数据 有序
data.add("B");
data.add("C");
data.add("A");
data.add("D");
for(String s:data){
System.out.println(s);
}
自己定义的类 要排序 必须实现 Comparable 接口 编写排序准则
public static void main(String[] args) {
TreeSet<People> data = new TreeSet<>();
//自己定义的类 要排序 必须实现 Comparable 接口 编写排序准则
People p1 = new People("张三",18);
People p2 = new People("李四",20);
//People p3 = new People("悠悠",20);
//TreeSet不会存储一样的数据,p3不会被存储进去
data.add(p1);
data.add(p2);
for(People p :data){
System.out.println(p);
}
}
//Comparable 比较此对象对传入对象进行比较
static class People implements Comparable<People>{
private String name;
private int age;
public People(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
People people = (People) o;
return age == people.age &&
Objects.equals(name, people.name);
}
@Override
public String toString() {
return "People{" +
"name='" + name + '\'' +
", age=" + age +
'}';
}
@Override
public int hashCode() {
return Objects.hash(name, age);
}
public People() {
super();
}
@Override
public int compareTo(People o) {
//this 与 o比较
//返回数据:负数 (this小)/ 零(一样大)/正数 this 大
if(this.age>o.age){
return 1;
}else if(this.age<o.age){
return -1;
}else{
return 0;
}
}
}