Set集合

Set集合

Set 集合里面存储的是无序的不重复元素,没有索引,可以采用迭代器和增强for来获取元素,Set 常用的子类有 HashSet、LinkedHashSet 集合,可以通过 equals 方法来判断是否为重复元素。

HashSet 集合

HashSet 类实现 Set 接口,由哈希表支持(实际上是一个 HashMap 集合),HashSet 集合不能保证迭代顺序与元素存储顺序相同,采用哈希表结构存储数据结构,保证元素唯一性的方式依赖于:hashCode() 和 equals() 方法。

  • 特点:无序集合,存储和取出的顺序不同,没有索引,不存储重复元素
  • 在代码编写上和 ArrayList 完全一致
  • 存储、取出数据都比较快
  • 线程不安全,运行速度快
  • 底层数据结构为哈希表(链表数组结合体)
public class demo6 {
    public static void main(String[] args) {
        Set<String> S = new HashSet<String>();
        S.add("abc");
        S.add("bcd");
        S.add("cde");
        S.add("abc");       //不会被添加,因为前面有了 "abc" 这个字符串,而Set不存储重复的元素。
        //增强for
        for(String s : S) {
            System.out.println(s);
        }
        System.out.println("=====================");
        //迭代器
        Iterator it = S.iterator();
        while(it.hasNext()) {
            String s = (String)it.next();
            System.out.println(s);
        }
    }
}
保证元素唯一性的方法

HashSet存储字符串的时候,为什么字符串相同的只存储了一个呢?

通过查看源码,我们知道这个方法底层依赖了两个方法:hashCode()和equals()。

步骤:

  • 首先比较哈希值
  • 如果相同,继续比较地址值或者走equals() 方法
  • 如果不同,直接添加到集合中

add方法的具体步骤:

  • 先看hashCode() 值是否相同
    • 相同:继续走equals() 方法
      • 返回true:说明元素重复,就不添加
      • 返回false:说明元素不重复,就添加到集合
    • 不同:直接把元素添加到集合

String 类重写了hashCode()和equals()方法,所以它可以把内容相同的字符串去掉,只留下一个。

使用自定义类对象时,一定要重写hashCode()和equals()方法(使用快捷键 alt + shift + s),否则根本不会进行hashCode()判断!

TreeSet集合

能够对元素按照某种规则进行排序。

排序有两种方式:

  • 自然排序
  • 比较器排序
public class TreeSetDemo {
    public static void main(String[] args) {
        //自然顺序排序
        TreeSet<Integer> t = new TreeSet<Integer>();
        t.add(18);
        t.add(1);
        t.add(28);
        t.add(38);
        t.add(28);
        t.add(8);
        for(Integer i : t) {
            System.out.println(i);
        }
    }
}

打印结果为:

1
8
18
28
38
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值