java中的Set接口及实现类

Set接口

1、Set接口基本情况

  • 不一定是有序的,添加元素,与取出元素的顺序不一定一致(没有索引值)
  • 不能有重复元素,所以最多包含一个null值

2、Set集合中的常用方法

方法名返回值作用
add(E e)boolean如果 set 中尚未存在指定的元素,则添加此元素(可选操作)
addAll(Collection<? extends E> c)boolean如果 set 中没有指定 collection 中的所有元素,则将其添加到此 set 中(可选操作)。
clear()void移除此 set 中的所有元素(可选操作)。
contains(Object 0)boolean如果 set 包含指定的元素,则返回 true
containsAll(Colleaction<?> c)boolean如果此 set 包含指定 collection 的所有元素,则返回 true
equals(Object 0)boolean比较指定对象与此 set 的相等性。
hashcode()int返回set的哈希码值
isEmpty()boolean判断该集合是否为空
iterator()Iterator返回在此 set 中的元素上进行迭代的迭代器。
remove(Object o)boolean如果 set 中存在指定的元素,则将其移除(可选操作)。
size()int返回 set 中的元素数(其容量)。
toArray()Object[]返回一个包含 set 中所有元素的数组。

3、遍历元素:

  • 使用迭代器:

    Iterator it = set.iterator();
         while (it.hasNext()) {
             Object next =  it.next();
             System.out.print(next + "  ");    //null  tom  jerry  job  jack
         }
    
  • 使用增强for循环

     for (Object o : set) {
          System.out.print(o + "  ");   //null  tom  jerry  job  jack
     }
    
    
  • 不能使用索引下表来遍历

  • set接口的实现类

    1. 不嫩存放重复元素,只能添加一个null值
    2. set对象存放的元素不一定是有序的,(添加的元素的顺序与取出元素的顺序不一致)

4、Set集合的实现类

(1)、HashSet集合

  • HashSet底层是HashMap

    源码:

    public HashSet() {
    	map = new HashMap<>();
    }
    
  • 可以存放null值,但只能存放一个null值

  • HashSet不保证元素是有序的,取决于hash后,在确定元素索引的位置(及不保证存入的元素的顺序与取出元素的顺序不一致)

  • 不可以有重复元素(重复元素值:基本数据类型:就是栈中存放的值,对于引用数据类型;栈中的地址是一致的,但是注意String:就算你new String(),也不能将相同的字符串介入进去;)所以在很多时候,在自定义的类中,需要重写equals()方法和hashCode方法来自定义两个对象相等的条件

  • HashSet中的方法:

    方法返回值作用
    add()boolean添加元素
    remove()Boolean删除元素
  • HashSet底层结构

    1. HashSet底层是HashMap,hashMap底层是(数组 +链表 + 红黑树

    2. HashMap底层:

      • 添加元素:先得到hash值,将hash值转化为索引值
      • 找到存储数据数据的table(数组)看这个索引位置是否已存放该元素,
      • 如果没有,直接加入
      • 如果有,调用equals比较,如果相同就放弃,如果不相同,则添加到最后,
      • 如果一条链中的元素达到一定的个数,并且table的长度大于等于,就将这个table转化为红黑树;

      hashMap底层

(2)、LinkedhashSet集合

  • LinkedHashSet是HashSet的子类
  • LinkedhashSet底层死一个LinkedHashMap,LinkedHashMapd 底层是 (数组 + 双向建表 + 红黑树) (HashMap底层是【数组 + 单向链表 + 红黑树】)
  • LinkedHashSet根据元素计算元素的hashCode值,来决定元素的存储位置,同时使链表维护元素色次序图,这使得元素开起来是插入存储的
  • LinkedHashSet不允许添加重复元素,,他是有序的,(插入顺序与取出元素的顺序是一致的)
  • 扩容:
    1. 第一次添加:直接将数组table扩容为16,存放的节点类型是LinkedHashMap$Entry类型
    2. 数组HashMap$Node[] 存放的元素是LinkedHashMap¥Entry

(3)、TreeSet结合

  • 底层是treeMap

  • 创建对象时,可以传入比较器:(Comparator()

    TreeSet treeSet = new TreeSet(new Comparator() {
            @Override
            public int compare(Object o1, Object o2) {
            //比较规则
            return ((String)o1).length() - ((String)o2).length();
            }
    });
    
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值