Set集合总结

Set集合

java.util.set接口和java.util.List接口一样,同样继承自collection接口,它与collection接口中的方法基本一致,并没有对Collection接口进行功能上的扩充,只是比Collection接口更加严格了。与List接口不同的是,Set 接口中元素无序,并且都会以某种规则保证存入的元素不出现重复。
Set接口的特点:

  1. 不允许存储重复的元素
  2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历

tips:因为没有索引,所以不能用普通for循环遍历,Set集合取出元素的方式可以采用 :迭代器、增强for。

HashSet集合

java.util.HashSet是Set接口的一个实现类,它所存储的元素是不可重复的,并且元素都是无序的(即存取顺序不一致)。 java.util.HashSet 底层的实现其实是一个java.util.HashMap支持。
HashSet是根据对象的哈希值来确定元素在集合中的存储位置,因此具有良好的存取和查找性能。保证元素唯一性的方式依赖于: hashCode 与equals方法。
HashSet特点:

  1. 不允许存储重复的元素
  2. 没有索引,没有带索引的方法,也不能使用普通的for循环遍历
  3. 是一个无序的集合,存储元素和取出元素的顺序有可能不一致
  4. 底层是一个哈希表结构(查询的速度非常的快)
    常用方法:
boolean add(E e)             如果没有已存在,则将指定的元素添加到该集合中。  
void clear()                 从这个集合中移除所有的元素。  
Object clone()               返回该 HashSet实例浅拷贝:元素本身不是克隆。  
boolean contains(Object o)   如果这套 true返回包含指定的元素。  
boolean isEmpty()            返回 true如果这个集合不包含元素。  
Iterator<E> iterator()       返回此集合中元素的迭代器。  
boolean remove(Object o)     如果当前存在,则从该集合中移除指定的元素。  
int size()                   返回该集合中元素个数(其基数)。  
Spliterator<E> spliterator() 创建一个后期绑定和快速失败 Spliterator在这个集合中的元素。  

set集合常用方法以及遍历方式实践:

import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;
//Set集合常用方法以及遍历方式
public class SetDemo {
    public static void main(String[] args) {
        Set<String> set = new HashSet<>();
        set.add("han");
        set.add("hsz");
        set.add("hhh");
        //判断该集合是否为空
        System.out.println(set.isEmpty());
        //判断该集合是否包含某元素
        System.out.println(set.contains("han"));
        //获取集合中的元素数
        System.out.println(set.size());
        //删除集合中指定位置的元素
        System.out.println(set.remove("hsz"));
        //1、使用增强型for循环遍历\因为set集合没有索引,所以不能使用普通for循环遍历
        for (String s : set) {
            System.out.println(s);
        }
        System.out.println("=================");
        //2、使用迭代器Iterator遍历
        Iterator<String> iterator = set.iterator();
        while (iterator.hasNext()){
            String next = iterator.next();
            System.out.println(next);
        }
    }
}

哈希值:
哈希值:是一个十进制的整数,由系统随机给出(就是对象的地址值,是一个逻辑地址,是模拟出来得到地址,不是数据实际存储的物理地址)在Object类有一个方法,可以获取对象的哈希值
int hashCode() 返回该对象的哈希码值。
hashCode方法的源码:
public native int hashCode();
native:代表该方法调用的是本地操作系统的方法

哈希表:
在JDK1.8之前,哈希表底层采用数组+链表实现,即使用链表处理冲突,同一hash值的链表都存储在一个链表里。但是当位于一个桶中的元素较多,即hash值相等的元素较多时,通过key值依次查找的效率较低。而JDK1.8中 ,哈希表存储采用数组+链表+红黑树实现,当链表长度超过阈值(8)时,将链表转换为红黑树,这样大大减少了查找时间。
在这里插入图片描述
Set集合存储元素不重复的原理:
在这里插入图片描述
HashSet存储自定义类型元素:
set集合报错元素唯一:
存储的元素(String, Integer…student, Person…),必须重写hashCode方法和equals方法

LinkedHashSet集合:

java. util.LinkedHashSet集合extends HashSet集合
LinkedHashSet集合特点:
底层是一个哈希表(数组+链表/红黑树)+链表:多了一条链表(记录元素的存储顺序),保证元素有序

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值