• Collection与Map学习笔记(二)


    今天总结Collection的另一个子接口Set.

    set接口主要要掌握三个实现类:HashSet、LinkedHashSet、TreeSet。

    HashSet特点:

    1.无序性

    2.不能添加重复元素

    3.最多只能有一个空值

    4.不是线程安全

    LinkedHashSet特点:

    1.LinkedHashSet继承于HashSet

    2.可以按照添加顺序排序,其余特性与HashSet相同

    TreeSet特点

    1.不能添加重复元素

    2.最多只能有一个空值

    3.不是线程安全

    3.除了上面三个特点以外,典型的特性在于TreeSet可以自动排序(自然排序),排序调用元素的compareTo()方法

     Set的实现类不可添加重复元素。关于元素是否重复,基本数据类型很好判断。对于自定义类,就比较困难了。利用构造器创建对象,即使所有参数相同,创建的对象也不是重复对象,因为对象的地址不同。

    eg;

    public class MidscStudent {
        private int age;
        private int id;
        private String name;
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "MidscStudent [age=" + age + ", id=" + id + ", name=" + name + "]";
        }
        public MidscStudent(int age, int id, String name) {
            super();
            this.age = age;
            this.id = id;
            this.name = name;
    }

    Set<MidscStudent> mids=new HashSet<MidscStudent>();
    MidscStudent mids1=new MidscStudent(12, 13, "刘备");

    MidscStudent mids1=new MidscStudent(12, 13, "刘备");

    毫无意外,mids1和mids2是两个不同对象。

    但是,我们一般都要把mids1和mids2当做相同对象处理,这样该怎么办?

    处理办法是在自定义类种重写equals方法和hashCode方法。

    public class MidscStudent {
        private int age;
        private int id;
        private String name;
        public int getAge() {
            return age;
        }
        public void setAge(int age) {
            this.age = age;
        }
        public int getId() {
            return id;
        }
        public void setId(int id) {
            this.id = id;
        }
        public String getName() {
            return name;
        }
        public void setName(String name) {
            this.name = name;
        }
        @Override
        public String toString() {
            return "MidscStudent [age=" + age + ", id=" + id + ", name=" + name + "]";
        }
        public MidscStudent(int age, int id, String name) {
            super();
            this.age = age;
            this.id = id;
            this.name = name;
        }
        @Override
        public int hashCode() {
            
            return 1;
        }
        @Override
        public boolean equals(Object obj) {
            if(!(obj instanceof MidscStudent)) {
                return false;
            }
            MidscStudent a=(MidscStudent) obj;
            if(this.age==a.age && this.id==a.id && this.name!=null && this.name.equals(a.name)) {
                return true;
            }else {
                return false;
            }
            
        }
        
    }

    这样一来,mids1和mids2就是相同元素了。

    小知识;

    可变参数:对一下操作,参数的数量不是固定的,是可变动的,程序员不可能针对每种数量的参数分别写一个方法。这时候就可以用可变参数。

    例如求和。我们有两个参数的求和,三个参数求和。

    public int add(int a,int b) {
    int sum=a+b;
    return sum;
    }
    //三个参数相加
    public int add1(int a,int b,int c) {
    int sum=a+b+c;
    return sum;

    如果一个项目要用到多个求和,我们不可能写多个求和方法。这时候我们可以使用可变参数。

    //n个参数相加
    public int add(int... p) {//int.. p就是一个整数数组,int...相当于int[]
    int sum=0;
    for(int i=0;i<p.length;i++) {
    sum=sum+p[i];
    }
    return sum;
    }

    这样主函数里就可以引入一个int[] 数组对象,作为参数,使用该方法。

    当然,可变参数不仅对int数据类型有用,对所有的数据类型和类都有效。

  • 相关阅读:
    xagrs 指定参数位置
    Virtual Machine Kernel Panic : Not Syncing : VFS : Unable To Mount Root FS On Unknown-Block (0,0)
    Laravel Session() 失效的问题
    dirname
    github、git、idea
    ubuntu环境变量在/etc/environment
    ubuntu的PPA
    VMware 增加硬盘ubuntu
    比特币概念
    cpu查询
  • 原文地址:https://www.cnblogs.com/hitnmg/p/9350369.html
Copyright © 2020-2023  润新知