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数据类型有用,对所有的数据类型和类都有效。

猜你喜欢

转载自www.cnblogs.com/hitnmg/p/9350369.html
今日推荐