java基础 之 Set接口

Set接口

  • 不包含重复元素的集合。
  • 没有索引,没有带索引的方法,也不能使用for循环遍历。

HashSet类

  • 此类实现Set接口,由哈希表(实际为HashMap实例)支持。查询速度快。
  • 对集合的迭代次序不作任何保证;
  • 特别是,它不能保证订单在一段时间内保持不变。
  • 这个类允许null元素。不能有重复的元素。
public static void main(String[] args) {
        Set<Integer> s =new HashSet<>();
        //使用add()添加元素
        for(int i=1;i<=5;i++){
            s.add(i);
        }
        //使用迭代器遍历
        Iterator<Integer> i= s.iterator();
        while (i.hasNext()){
            Integer ss=i.next();
            System.out.println(ss);
        }
        System.out.println("------------");
        //使用for增强
        for(int j:s){
            System.out.println(j);
        }
    }

HashSet存储自定义类型元素

  • 存储的元素必须重写hashCode()和equals(),建立自己的比较方式,才能保证HashSet集合中的对象唯一。
HashSet<HashSetDemo> hs=new HashSet<>();
        HashSetDemo p1=new HashSetDemo("ltf",18);
        HashSetDemo p2=new HashSetDemo("fjc",18);
        HashSetDemo p3=new HashSetDemo("fjc",18);
        System.out.println(p1.hashCode());
        System.out.println(p2.hashCode());
        System.out.println(p3.hashCode());
        hs.add(p1);
        hs.add(p2);
        hs.add(p3);
        System.out.println(hs);
public class HashSetDemo {
    private String name;
    private int age;

    @Override
    public String toString() {
        return "HashSet{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

    public void HashSet(){

    }
    @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (!(o instanceof HashSetDemo)) return false;
        HashSetDemo hashSet = (HashSetDemo) o;
        return age == hashSet.age &&
                name.equals(hashSet.name);
    }

    @Override
    public int hashCode() {
        return Objects.hash(name, age);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    public HashSetDemo(String name, int age) {
        this.name = name;
        this.age = age;
    }
}

LinkedHashSet

  • 继承了HashSet集合
  • 底层是一个哈希表(数组+链表/红黑树)+链表,多了一条链表,它记录了元素的存储顺序,保证元素有序。
public static void main(String[] args) {
        LinkedHashSet<Integer> set=new LinkedHashSet<>();
        set.add(5);
        set.add(6);
        set.add(4);
        System.out.println(set);
    }
  • 与HashSet不同的是,LinkedHashSet是有序的。

可变参数

格式:
修饰符 返回值类型 方法名(参数类型[] 形参名)
原理:
  • 可变参数底层就是一个数组,根据传递参数的个数不同,会创建不同长度的数组,来存储这些参数传递的参数个数,可以是0(不传递),1,2,3…
public static void main(String[] args) {
        int s=demo(1,2,3,4,5);
        System.out.println(s);
    }
    private static int demo(int...i) {
        int sum=0;
        //用for增强去遍历,做加法。
        for (int j:i) {
            sum+=j;
        }
        return sum;
    }
注意事项
  • 一个方法的参数列表,只能有一个可变参数。
  • 如果方法的参数有多个,那么可变参数必须写在参数列表的末尾。
public static void main(String[] args) {
        int s=demo("100",1,2,3,4,5);
        System.out.println(s);
    }
    private static int demo(String s,int...i) {
        int sum=0;
        System.out.println(s);
        //用for增强去遍历,做加法。
        for (int j:i) {
            sum+=j;
        }
        return sum;
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值