「JavaDay17」Collection(Set集合)

JavaDay17 Collection(Set集合)

https://github.com/Philbenzy/Java-question-100/tree/main/day17

1-Set集合

(1)Set类的特点

  • Set类中存储的对象元素必须是唯一的
  • Set类不存储对象进入Set的顺序,Set有属于自己的排序方式

(2)Set的子类

  • HashSet
  • TreeSet

2-HashSet

(1)HashSet特点

HashSet中存储的元素可以依照HashSet内的方法保证录入的元素唯一。

(2)HashSet底层?

HashSet的底层是通过哈希表实现的

(3)HashSet何如保证元素唯一性?

// 在HashMap中add方法的相关源码:
int i = indexFor(hash, table.length);
        for (Entry<K,V> e = table[i]; e != null; e = e.next) {
            Object k;
            if (e.hash == hash && ((k = e.key) == key || key.equals(k))) {
                V oldValue = e.value;
                e.value = value;
                e.recordAccess(this);
                return oldValue;
                //走这里其实是没有添加元素
            }
        }

        modCount++;
        addEntry(hash, key, value, i); //把元素添加
        return null;
    }

可以看到,这里的「e.hash == hash && ((k = e.key) == key || key.equals(k)」比较的东西一般有三个(1)hash值比较 「与」((2)地址比较「或」(3)equals比较),条件为真则不添加。

总结:

  • HashSet中需要我们对存储对象进行方法的重写
    • hashCode( )方法
    • equals( )方法

但是不要担心,这两个方法都是可以通过IDE自动生成的,但是我们需要知道HashSet是如何保证集合元素唯一的。

进行的流程:

  • 判断是否Hash值相同?
    • true:执行equals比较
      • true:元素重复,不添加
      • false:添加元素
    • false:添加元素进入集合

3-TreeSet

(1)TreeSet的特点

TreeSet可以保证元素的唯一性,TreeSet有两种构造方法的提供,给我们提供两种不同的方式实现元素排序(同时特保证了唯一性)

(2)TreeSet底层结构

红黑树(自平衡的二叉树),可以保证查找层级不会出现很多而耗费时间。

(3)TreeSet对元素排序的方式(两种)?应该怎么做(两种)?

  • 自然顺序排序
  • 比较器排序

自然顺序排序:

  1. 需要存储类实现comparable接口
  2. 实现compareTo( )方法,需要说明的是:
    1. return 1 表示成为红黑树的右孩子
    2. return -1 表示成为红黑树的左孩子
    3. return 0 表示不录入这个元素,保证元素的唯一性

比较器排序:

  1. 依照特定规则构造一个具体的比较器对象(实现comparator接口,重写compare方法)
  2. 将这个比较器对象传入TreeSet中

注意:一般不将这个比较器对象定义成外部类,使用匿名类进行传递很方便,推荐这样做

4-Collection集合总结

  • Collection
    • List:元素可以重复,保存存入的顺序
      • ArrayList
      • Vector
      • LinkedList
    • Set:元素不可以重复,不保存存入的顺序
      • HashSet
      • TreeSet
      • LinkedHashSet

5-案例演示

(1)HashSet存储字符串并遍历(基本对象)

案例演示:「HashSetStorageString.java」

(2)HashSet存储自定义对象并遍历(对象的成员变量值相同即为同一个元素)

案例演示:「HashSetStorageObject.java」其中使用到了「Person.java」类作为演示

(3)TreeSet集合,获取无重复的随机数

案例演示:「TreeSetWithRandomNumber.java」

在(3)这个例子中,使用到了Integer类型,所以没有在类型中实现接口重写CompareTo方法,或者传入Compartor方法。

(4)学生按照总分从高到底输出

案例演示:「StudentWithComparable.java」

  • Student类继承Comparable接口

(5)学生按照总分从高到底输出

案例演示:「StudentWithComparable.java」

  • TreeSet中传入匿名对象Comparator,完成比较
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值