java学习——Set使用方法以及HashSet和TreeSet的区别
Set为无序集合(无序是指存入元素的先后顺序与输出元素的先后顺序不一致),不允许添加重复元素。Set是个接口,不能直接实例化对象,即Set s=new Set()是错误的。
Set的实现类常用的有:HashSet和TreeSet。
1.HashSet和TreeSet的区别:
(1)HashSet是用哈希表(散列表结构)实现的。
HashSet会调用该对象的hashCode()方法来得到该对象的hashCode值,根据该值来找到对象的存储位置。然后和该位置上所有的元素进行equals比较,如果该位置没有其他元素或者比较的结果都为false就存进去,否则就不存。即元素是按照哈希值来找存储位置,所有无序,而且可以保证无重复元素
注意:若向HashSet中存储自定义对象时,需要重写hashCode()和equals()方法(不重写的话不会报错,但运行结果和想象不一样,见下面代码)。
深入理解HashSet集合对象如何判断数据元素是否重复:
判断待存对象hashCode值是否与集合中已有元素对象hashCode值相同,如果hashCode不同则表示不重复,不用执行equals()方法; 如果相同则再调用equals方法进行检查,equals返回false表示不重复,否则表示重复。
注意:Java中的hashCode值是由对象的地址所确定的,每一个地址对应一个值。Object类中的equals方法中比较的也是对象的地址值。
(2)TreeSet是用二叉树实现的。
TreeSet可以对Set集合中的元素进行排序,TreeSet中数据是自动排好序的。
TreeSet支持两种排序方式,自然排序和定制排序,其中自然排序为默认的排序方式。
若元素自身不具备比较功能,则需要实现Comparator接口,并覆盖其compare方法。
2.Set示例代码(使用HashSet实现)
下面代码中,集合中存放的不是自定义的存储对象,所以不需要重写HashCode()和equals()。
package demo;
import java.util.Date;
import java.util.HashSet;
import java.util.Set;
public class SetTest {
public static void main(String[] args) {
//声明一个Set集合对象sd,里面存放的全是Date类型的对象,
Set<Date> sd;
sd=new HashSet<Date>();
//输出当前的时间,运行结果为1565836065039
System.out.println(new Date().getTime());
//创建几个时间对象
Date a=new Date(1565836065039L);
Date b=new Date(1565835065039L);
Date c=new Date(1565834065039L);
//向集合中添加元素,add()方法返回值为boolean类型,若添加成功,返回true;否则为false
sd.add(a);
sd.add(b);
sd.add(c);
//Set中元素不能重复,从下面b1的值以及遍历的输出结果中可以看出。
boolean b1=sd.add(a);
System.out.