10.Set接口

本文详细介绍了Java中的Set接口,重点讲解了HashSet的实现原理,包括哈希表结构、哈希冲突处理以及存储元素不重复的判断机制。还提到了LinkedHashSet的特点,它在HashSet基础上保持了元素的插入顺序。最后,文章提及了Java中的可变参数特性及其使用场景。
摘要由CSDN通过智能技术生成

概述

特点 :

  • 没有索引,没有带有索引的方法,也不能使用普通for
  • 不允许存储重复的元素

HashSet实现类

特点:

  1. 不允许存储重复的对象
  2. 没有索引,没有带有索引的方法,也不能使用普通for
  3. 是一个无序的集合,存储和取出顺序可能不一致
  4. 底层是一个哈希表结构(查询速度非常快)
public static void main(String[] args) {

        Set<Integer> set = new HashSet<>();

        set.add(1);
        set.add(2);
        set.add(3);

        //使用迭代器遍历
        Iterator<Integer> itr = set.iterator();
        while(itr.hasNext()){
            Integer i = itr.next();
            System.out.println(i);
        }
        System.out.println("-----------");
        //增强for
        for (Integer n : set) {
            System.out.println(n);
        }
    }

哈希值

是一个十进制的整数,由系统随机给出(对象地址值,是一个逻辑地址)

Object类中有一个方法,可以获取对象的哈希值(HashCode方法)

HashSet存储方式是哈希表

jdk1.8之前 哈希表=数组+链表

jdk1.8之后 哈希表=数组+链表 | 哈希表=数组+红黑树(提高查询速度)

两个元素不同,哈希值相同,称为哈希冲突(重地 和 通话)

链表的长度超过8位 就会转换为红黑树

Set存储元素不重复原理

Set集合再调用add方法时候,add方法会调用元素的hashCode方法和equals方法 判断元素是否重复

例如:set.add(“abc”);

add方法会调用"abc"的hashCode方法。计算字符串的哈希值,哈希值是9354

在集合中找有没有96354这个哈希值元素,表现没有

就会把abc存储到集合中

如果出现哈希冲突 就会调用equals方法进行比较,就认定两元素相同

Set集合保存元素唯一:必须重写hashCode方法和equals方法

LinkedHashSet

底层:哈希表(数组+链表/红黑树)+链表实现,链表(记录元素的存储顺序)保证元素有序

public static void main(String[] args) {
        LinkedHashSet linked = new LinkedHashSet();
        linked.add("a");
        linked.add("b");
        linked.add("c");
        linked.add("c");
        System.out.println(linked);//a b c
    }

可变参数

在JDK1.5之后出现的新特性

使用前提:

  • 当方法的参数列表数据类型已经确定,参数个数不确定,就可以使用

使用格式:定义方法时使用

  • 修饰符 返回值类型 方法名(数据类型…变量名)

原理:

  • 底层是个数组 根据不同个数,创建不同长度数组 来传递值
  • 传递参数个数 可以是0个(不传递) 1,2…多个
  public static void main(String[] args) {
        int i = add(0,1,2,3,4);
        System.out.println(i);//10
    }

    public static int add(int...arr){
        //记录累加
        int sum = 0;
        //遍历数组
        for(int i : arr){
            sum+=i;
        }
        return sum;
    }

注意事项:

  • 一个列表只能有一个可变参数
  • 参数有多个的话,可变参数要在后面
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值