HashSet 和 TreeSet 区别

本文深入探讨了HashSet、TreeSet及LinkedHashSet的特点与区别,重点分析了它们的数据存储方式、排序特性及性能表现,并通过示例代码展示了不同集合类在实际应用中的行为差异。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

两者本身是接口 Set 的实现类。有 Set 属性 不允许包含相同元素等。

HashSet 特点:
1 . 可以放null 但是只能存在一个null
代码段
HashSet<Object> set = new HashSet<Object>() ;
set.add("3");
set.add("4");
set.add("1");
set.add("2");
set.add(null);
Iterator iterator = set.iterator();
while(iterator.hasNext()){
Object setStr = iterator.next();
System.out.print(setStr+"\t");
}

运行结果
null 1 2 3 4
将HashSet 换成 TreeSet 会报空指针异常的错误

2 . HashSet 不能保证元素的排列顺序,顺序有可能发生变化
3 . 不是同步的

HashSet 存放一个元素时 是通过equals 比较的,同时根据HashCode的值来判断这些元素的位置。

TreeSet 是 SortedSet 接口的实现类 是唯一一个。可以确保集合处于排序状态。支持两种排序 自然排序 和 定制排序。默认是当然是自然排序,也是equals 对两个元素进行比较。通过 CompareTo(Object object)进行大小比较并按照升序排序
说一下 compareTo 这个方法 ,是Comparable 接口中的方法。
上String类实现Comparable中的源码
` public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value;

    int k = 0;
    while (k < lim) {
        char c1 = v1[k];
        char c2 = v2[k];
        if (c1 != c2) {
            return c1 - c2;
        }
        k++;
    }
    return len1 - len2;
}`

比较 基于比较是基于每个字符的Unicode值 如果前者 大于 后者 返回 正数;
如果相等 返回 0;
如果前者小于后者 返回负数。

添加一个LinkedHashSet
LinkedHashSet集合同样是根据元素的hashCode值来决定元素的存储位置,但是它同时使用链表维护元素的次序。这样使得元素看起 来像是以插入顺序保存的,也就是说,当遍历该集合时候,LinkedHashSet将会以元素的添加顺序访问集合的元素。
LinkedHashSet在迭代访问Set中的全部元素时,性能比HashSet好,但是插入时性能稍微逊色于HashSet。

    HashSet<String> hashSet = new LinkedHashSet();
    hashSet.add("1");
    hashSet.add("4");
    hashSet.add("8");
    hashSet.add("2");
    hashSet.add(null);
    Iterator  iterator =  hashSet.iterator();
    while(iterator.hasNext()){
        Object obj = iterator.next();
        System.out.print(obj+"\t");
    }
}

输出 1 4 8 2 null

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值