HashSet与TreeSet的一些使用方法以及异同

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底层数据结构是二叉树(红黑树是一种自平衡的二叉树)
    

同:

 单列集合,元素不可重复
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值