HashSet
package com.ff.javaCollection.Day3;
import java.util.HashSet;
import java.util.Set;
import java.util.TreeSet;
/*
* Set接口继承了Collection接口
* Set中所存储的元素是不重复的,但是是无序的, Set中的元素是没有索引的
*
* set接口有两个实现类:HashSet和TreeSet
* HashSet:HashSet类中的元素不能重复,即彼此调用equals方法比较,都返回false。
* 底层数据结构是哈希表+链表
* 哈希表依赖于哈希值存储
* TreeSet:可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
* TreeSet底层数据结构是二叉树(红黑树是一种自平衡的二叉树)
*
* */
public class HashSetDemo {
public static void main(String[] args) {
Set<String> set=new HashSet<>();
set.add("a");
set.add("b");
set.add("n");
set.add("哈希");
set.add("树");
set.add("d");
set.add("种树");
//set.clear();//清除所有元素值
//set.remove("n");//删除某个元素值
//System.out.println(set.contains("d"));//判断哈希列表是否存在某个元素值
//System.out.println(set.size());//返回哈希数组的数组长度
System.out.println(set);
/*
用加强for循环遍历哈希数组
for (String s:set) {
System.out.println(s);
}*/
}
}
TreeSet
package com.ff.javaCollection.Day3;
import java.util.Arrays;
import java.util.TreeSet;
public class TreeSetDemo {
public static void main(String[] args) {
TreeSet<String> tree=new TreeSet<>();
tree.add("a");
tree.add("c");
tree.add("e");
tree.add("b");
tree.add("d");
System.out.println(tree);
TreeSet<Student> t=new TreeSet<>();
//创建学生对象,方便后面给学生对象赋值后,将对象属性添加到数组中去
Student s1=new Student(1,"jim1");
Student s4=new Student(4,"jim4");
Student s2=new Student(2,"jim2");
Student s3=new Student(3,"jim3");
t.add(s1);
t.add(s2);
t.add(s3);
t.add(s4);
System.out.println(t);
}
}
package com.ff.javaCollection.Day3;
import java.util.Objects;
public class Student implements Comparable<Student>{
private int num;
private String name;
public Student(int num, String name) {
this.num = num;
this.name = name;
}
public Student() {
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return num == student.num &&
name.equals(student.name);
}
@Override
public int hashCode() {
return Objects.hash(num, name);
}
@Override
public String toString() {
return "Student{" +
"num=" + num +
", name='" + name + '\'' +
'}';
}
@Override
public int compareTo(Student o) {
//return this.name.compareTo(o.name);//按照姓名升序排列
return o.num-this.num ;//按照学号降序排列
}
}
运行结果:
[a, b, c, d, e]
[Student{num=4, name='jim4'}, Student{num=3, name='jim3'}, Student{num=2, name='jim2'}, Student{num=1, name='jim1'}]
HashSet与TreeSet的异同
异:
HashSet:
-
HashSet类中的元素不能重复,即彼此调用equals方法比较,都返回false。
-
底层数据结构是哈希表+链表
-
HashSet中的元素没有顺序,但是其元素不重复
-
哈希表依赖于哈希值存储
-
HashSet是基于hash算法实现的,性能优于TreeSet,通常使用HashSet,在我们需要对其中元素排序的时候才使用TreeSet
TreeSet:
-
可以给Set集合中的元素进行指定方式的排序。存储的对象必须实现Comparable接口。
-
TreeSet底层数据结构是二叉树(红黑树是一种自平衡的二叉树)
同:
单列集合,元素不可重复