java——set系列集合

Set系列集合特点

  • 无序:存取顺序不一致
  • 不重复:可以去除重复
  • 无索引:没有带索引的方法,所以不能使用普通for循环遍历,也不能通过索引来获取元素

Set集合实现类特点

  • HashSet:无序、不重复、无索引
  • LinkedHashSet:有序,不重复,无索引
  • TreeSet:排序、不重复、无索引
    Set集合的功能上基本上与Collection的API一致
public class SerDemo {
    
    
    public static void main(String[] args) {
    
    
        //HashSet LinkeHashSet TreeSet
        Set<String> sets=new HashSet<>();//经典[Java, MySQL, HTML, SpringBoot]
        //Set<String> sets=new LinkedHashSet<>();//有序 不重复 无索引[MySQL, Java, HTML, SpringBoot]
        sets.add("MySQL");
        sets.add("MySQL");
        sets.add("Java");
        sets.add("Java");
        sets.add("HTML");
        sets.add("HTML");
        sets.add("SpringBoot");
        sets.add("SpringBoot");
        System.out.println(sets);//[Java, MySQL, HTML, SpringBoot]



    }
}


HashSet集合底层采取哈希表存储的数据
在JDK8之前,底层使用数组+链表组成,JDK1.8开始之后,底层采用数组+链表+红黑数组成
哈希值是JDK根据对象的地址,按照某种规则算出来的int类型的数据
HashSet版本数组+链表+(结合哈希算法)

1.8版本开始HashSet原理解析

  • 底层结构:底层结构:哈希表(数组、链表、红黑树的结合体)
  • 当挂在元素下面的数据过多时,查询性能降低,从JDK8开始后,当链表长度超过8的时候,自动转换为红黑树
    在这里插入图片描述
    TreeSet集合默认的规则
  • 对于数组类型:Interger,Double,官方某人按照大小进行升序排序
  • 对于自定义的类型如Student对象,TreeSet无法直接排序
    TreeSet集合存储对象的时候有两种方式可以设计自定义比较规则
    方式一
  • 让自定义的类(如学生类) 实现Comparable接口重写里面的compareTo方法来制定比较规则
public int coparaTo(Apple o){
    
    
	//按照重量进行比较
	return this.weight-o.weight;//去除重量重复的元素
	return this.weight-o.weight>=0?1:-1;//保留重量重复的元素
}

方式二

  • TreeSet集合有参数构造器,可以设计Comparator接口对应的比较器对象,来定制比较规则。
Set<Apple> apples=new TreeSet<>(new Comparator<Apple>()){
    
    
	@override
	public int compare(Apple o1,Apple o2){
    
    
		return o1.getWeight()-o2.getWeight();
		//注意:浮点型建议直接使用Double.compare进行比较
		return Double.compare(o2.getPrice(),o1.getPrice());
	}
}

两种方式中,关于返回值的规则:

  • 如果认为第一个元素大于第二个元素返回正整数即可。
  • 如果认为第一个元素小于第二个元素返回负整数即可。
  • 如果认为第一个元素等于第二个元素放回0即可,此时Treeset集合只会保留一个元素,认为两者重复。
    注意:如果TreeSet集合存储的对象有事先比较贵职责,集合也自带比较器,默认使用集合自带的比较器排序

可变参数

  • 可变参数用在形参中可以接受多个数据
    -可变参数的格式:数据类型…参数名称
    可变参数的作用
  • 传输参数非常灵活,方便。可以不传输参数,可以传输1个或者多个,也可以传输一个数组
  • 可变参数在方法内部本质上就是一个数组
    可变参数的注意事项
  • 1.一个形参列表中可变参数只能有一个
  • 2.可变参数必须放在形参列表的最后面
    案例
    假如需要定义一个方法求和,该方法可以灵活的完成如下需求:
  • 计算1个数据的和
  • 计算2个数据的和
  • 计算3个数据的和
  • 计算n个数据的和,甚至可以支持不接受参数进行调用
public class SetDemo2 {
    
    
    /**
     * 注意:一个形参列表中只能有一个可变参数,可变擦拭农户必须防砸形参列表的后面
     * public static void sum(int...nums,int...nums1)
     * 会报错,因为传参的时候不知道到底传参的时候给哪个参数
     * 但是可以
     * public static void sum(int age,int...nums)
     * 这样就可以把第一个数据传给第一个参数
     */

    public static void main(String[] args) {
    
    
        sum();//1.不传参数
        sum(10);//2.可以传输一个参数
        sum(10,20,30);//3.可以传输多个参数
        sum(new int[]{
    
    10,20,30,40,50});//4.可以传输一个数组
    }
    public static void sum(int...nums){
    
    
        //注意:可变参数在方法内部其实就是一个数组。nums
        int sum=0;
        System.out.println("元素个数:"+nums.length);
        System.out.println("元素内容:"+ Arrays.toString(nums));
        for(int i=0;i<nums.length;i++){
    
    
            sum+=nums[i];
        }
        System.out.println(sum);
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_46362658/article/details/123232368