1.特点:无序,单一不重复
2.
例子1
HashSet<Integer> l1 = new HashSet<>(); l1.add(11); l1.add(11); l1.add(13); l1.add(14); l1.add(15); l1.add(0); System.out.println(l1.size()); System.out.println(l1);
例子2:存入String对象,可以重复
Studen类里有两个属性name和age;
HashSet<Student> l1 = new HashSet<>(); l1.add(new Student("xx",12)); l1.add(new Student("cc",13)); l1.add(new Student("cc",13)); l1.add(new Student("vv",22)); System.out.println(l1);
3.底层原理(简要)
上述存入Student可以重复是因为没有重写hashcode()方法和equals()方法
@Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; Student student = (Student) o; return age == student.age && Objects.equals(name, student.name); } @Override public int hashCode() { return Objects.hash(name, age); }
其中hashset的底层是hashtable(即链表加数组),value的值等于集合的值,然后根据value计算hashcode的值,放入底层数组,同一个位置的元素形成链表,相同的hashcode不会放入
4.TreeSet
1)底层是二叉树(物理结构:跳转结构)
二叉树:首先放入第一个元素到根节点,放入第二个元素与第一个元素比较,大则放在右子节点,小则放在左子节点,放入第三的子节点,与第一个元素比较,大右小左,然后跟左(右)节点对比,大右小左,依次生成子节点。
二叉树特点:唯一,且有序(按照升序),无序(不按照输入顺序输出),也遵循比较自定义数据时需要重写比较方法,内部比较继承Comparatable接口,重写compareto方法,外部比较用Comparator接口,重写compare方法。
//内部比较器 @Override public int compareTo(Student o) { return this.getAge()-o.getAge(); }
//外部比较器 class bijiao implements Comparator<Student> { @Override public int compare(Student o1, Student o2) { return o1.getName().compareTo(o2.getName());